Skip to content

Commit 31cb6d3

Browse files
committed
Change option validator to use sanitized options
1 parent ecd4f48 commit 31cb6d3

5 files changed

Lines changed: 17 additions & 55 deletions

File tree

lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,20 @@ module GraphqlDevise
44
module MountMethod
55
module OptionValidators
66
class ProvidedOperationsValidator
7-
def initialize(options: {}, supported_operations: {})
8-
@options = options || {}
7+
def initialize(options:, supported_operations:)
8+
@options = options
99
@supported_operations = supported_operations
1010
end
1111

1212
def validate!
13-
skipped = @options.fetch(:skip, [])
14-
only = @options.fetch(:only, [])
15-
operations = @options.fetch(:operations, {})
1613
supported_keys = @supported_operations.keys
1714

18-
raise_on_invalid_option_type!(:skip, skipped, Array)
19-
raise_on_invalid_option_type!(:only, only, Array)
20-
raise_on_invalid_option_type!(:operations, operations, Hash)
21-
22-
custom = operations.keys
23-
2415
[
25-
SupportedOperationsValidator.new(provided_operations: skipped, key: :skip, supported_operations: supported_keys),
26-
SupportedOperationsValidator.new(provided_operations: only, key: :only, supported_operations: supported_keys),
27-
SupportedOperationsValidator.new(provided_operations: custom, key: :operations, supported_operations: supported_keys)
16+
SupportedOperationsValidator.new(provided_operations: @options.skip, key: :skip, supported_operations: supported_keys),
17+
SupportedOperationsValidator.new(provided_operations: @options.only, key: :only, supported_operations: supported_keys),
18+
SupportedOperationsValidator.new(provided_operations: @options.operations.keys, key: :operations, supported_operations: supported_keys)
2819
].each(&:validate!)
2920
end
30-
31-
private
32-
33-
def raise_on_invalid_option_type!(key, value, expected_class)
34-
unless value.is_a?(expected_class)
35-
raise(
36-
GraphqlDevise::InvalidMountOptionsError,
37-
"#{key} option contains value of invalid value. Value must be #{expected_class.name}."
38-
)
39-
end
40-
end
4121
end
4222
end
4323
end

lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ module GraphqlDevise
22
module MountMethod
33
module OptionValidators
44
class SkipOnlyValidator
5-
def initialize(options: {})
6-
@options = options || {}
5+
def initialize(options:)
6+
@options = options
77
end
88

99
def validate!
10-
if [@options[:skip], @options[:only]].all?(&:present?)
10+
if [@options.skip, @options.only].all?(&:present?)
1111
raise(
1212
GraphqlDevise::InvalidMountOptionsError,
1313
"Can't specify both `skip` and `only` options when mounting the route."

lib/graphql_devise/rails/routes.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ def mount_graphql_devise_for(resource, options = {})
1616

1717
GraphqlDevise::MountMethod::OptionsValidator.new(
1818
[
19-
GraphqlDevise::MountMethod::OptionValidators::SkipOnlyValidator.new(options: options),
19+
GraphqlDevise::MountMethod::OptionValidators::SkipOnlyValidator.new(options: clean_options),
2020
GraphqlDevise::MountMethod::OptionValidators::ProvidedOperationsValidator.new(
21-
options: options, supported_operations: default_operations
21+
options: clean_options, supported_operations: default_operations
2222
)
2323
]
2424
).validate!

spec/services/mount_method/option_validators/provided_operations_validator_spec.rb

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let(:supported_operations) { { operation1: 'irrelevant', operation2: 'irrelevant', operation3: 'irrelevant' } }
88

99
context 'when skip option is provided' do
10-
let(:provided_operations) { { skip: skipped } }
10+
let(:provided_operations) { double(:clean_options, only: [], skip: skipped, operations: {}) }
1111

1212
context 'when all skipped are supported' do
1313
let(:skipped) { [:operation2, :operation3] }
@@ -20,16 +20,10 @@
2020

2121
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'skip option contains unsupported operations: "invalid". Check for typos.') }
2222
end
23-
24-
context 'when provided skip value is not an array' do
25-
let(:skipped) { 'Invalid value' }
26-
27-
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'skip option contains value of invalid value. Value must be Array.') }
28-
end
2923
end
3024

3125
context 'when only option is provided' do
32-
let(:provided_operations) { { only: only } }
26+
let(:provided_operations) { double(:clean_options, skip: [], only: only, operations: {}) }
3327

3428
context 'when all only are supported' do
3529
let(:only) { [:operation2, :operation3] }
@@ -42,16 +36,10 @@
4236

4337
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'only option contains unsupported operations: "invalid". Check for typos.') }
4438
end
45-
46-
context 'when provided only value is not an array' do
47-
let(:only) { 'Invalid value' }
48-
49-
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'only option contains value of invalid value. Value must be Array.') }
50-
end
5139
end
5240

5341
context 'when operations option is provided' do
54-
let(:provided_operations) { { operations: operations } }
42+
let(:provided_operations) { double(:clean_options, only: [], skip: [], operations: operations) }
5543

5644
context 'when all operations are supported' do
5745
let(:operations) { { operation2: 'irrelevant', operation3: 'irrelevant' } }
@@ -64,12 +52,6 @@
6452

6553
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'operations option contains unsupported operations: "invalid". Check for typos.') }
6654
end
67-
68-
context 'when provided operations value is not a hash' do
69-
let(:operations) { [:one, :two, :three] }
70-
71-
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'operations option contains value of invalid value. Value must be Hash.') }
72-
end
7355
end
7456
end
7557
end

spec/services/mount_method/option_validators/skip_only_validator_spec.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,25 @@
55
subject { -> { described_class.new(options: options).validate! } }
66

77
context 'when only `only` key is set' do
8-
let(:options) { { only: 'Irrelevant value' } }
8+
let(:options) { double(:clean_options, only: [:irrelevant], skip: []) }
99

1010
it { is_expected.not_to raise_error }
1111
end
1212

1313
context 'when only `skip` key is set' do
14-
let(:options) { { skip: 'Irrelevant value' } }
14+
let(:options) { double(:clean_options, skip: [:irrelevant], only: []) }
1515

1616
it { is_expected.not_to raise_error }
1717
end
1818

1919
context 'when `skip` and `only` keys are set' do
20-
let(:options) { { only: 'Irrelevant value', skip: 'irrelevant for specs' } }
20+
let(:options) { double(:clean_options, only: [:irrelevant], skip: [:irrelevant]) }
2121

2222
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, "Can't specify both `skip` and `only` options when mounting the route.") }
2323
end
2424

2525
context 'when neither `skip` nor `only are set`' do
26-
let(:options) { { irrelevant_option: 'Irrelevant value', another_option: 'irrelevant for specs' } }
26+
let(:options) { double(:clean_options, skip: [], only: []) }
2727

2828
it { is_expected.not_to raise_error }
2929
end

0 commit comments

Comments
 (0)