Skip to content

Commit 22c9e51

Browse files
committed
wip
1 parent 227b414 commit 22c9e51

7 files changed

Lines changed: 128 additions & 22 deletions

File tree

.rubocop.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Style/MethodCalledOnDoEndBlock:
5959
Enabled: false
6060

6161
Naming/VariableNumber:
62-
Enabled: false
62+
EnforcedColonStyle: normalcase
6363

6464
Style/StringLiterals:
6565
ConsistentQuotesInMultiline: true

lib/graphql_devise.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
require 'graphql'
33
require 'devise_token_auth'
44

5+
module GraphqlDevise
6+
class Error < StandardError; end
7+
8+
class InvalidMountOptionsError < GraphqlDevise::Error; end
9+
end
10+
511
require 'graphql_devise/concerns/controller_methods'
612
require 'graphql_devise/types/authenticatable_type'
713
require 'graphql_devise/types/credential_type'
@@ -17,11 +23,8 @@
1723
require 'graphql_devise/user_error'
1824
require 'graphql_devise/detailed_user_error'
1925

26+
require 'graphql_devise/mount_method/options_validator'
2027
require 'graphql_devise/rails/queries_preparer'
2128
require 'graphql_devise/rails/mutations_preparer'
2229
require 'graphql_devise/rails/operation_checker'
2330
require 'graphql_devise/rails/operation_sanitizer'
24-
25-
module GraphqlDevise
26-
class Error < StandardError; end
27-
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module GraphqlDevise
2+
module MountMethod
3+
module OptionValidators
4+
class SkipOnlyValidator
5+
def initialize(options: {})
6+
@options = options
7+
end
8+
9+
def validate!
10+
if [@options[:skip], @options[:only]].all?(&:present?)
11+
raise(
12+
GraphqlDevise::InvalidMountOptionsError,
13+
"Can't specify both `skip` and `only` options when mounting the route."
14+
)
15+
end
16+
end
17+
end
18+
end
19+
end
20+
end
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
require_relative 'option_validators/skip_only_validator'
2+
3+
module GraphqlDevise
4+
module MountMethod
5+
class OptionsValidator
6+
def initialize(validators = [])
7+
@validators = validators
8+
end
9+
10+
def validate!
11+
@validators.each(&:validate!)
12+
end
13+
end
14+
end
15+
end

lib/graphql_devise/rails/routes.rb

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,30 @@ class Mapper
1010
:invitations
1111
].freeze
1212

13-
def mount_graphql_devise_for(resource, opts = {})
14-
custom_operations = opts.fetch(:operations, {})
15-
skipped_operations = opts.fetch(:skip, [])
16-
only_operations = opts.fetch(:only, [])
17-
additional_mutations = opts.fetch(:additional_mutations, {})
18-
additional_queries = opts.fetch(:additional_queries, {})
19-
path = opts.fetch(:at, '/graphql_auth')
13+
def mount_graphql_devise_for(resource, options = {})
14+
custom_operations = options.fetch(:operations, {})
15+
skipped_operations = options.fetch(:skip, [])
16+
only_operations = options.fetch(:only, [])
17+
additional_mutations = options.fetch(:additional_mutations, {})
18+
additional_queries = options.fetch(:additional_queries, {})
19+
path = options.fetch(:at, '/graphql_auth')
2020
mapping_name = resource.underscore.tr('/', '_').to_sym
21-
authenticatable_type = opts[:authenticatable_type].presence ||
22-
"Types::#{resource}Type".safe_constantize ||
23-
GraphqlDevise::Types::AuthenticatableType
21+
authenticatable_type = options[:authenticatable_type].presence ||
22+
"Types::#{resource}Type".safe_constantize ||
23+
GraphqlDevise::Types::AuthenticatableType
24+
25+
GraphqlDevise::MountMethod::OptionsValidator.new(
26+
[
27+
GraphqlDevise::MountMethod::OptionValidators::SkipOnlyValidator.new(options: options)
28+
]
29+
).validate!
30+
2431
param_operations = {
2532
custom: custom_operations,
2633
only: only_operations,
2734
skipped: skipped_operations
2835
}
2936

30-
GraphqlDevise::OperationChecker.call(
31-
mutations: GraphqlDevise::DefaultOperations::MUTATIONS,
32-
queries: GraphqlDevise::DefaultOperations::QUERIES,
33-
**param_operations
34-
)
35-
3637
devise_for(
3738
resource.pluralize.underscore.tr('/', '_').to_sym,
3839
module: :devise,
@@ -61,7 +62,7 @@ def mount_graphql_devise_for(resource, opts = {})
6162
end
6263

6364
if (prepared_mutations.present? || additional_mutations.present?) &&
64-
(Gem::Version.new(GraphQL::VERSION) <= Gem::Version.new('1.10.0') || GraphqlDevise::Schema.mutation.nil?)
65+
(Gem::Version.new(GraphQL::VERSION) <= Gem::Version.new('1.10.0') || GraphqlDevise::Schema.mutation.nil?)
6566
GraphqlDevise::Schema.mutation(GraphqlDevise::Types::MutationType)
6667
end
6768

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe GraphqlDevise::MountMethod::OptionValidators::SkipOnlyValidator do
4+
describe '#validate!' do
5+
subject { -> { described_class.new(options: options).validate! } }
6+
7+
context 'when only `only` key is set' do
8+
let(:options) { { only: 'Irrelevant value' } }
9+
10+
it { is_expected.not_to raise_error }
11+
end
12+
13+
context 'when only `skip` key is set' do
14+
let(:options) { { skip: 'Irrelevant value' } }
15+
16+
it { is_expected.not_to raise_error }
17+
end
18+
19+
context 'when `skip` and `only` keys are set' do
20+
let(:options) { { only: 'Irrelevant value', skip: 'irrelevant for specs' } }
21+
22+
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, "Can't specify both `skip` and `only` options when mounting the route.") }
23+
end
24+
25+
context 'when neither `skip` nor `only are set`' do
26+
let(:options) { { irrelevant_option: 'Irrelevant value', another_option: 'irrelevant for specs' } }
27+
28+
it { is_expected.not_to raise_error }
29+
end
30+
end
31+
end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe GraphqlDevise::MountMethod::OptionsValidator do
4+
describe '#validate!' do
5+
subject { -> { described_class.new([validator1, validator2]).validate! } }
6+
7+
let(:validator1) { double(:validator1, 'validate!': nil) }
8+
let(:validator2) { double(:validator2, 'validate!': nil) }
9+
10+
context 'when first validator fails' do
11+
before { allow(validator1).to receive(:validate!).and_raise(GraphqlDevise::InvalidMountOptionsError, 'validator1 error') }
12+
13+
context 'when second validator fails' do
14+
before { allow(validator2).to receive(:validate!).and_raise(GraphqlDevise::InvalidMountOptionsError, 'validator2 error') }
15+
16+
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'validator1 error') }
17+
end
18+
19+
context 'when second validator does not fail' do
20+
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'validator1 error') }
21+
end
22+
end
23+
24+
context 'when first validator does not fail' do
25+
context 'when second validator fails' do
26+
before { allow(validator2).to receive(:validate!).and_raise(GraphqlDevise::InvalidMountOptionsError, 'validator2 error') }
27+
28+
it { is_expected.to raise_error(GraphqlDevise::InvalidMountOptionsError, 'validator2 error') }
29+
end
30+
31+
context 'when second validator does not fail' do
32+
it { is_expected.not_to raise_error }
33+
end
34+
end
35+
end
36+
end

0 commit comments

Comments
 (0)