graphql_devise 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/.rspec +1 -0
- data/.travis.yml +36 -18
- data/CHANGELOG.md +56 -0
- data/README.md +274 -35
- data/app/controllers/graphql_devise/application_controller.rb +4 -1
- data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +23 -0
- data/app/controllers/graphql_devise/graphql_controller.rb +2 -0
- data/app/helpers/graphql_devise/mailer_helper.rb +2 -2
- data/config/routes.rb +18 -0
- data/graphql_devise.gemspec +3 -3
- data/lib/generators/graphql_devise/install_generator.rb +63 -30
- data/lib/graphql_devise.rb +32 -0
- data/lib/graphql_devise/concerns/controller_methods.rb +23 -0
- data/lib/graphql_devise/mount_method/operation_preparer.rb +2 -2
- data/lib/graphql_devise/mount_method/operation_preparers/resource_name_setter.rb +1 -1
- data/lib/graphql_devise/mutations/login.rb +4 -1
- data/lib/graphql_devise/mutations/resend_confirmation.rb +4 -1
- data/lib/graphql_devise/mutations/send_password_reset.rb +3 -2
- data/lib/graphql_devise/mutations/sign_up.rb +1 -9
- data/lib/graphql_devise/rails/routes.rb +5 -76
- data/lib/graphql_devise/resource_loader.rb +87 -0
- data/{app/graphql → lib}/graphql_devise/schema.rb +0 -1
- data/lib/graphql_devise/schema_plugin.rb +87 -0
- data/lib/graphql_devise/version.rb +1 -1
- data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +11 -2
- data/spec/dummy/app/controllers/application_controller.rb +1 -0
- data/spec/dummy/app/graphql/dummy_schema.rb +9 -0
- data/spec/dummy/app/graphql/interpreter_schema.rb +9 -0
- data/spec/dummy/app/graphql/types/mutation_type.rb +1 -1
- data/spec/dummy/app/graphql/types/query_type.rb +10 -0
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/generators/graphql_devise/install_generator_spec.rb +62 -30
- data/spec/rails_helper.rb +4 -1
- data/spec/requests/graphql_controller_spec.rb +80 -0
- data/spec/requests/mutations/login_spec.rb +14 -2
- data/spec/requests/mutations/resend_confirmation_spec.rb +24 -9
- data/spec/requests/mutations/send_password_reset_spec.rb +9 -1
- data/spec/requests/mutations/sign_up_spec.rb +10 -0
- data/spec/requests/user_controller_spec.rb +180 -24
- data/spec/services/mount_method/operation_preparer_spec.rb +2 -2
- data/spec/services/mount_method/operation_preparers/custom_operation_preparer_spec.rb +1 -1
- data/spec/services/mount_method/operation_preparers/default_operation_preparer_spec.rb +1 -1
- data/spec/services/mount_method/operation_preparers/resource_name_setter_spec.rb +1 -1
- data/spec/services/resource_loader_spec.rb +82 -0
- data/spec/services/schema_plugin_spec.rb +26 -0
- data/spec/spec_helper.rb +1 -1
- metadata +33 -8
- data/spec/support/generators/file_helpers.rb +0 -12
@@ -6,12 +6,13 @@ RSpec.describe 'Login Requests' do
|
|
6
6
|
let(:password) { '12345678' }
|
7
7
|
|
8
8
|
context 'when using the user model' do
|
9
|
-
let(:user) { create(:user, :confirmed, password: password) }
|
9
|
+
let!(:user) { create(:user, :confirmed, password: password, email: 'vvega@wallaceinc.com') }
|
10
|
+
let(:email) { user.email }
|
10
11
|
let(:query) do
|
11
12
|
<<-GRAPHQL
|
12
13
|
mutation {
|
13
14
|
userLogin(
|
14
|
-
email: "#{
|
15
|
+
email: "#{email}",
|
15
16
|
password: "#{password}"
|
16
17
|
) {
|
17
18
|
user { email name signInCount }
|
@@ -40,6 +41,17 @@ RSpec.describe 'Login Requests' do
|
|
40
41
|
)
|
41
42
|
expect(json_response[:errors]).to be_nil
|
42
43
|
end
|
44
|
+
|
45
|
+
context 'when email address uses different casing' do
|
46
|
+
let(:email) { 'vVeGa@wallaceinc.com' }
|
47
|
+
|
48
|
+
it 'honors devise configuration for case insensitive fields' do
|
49
|
+
expect(response).to include_auth_headers
|
50
|
+
expect(json_response[:data][:userLogin]).to include(
|
51
|
+
user: { email: user.email, name: user.name, signInCount: 1 }
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
43
55
|
end
|
44
56
|
|
45
57
|
context 'when credentials are invalid' do
|
@@ -3,7 +3,7 @@ require 'rails_helper'
|
|
3
3
|
RSpec.describe 'Resend confirmation' do
|
4
4
|
include_context 'with graphql query request'
|
5
5
|
|
6
|
-
let(:user)
|
6
|
+
let!(:user) { create(:user, confirmed_at: nil, email: 'mwallace@wallaceinc.com') }
|
7
7
|
let(:email) { user.email }
|
8
8
|
let(:id) { user.id }
|
9
9
|
let(:redirect) { Faker::Internet.url }
|
@@ -28,20 +28,20 @@ RSpec.describe 'Resend confirmation' do
|
|
28
28
|
it 'sends an email to the user with confirmation url and returns a success message' do
|
29
29
|
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
30
30
|
expect(json_response[:data][:userResendConfirmation]).to include(
|
31
|
+
message: 'You will receive an email with instructions for how to confirm your email address in a few minutes.',
|
31
32
|
authenticatable: {
|
32
|
-
id:
|
33
|
+
id: id,
|
33
34
|
email: email
|
34
|
-
}
|
35
|
-
message: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
35
|
+
}
|
36
36
|
)
|
37
|
-
|
37
|
+
|
38
38
|
email = Nokogiri::HTML(ActionMailer::Base.deliveries.last.body.encoded)
|
39
39
|
link = email.css('a').first
|
40
40
|
confirm_link_msg_text = email.css('p')[1].inner_html
|
41
41
|
confirm_account_link_text = link.inner_html
|
42
42
|
|
43
|
-
expect(confirm_link_msg_text).to eq(
|
44
|
-
expect(confirm_account_link_text).to eq(
|
43
|
+
expect(confirm_link_msg_text).to eq('You can confirm your account email through the link below:')
|
44
|
+
expect(confirm_account_link_text).to eq('Confirm my account')
|
45
45
|
|
46
46
|
# TODO: Move to feature spec
|
47
47
|
expect do
|
@@ -50,6 +50,21 @@ RSpec.describe 'Resend confirmation' do
|
|
50
50
|
end.to change(user, :confirmed_at).from(NilClass).to(ActiveSupport::TimeWithZone)
|
51
51
|
end
|
52
52
|
|
53
|
+
context 'when email address uses different casing' do
|
54
|
+
let(:email) { 'mWallace@wallaceinc.com' }
|
55
|
+
|
56
|
+
it 'honors devise configuration for case insensitive fields' do
|
57
|
+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
58
|
+
expect(json_response[:data][:userResendConfirmation]).to include(
|
59
|
+
message: 'You will receive an email with instructions for how to confirm your email address in a few minutes.',
|
60
|
+
authenticatable: {
|
61
|
+
id: id,
|
62
|
+
email: user.email
|
63
|
+
}
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
53
68
|
context 'when the user has already been confirmed' do
|
54
69
|
before { user.confirm }
|
55
70
|
|
@@ -58,7 +73,7 @@ RSpec.describe 'Resend confirmation' do
|
|
58
73
|
expect(json_response[:data][:userResendConfirmation]).to be_nil
|
59
74
|
expect(json_response[:errors]).to contain_exactly(
|
60
75
|
hash_including(
|
61
|
-
message:
|
76
|
+
message: 'Email was already confirmed, please try signing in',
|
62
77
|
extensions: { code: 'USER_ERROR' }
|
63
78
|
)
|
64
79
|
)
|
@@ -74,7 +89,7 @@ RSpec.describe 'Resend confirmation' do
|
|
74
89
|
expect(json_response[:data][:userResendConfirmation]).to be_nil
|
75
90
|
expect(json_response[:errors]).to contain_exactly(
|
76
91
|
hash_including(
|
77
|
-
message:
|
92
|
+
message: "Unable to find user with email '#{email}'.",
|
78
93
|
extensions: { code: 'USER_ERROR' }
|
79
94
|
)
|
80
95
|
)
|
@@ -3,7 +3,7 @@ require 'rails_helper'
|
|
3
3
|
RSpec.describe 'Send Password Reset Requests' do
|
4
4
|
include_context 'with graphql query request'
|
5
5
|
|
6
|
-
let(:user)
|
6
|
+
let!(:user) { create(:user, :confirmed, email: 'jwinnfield@wallaceinc.com') }
|
7
7
|
let(:email) { user.email }
|
8
8
|
let(:redirect_url) { Faker::Internet.url }
|
9
9
|
let(:query) do
|
@@ -36,6 +36,14 @@ RSpec.describe 'Send Password Reset Requests' do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
context 'when email address uses different casing' do
|
40
|
+
let(:email) { 'jWinnfield@wallaceinc.com' }
|
41
|
+
|
42
|
+
it 'honors devise configuration for case insensitive fields' do
|
43
|
+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
39
47
|
context 'when user email is not found' do
|
40
48
|
let(:email) { 'nothere@gmail.com' }
|
41
49
|
|
@@ -55,6 +55,16 @@ RSpec.describe 'Sign Up process' do
|
|
55
55
|
user.reload
|
56
56
|
end.to change { user.active_for_authentication? }.to(true)
|
57
57
|
end
|
58
|
+
|
59
|
+
context 'when email address uses different casing' do
|
60
|
+
let(:email) { 'miaWallace@wallaceinc.com' }
|
61
|
+
|
62
|
+
it 'honors devise configuration for case insensitive fields' do
|
63
|
+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
64
|
+
expect(User.last.email).to eq('miawallace@wallaceinc.com')
|
65
|
+
expect(json_response[:data][:userSignUp]).to include(user: { email: 'miawallace@wallaceinc.com', name: name })
|
66
|
+
end
|
67
|
+
end
|
58
68
|
end
|
59
69
|
|
60
70
|
context 'when required params are missing' do
|
@@ -1,40 +1,196 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
|
-
RSpec.describe
|
3
|
+
RSpec.describe "Integrations with the user's controller" do
|
4
4
|
include_context 'with graphql query request'
|
5
5
|
|
6
6
|
let(:user) { create(:user, :confirmed) }
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
|
8
|
+
describe 'publicField' do
|
9
|
+
let(:query) do
|
10
|
+
<<-GRAPHQL
|
11
|
+
query {
|
12
|
+
publicField
|
13
|
+
}
|
14
|
+
GRAPHQL
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when using a regular schema' do
|
18
|
+
before { post_request('/api/v1/graphql') }
|
19
|
+
|
20
|
+
it 'does not require authentication' do
|
21
|
+
expect(json_response[:data][:publicField]).to eq('Field does not require authentication')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when using an interpreter schema' do
|
26
|
+
before { post_request('/api/v1/interpreter') }
|
27
|
+
|
28
|
+
it 'does not require authentication' do
|
29
|
+
expect(json_response[:data][:publicField]).to eq('Field does not require authentication')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'privateField' do
|
35
|
+
let(:query) do
|
36
|
+
<<-GRAPHQL
|
37
|
+
query {
|
38
|
+
privateField
|
15
39
|
}
|
16
|
-
|
17
|
-
|
40
|
+
GRAPHQL
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when using a regular schema' do
|
44
|
+
before { post_request('/api/v1/graphql') }
|
45
|
+
|
46
|
+
context 'when user is authenticated' do
|
47
|
+
let(:headers) { user.create_new_auth_token }
|
48
|
+
|
49
|
+
it 'allow to perform the query' do
|
50
|
+
expect(json_response[:data][:privateField]).to eq('Field will always require authentication')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when user is not authenticated' do
|
55
|
+
it 'returns a must sign in error' do
|
56
|
+
expect(json_response[:errors]).to contain_exactly(
|
57
|
+
hash_including(message: 'privateField field requires authentication', extensions: { code: 'USER_ERROR' })
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when using an interpreter schema' do
|
64
|
+
before { post_request('/api/v1/interpreter') }
|
65
|
+
|
66
|
+
context 'when user is authenticated' do
|
67
|
+
let(:headers) { user.create_new_auth_token }
|
68
|
+
|
69
|
+
it 'allow to perform the query' do
|
70
|
+
expect(json_response[:data][:privateField]).to eq('Field will always require authentication')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when user is not authenticated' do
|
75
|
+
it 'returns a must sign in error' do
|
76
|
+
expect(json_response[:errors]).to contain_exactly(
|
77
|
+
hash_including(message: 'privateField field requires authentication', extensions: { code: 'USER_ERROR' })
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
18
82
|
end
|
19
83
|
|
20
|
-
|
84
|
+
describe 'dummyMutation' do
|
85
|
+
let(:query) do
|
86
|
+
<<-GRAPHQL
|
87
|
+
mutation {
|
88
|
+
dummyMutation
|
89
|
+
}
|
90
|
+
GRAPHQL
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'when using a regular schema' do
|
94
|
+
before { post_request('/api/v1/graphql') }
|
95
|
+
|
96
|
+
context 'when user is authenticated' do
|
97
|
+
let(:headers) { user.create_new_auth_token }
|
21
98
|
|
22
|
-
|
23
|
-
|
99
|
+
it 'allow to perform the query' do
|
100
|
+
expect(json_response[:data][:dummyMutation]).to eq('Necessary so GraphQL gem does not complain about empty mutation type')
|
101
|
+
end
|
102
|
+
end
|
24
103
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
104
|
+
context 'when user is not authenticated' do
|
105
|
+
it 'returns a must sign in error' do
|
106
|
+
expect(json_response[:errors]).to contain_exactly(
|
107
|
+
hash_including(message: 'dummyMutation field requires authentication', extensions: { code: 'USER_ERROR' })
|
108
|
+
)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when using an interpreter schema' do
|
114
|
+
before { post_request('/api/v1/interpreter') }
|
115
|
+
|
116
|
+
context 'when user is authenticated' do
|
117
|
+
let(:headers) { user.create_new_auth_token }
|
118
|
+
|
119
|
+
it 'allow to perform the query' do
|
120
|
+
expect(json_response[:data][:dummyMutation]).to eq('Necessary so GraphQL gem does not complain about empty mutation type')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'when user is not authenticated' do
|
125
|
+
it 'returns a must sign in error' do
|
126
|
+
expect(json_response[:errors]).to contain_exactly(
|
127
|
+
hash_including(message: 'dummyMutation field requires authentication', extensions: { code: 'USER_ERROR' })
|
128
|
+
)
|
129
|
+
end
|
130
|
+
end
|
30
131
|
end
|
31
132
|
end
|
32
133
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
134
|
+
describe 'user' do
|
135
|
+
let(:query) do
|
136
|
+
<<-GRAPHQL
|
137
|
+
query {
|
138
|
+
user(
|
139
|
+
id: #{user.id}
|
140
|
+
) {
|
141
|
+
id
|
142
|
+
email
|
143
|
+
}
|
144
|
+
}
|
145
|
+
GRAPHQL
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when using a regular schema' do
|
149
|
+
before { post_request('/api/v1/graphql') }
|
150
|
+
|
151
|
+
context 'when user is authenticated' do
|
152
|
+
let(:headers) { user.create_new_auth_token }
|
153
|
+
|
154
|
+
it 'allow to perform the query' do
|
155
|
+
expect(json_response[:data][:user]).to match(
|
156
|
+
email: user.email,
|
157
|
+
id: user.id
|
158
|
+
)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when user is not authenticated' do
|
163
|
+
it 'returns a must sign in error' do
|
164
|
+
expect(json_response[:errors]).to contain_exactly(
|
165
|
+
hash_including(message: 'user field requires authentication', extensions: { code: 'USER_ERROR' })
|
166
|
+
)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'when using an interpreter schema' do
|
172
|
+
before { post_request('/api/v1/interpreter') }
|
173
|
+
|
174
|
+
context 'when user is authenticated' do
|
175
|
+
let(:headers) { user.create_new_auth_token }
|
176
|
+
|
177
|
+
it 'allow to perform the query' do
|
178
|
+
expect(json_response[:data][:user]).to match(
|
179
|
+
email: user.email,
|
180
|
+
id: user.id
|
181
|
+
)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'when user is not authenticated' do
|
186
|
+
# Interpreter schema fields are public unless specified otherwise (plugin setting)
|
187
|
+
it 'allow to perform the query' do
|
188
|
+
expect(json_response[:data][:user]).to match(
|
189
|
+
email: user.email,
|
190
|
+
id: user.id
|
191
|
+
)
|
192
|
+
end
|
193
|
+
end
|
38
194
|
end
|
39
195
|
end
|
40
196
|
end
|
@@ -4,7 +4,7 @@ RSpec.describe GraphqlDevise::MountMethod::OperationPreparer do
|
|
4
4
|
describe '#call' do
|
5
5
|
subject(:prepared_operations) do
|
6
6
|
described_class.new(
|
7
|
-
|
7
|
+
mapping_name: mapping,
|
8
8
|
selected_operations: selected,
|
9
9
|
preparer: preparer,
|
10
10
|
custom: custom,
|
@@ -13,7 +13,7 @@ RSpec.describe GraphqlDevise::MountMethod::OperationPreparer do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
let(:logout_class) { Class.new(GraphQL::Schema::Resolver) }
|
16
|
-
let(:
|
16
|
+
let(:mapping) { :user }
|
17
17
|
let(:selected) { { login: double(:login_default), logout: logout_class } }
|
18
18
|
let(:preparer) { double(:preparer, call: logout_class) }
|
19
19
|
let(:custom) { { login: double(:custom_login, graphql_name: nil) } }
|
@@ -6,7 +6,7 @@ RSpec.describe GraphqlDevise::MountMethod::OperationPreparers::CustomOperationPr
|
|
6
6
|
|
7
7
|
let(:login_operation) { double(:confirm_operation, graphql_name: nil) }
|
8
8
|
let(:logout_operation) { double(:sign_up_operation, graphql_name: nil) }
|
9
|
-
let(:mapping_name) {
|
9
|
+
let(:mapping_name) { :user }
|
10
10
|
let(:operations) { { login: login_operation, logout: logout_operation, invalid: double(:invalid) } }
|
11
11
|
let(:selected_keys) { [:login, :logout, :sign_up, :confirm] }
|
12
12
|
|
@@ -9,7 +9,7 @@ RSpec.describe GraphqlDevise::MountMethod::OperationPreparers::DefaultOperationP
|
|
9
9
|
let(:sign_up_operation) { double(:sign_up_operation, graphql_name: nil) }
|
10
10
|
let(:login_operation) { double(:confirm_operation, graphql_name: nil) }
|
11
11
|
let(:logout_operation) { double(:sign_up_operation, graphql_name: nil) }
|
12
|
-
let(:mapping_name) {
|
12
|
+
let(:mapping_name) { :user }
|
13
13
|
let(:preparer) { double(:preparer) }
|
14
14
|
let(:operations) { { login: login_operation, logout: logout_operation, sign_up: sign_up_operation, confirm: confirm_operation } }
|
15
15
|
let(:custom_keys) { [:login, :logout] }
|
@@ -5,7 +5,7 @@ RSpec.describe GraphqlDevise::MountMethod::OperationPreparers::ResourceNameSette
|
|
5
5
|
subject(:prepared_operation) { described_class.new(mapping_name).call(operation) }
|
6
6
|
|
7
7
|
let(:operation) { double(:operation) }
|
8
|
-
let(:mapping_name) {
|
8
|
+
let(:mapping_name) { :user }
|
9
9
|
|
10
10
|
it 'sets a gql name to the operation' do
|
11
11
|
expect(prepared_operation.instance_variable_get(:@resource_name)).to eq(:user)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe GraphqlDevise::ResourceLoader do
|
4
|
+
describe '#call' do
|
5
|
+
subject(:loader) { described_class.new(resource, options, routing).call(query, mutation) }
|
6
|
+
|
7
|
+
let(:query) { class_double(GraphQL::Schema::Object) }
|
8
|
+
let(:mutation) { class_double(GraphQL::Schema::Object) }
|
9
|
+
let(:routing) { false }
|
10
|
+
let(:mounted) { false }
|
11
|
+
let(:resource) { 'User' }
|
12
|
+
let(:options) { { only: [:login, :confirm_account] } }
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(GraphqlDevise).to receive(:add_mapping).with(:user, resource)
|
16
|
+
allow(GraphqlDevise).to receive(:resource_mounted?).with(:user).and_return(mounted)
|
17
|
+
allow(GraphqlDevise).to receive(:mount_resource).with(:user)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'loads operations into the provided types' do
|
21
|
+
expect(query).to receive(:field).with(:user_confirm_account, resolver: instance_of(Class), authenticate: false)
|
22
|
+
expect(mutation).to receive(:field).with(:user_login, mutation: instance_of(Class), authenticate: false)
|
23
|
+
expect(GraphqlDevise).to receive(:add_mapping).with(:user, resource)
|
24
|
+
expect(GraphqlDevise).not_to receive(:mount_resource)
|
25
|
+
|
26
|
+
returned = loader
|
27
|
+
|
28
|
+
expect(returned).to be_a(Struct)
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when mutation is nil' do
|
32
|
+
let(:mutation) { nil }
|
33
|
+
|
34
|
+
it 'raises an error' do
|
35
|
+
expect { loader }.to raise_error(
|
36
|
+
GraphqlDevise::Error,
|
37
|
+
'You need to provide a mutation type unless all mutations are skipped'
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when query is nil' do
|
43
|
+
let(:query) { nil }
|
44
|
+
|
45
|
+
before { allow(mutation).to receive(:field) }
|
46
|
+
|
47
|
+
it 'raises an error' do
|
48
|
+
expect { loader }.to raise_error(
|
49
|
+
GraphqlDevise::Error,
|
50
|
+
'You need to provide a query type unless all queries are skipped'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when invoked from router' do
|
56
|
+
let(:routing) { true }
|
57
|
+
|
58
|
+
before do
|
59
|
+
allow(query).to receive(:field)
|
60
|
+
allow(mutation).to receive(:field)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'adds mappings' do
|
64
|
+
expect(GraphqlDevise).to receive(:add_mapping).with(:user, resource)
|
65
|
+
expect(GraphqlDevise).to receive(:mount_resource).with(:user)
|
66
|
+
|
67
|
+
loader
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when resource was already mounted' do
|
71
|
+
before { allow(GraphqlDevise).to receive(:resource_mounted?).with(:user).and_return(true) }
|
72
|
+
|
73
|
+
it 'skips schema loading' do
|
74
|
+
expect(query).not_to receive(:field)
|
75
|
+
expect(mutation).not_to receive(:field)
|
76
|
+
expect(GraphqlDevise).not_to receive(:add_mapping).with(:user, resource)
|
77
|
+
expect(GraphqlDevise).not_to receive(:mount_resource)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|