graphql_devise 0.18.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +7 -2
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +9 -10
  5. data/Appraisals +70 -18
  6. data/CHANGELOG.md +53 -0
  7. data/README.md +71 -142
  8. data/app/controllers/graphql_devise/graphql_controller.rb +3 -3
  9. data/app/views/graphql_devise/mailer/confirmation_instructions.html.erb +1 -5
  10. data/config/routes.rb +0 -2
  11. data/graphql_devise.gemspec +7 -5
  12. data/lib/graphql_devise/concerns/additional_controller_methods.rb +48 -0
  13. data/lib/graphql_devise/concerns/additional_model_methods.rb +17 -0
  14. data/lib/graphql_devise/concerns/authenticatable.rb +1 -1
  15. data/lib/graphql_devise/concerns/controller_methods.rb +70 -93
  16. data/lib/graphql_devise/concerns/field_authentication.rb +14 -0
  17. data/lib/graphql_devise/concerns/set_user_by_token.rb +1 -1
  18. data/lib/graphql_devise/default_operations.rb +16 -0
  19. data/lib/graphql_devise/engine.rb +0 -2
  20. data/lib/graphql_devise/model/with_email_updater.rb +5 -30
  21. data/lib/graphql_devise/mount_method/operation_preparer.rb +0 -7
  22. data/lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb +1 -1
  23. data/lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb +1 -1
  24. data/lib/graphql_devise/mount_method/operation_sanitizer.rb +0 -12
  25. data/lib/graphql_devise/mount_method/option_sanitizer.rb +0 -2
  26. data/lib/graphql_devise/mount_method/option_sanitizers/array_checker.rb +2 -2
  27. data/lib/graphql_devise/mount_method/option_sanitizers/class_checker.rb +2 -2
  28. data/lib/graphql_devise/mount_method/option_sanitizers/hash_checker.rb +1 -1
  29. data/lib/graphql_devise/mount_method/option_sanitizers/string_checker.rb +1 -1
  30. data/lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb +0 -2
  31. data/lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb +1 -1
  32. data/lib/graphql_devise/mount_method/option_validators/supported_operations_validator.rb +1 -1
  33. data/lib/graphql_devise/mount_method/options_validator.rb +0 -3
  34. data/lib/graphql_devise/mount_method/supported_options.rb +0 -5
  35. data/lib/graphql_devise/mutations/base.rb +1 -1
  36. data/lib/graphql_devise/mutations/confirm_registration_with_token.rb +1 -1
  37. data/lib/graphql_devise/mutations/login.rb +1 -1
  38. data/lib/graphql_devise/mutations/register.rb +1 -1
  39. data/lib/graphql_devise/mutations/update_password_with_token.rb +1 -1
  40. data/lib/graphql_devise/resolvers/base.rb +1 -1
  41. data/lib/graphql_devise/resource_loader.rb +71 -39
  42. data/lib/graphql_devise/route_mounter.rb +13 -0
  43. data/lib/graphql_devise/schema_plugin.rb +7 -40
  44. data/lib/graphql_devise/types/authenticatable_type.rb +1 -1
  45. data/lib/graphql_devise/types/base_field.rb +9 -0
  46. data/lib/graphql_devise/types/base_type.rb +8 -0
  47. data/lib/graphql_devise/types/credential_type.rb +1 -1
  48. data/lib/graphql_devise/types/mutation_type.rb +1 -0
  49. data/lib/graphql_devise/types/query_type.rb +1 -0
  50. data/lib/graphql_devise/version.rb +1 -1
  51. data/lib/graphql_devise.rb +21 -29
  52. data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +1 -16
  53. data/spec/dummy/app/graphql/dummy_schema.rb +1 -5
  54. data/spec/dummy/app/graphql/interpreter_schema.rb +6 -2
  55. data/spec/dummy/app/graphql/mutations/base_mutation.rb +6 -0
  56. data/spec/dummy/app/graphql/mutations/update_user.rb +2 -4
  57. data/spec/dummy/app/graphql/types/admin_type.rb +1 -1
  58. data/spec/dummy/app/graphql/types/custom_admin_type.rb +1 -1
  59. data/spec/dummy/app/graphql/types/mutation_type.rb +3 -1
  60. data/spec/dummy/app/graphql/types/query_type.rb +3 -1
  61. data/spec/dummy/app/graphql/types/user_type.rb +1 -1
  62. data/spec/dummy/config/environments/test.rb +1 -1
  63. data/spec/dummy/config/routes.rb +5 -9
  64. data/spec/graphql_devise/model/with_email_updater_spec.rb +17 -35
  65. data/spec/rails_helper.rb +5 -5
  66. data/spec/requests/mutations/resend_confirmation_with_token_spec.rb +2 -3
  67. data/spec/requests/user_controller_spec.rb +1 -33
  68. data/spec/services/resource_loader_spec.rb +14 -3
  69. metadata +55 -48
  70. data/app/controllers/graphql_devise/concerns/additional_controller_methods.rb +0 -72
  71. data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +0 -21
  72. data/app/helpers/graphql_devise/mailer_helper.rb +0 -37
  73. data/app/models/graphql_devise/concerns/additional_model_methods.rb +0 -21
  74. data/app/models/graphql_devise/concerns/model.rb +0 -25
  75. data/lib/graphql_devise/default_operations/mutations.rb +0 -32
  76. data/lib/graphql_devise/default_operations/resolvers.rb +0 -14
  77. data/lib/graphql_devise/mutations/resend_confirmation.rb +0 -45
  78. data/lib/graphql_devise/mutations/send_password_reset.rb +0 -38
  79. data/lib/graphql_devise/mutations/sign_up.rb +0 -61
  80. data/lib/graphql_devise/mutations/update_password.rb +0 -46
  81. data/lib/graphql_devise/rails/routes.rb +0 -15
  82. data/lib/graphql_devise/resolvers/check_password_token.rb +0 -43
  83. data/lib/graphql_devise/resolvers/confirm_account.rb +0 -42
  84. data/spec/dummy/app/graphql/mutations/sign_up.rb +0 -14
  85. data/spec/dummy/app/graphql/resolvers/confirm_admin_account.rb +0 -13
  86. data/spec/requests/mutations/resend_confirmation_spec.rb +0 -153
  87. data/spec/requests/mutations/send_password_reset_spec.rb +0 -103
  88. data/spec/requests/mutations/sign_up_spec.rb +0 -170
  89. data/spec/requests/mutations/update_password_spec.rb +0 -116
  90. data/spec/requests/queries/check_password_token_spec.rb +0 -149
  91. data/spec/requests/queries/confirm_account_spec.rb +0 -137
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe 'Check Password Token Requests' do
6
- include_context 'with graphql query request'
7
-
8
- let(:user) { create(:user, :confirmed) }
9
- let(:redirect_url) { 'https://google.com' }
10
-
11
- context 'when using the user model' do
12
- let(:query) do
13
- <<-GRAPHQL
14
- query {
15
- userCheckPasswordToken(
16
- resetPasswordToken: "#{token}",
17
- redirectUrl: "#{redirect_url}"
18
- ) {
19
- email
20
- }
21
- }
22
- GRAPHQL
23
- end
24
-
25
- context 'when reset password token is valid' do
26
- let(:token) { user.send(:set_reset_password_token) }
27
-
28
- context 'when redirect_url is not provided' do
29
- let(:redirect_url) { nil }
30
-
31
- it 'returns authenticatable and credentials in the headers' do
32
- get_request
33
-
34
- expect(response).to include_auth_headers
35
- expect(json_response[:data][:userCheckPasswordToken]).to match(
36
- email: user.email
37
- )
38
- end
39
- end
40
-
41
- context 'when redirect url is provided' do
42
- it 'redirects to redirect url' do
43
- expect do
44
- get_request
45
-
46
- user.reload
47
- end.to change { user.tokens.keys.count }.from(0).to(1).and(
48
- change(user, :allow_password_change).from(false).to(true)
49
- )
50
-
51
- expect(response).to redirect_to %r{\Ahttps://google.com}
52
- expect(response.body).to include("client=#{user.reload.tokens.keys.first}")
53
- expect(response.body).to include('access-token=')
54
- expect(response.body).to include('uid=')
55
- expect(response.body).to include('expiry=')
56
- end
57
-
58
- context 'when redirect_url is not whitelisted' do
59
- let(:redirect_url) { 'https://not-safe.com' }
60
-
61
- before { post_request }
62
-
63
- it 'returns a not whitelisted redirect url error' do
64
- expect(json_response[:errors]).to containing_exactly(
65
- hash_including(
66
- message: "Redirect to '#{redirect_url}' not allowed.",
67
- extensions: { code: 'USER_ERROR' }
68
- )
69
- )
70
- end
71
- end
72
- end
73
-
74
- context 'when token has expired' do
75
- it 'returns an expired token error' do
76
- travel_to 10.hours.ago do
77
- token
78
- end
79
-
80
- get_request
81
-
82
- expect(json_response[:errors]).to contain_exactly(
83
- hash_including(message: 'Reset password token is no longer valid.', extensions: { code: 'USER_ERROR' })
84
- )
85
- end
86
- end
87
- end
88
-
89
- context 'when reset password token is not found' do
90
- let(:token) { user.send(:set_reset_password_token) + 'invalid' }
91
-
92
- it 'returns an error message' do
93
- get_request
94
-
95
- expect(json_response[:errors]).to contain_exactly(
96
- hash_including(message: 'No user found for the specified reset token.', extensions: { code: 'USER_ERROR' })
97
- )
98
- end
99
- end
100
- end
101
-
102
- context 'when using the admin model' do
103
- let(:token) { 'not_important' }
104
- let(:query) do
105
- <<-GRAPHQL
106
- query {
107
- adminCheckPasswordToken(
108
- resetPasswordToken: "#{token}",
109
- redirectUrl: "#{redirect_url}"
110
- ) {
111
- email
112
- }
113
- }
114
- GRAPHQL
115
- end
116
-
117
- before { post_request }
118
-
119
- it 'skips the sign up mutation' do
120
- expect(json_response[:errors]).to contain_exactly(
121
- hash_including(message: "Field 'adminCheckPasswordToken' doesn't exist on type 'Query'")
122
- )
123
- end
124
- end
125
-
126
- context 'when using the guest model' do
127
- let(:token) { 'not_important' }
128
- let(:query) do
129
- <<-GRAPHQL
130
- query {
131
- guestCheckPasswordToken(
132
- resetPasswordToken: "#{token}",
133
- redirectUrl: "#{redirect_url}"
134
- ) {
135
- email
136
- }
137
- }
138
- GRAPHQL
139
- end
140
-
141
- before { post_request }
142
-
143
- it 'skips the sign up mutation' do
144
- expect(json_response[:errors]).to contain_exactly(
145
- hash_including(message: "Field 'guestCheckPasswordToken' doesn't exist on type 'Query'")
146
- )
147
- end
148
- end
149
- end
@@ -1,137 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe 'Account confirmation' do
6
- include_context 'with graphql query request'
7
-
8
- context 'when using the user model' do
9
- let(:user) { create(:user, confirmed_at: nil) }
10
- let(:redirect) { 'https://google.com' }
11
- let(:query) do
12
- <<-GRAPHQL
13
- {
14
- userConfirmAccount(
15
- confirmationToken: "#{token}"
16
- redirectUrl: "#{redirect}"
17
- ) {
18
- email
19
- name
20
- }
21
- }
22
- GRAPHQL
23
- end
24
-
25
- context 'when confirmation token is correct' do
26
- let(:token) { user.confirmation_token }
27
-
28
- before do
29
- user.send_confirmation_instructions(
30
- template_path: ['graphql_devise/mailer'],
31
- controller: 'graphql_devise/graphql',
32
- schema_url: 'http://not-using-this-value.com/gql'
33
- )
34
- end
35
-
36
- it 'confirms the resource and redirects to the sent url' do
37
- expect do
38
- get_request
39
- user.reload
40
- end.to(change(user, :confirmed_at).from(nil))
41
-
42
- expect(response).to redirect_to("#{redirect}?account_confirmation_success=true")
43
- expect(user).to be_active_for_authentication
44
- end
45
-
46
- context 'when redirect_url is not whitelisted' do
47
- let(:redirect) { 'https://not-safe.com' }
48
-
49
- it 'returns a not whitelisted redirect url error' do
50
- expect { post_request }.to not_change(ActionMailer::Base.deliveries, :count)
51
-
52
- expect(json_response[:errors]).to containing_exactly(
53
- hash_including(
54
- message: "Redirect to '#{redirect}' not allowed.",
55
- extensions: { code: 'USER_ERROR' }
56
- )
57
- )
58
- end
59
- end
60
-
61
- context 'when unconfirmed_email is present' do
62
- let(:user) { create(:user, :confirmed, unconfirmed_email: 'vvega@wallaceinc.com') }
63
-
64
- it 'confirms the unconfirmed email and redirects' do
65
- expect do
66
- get_request
67
- user.reload
68
- end.to change(user, :email).from(user.email).to('vvega@wallaceinc.com').and(
69
- change(user, :unconfirmed_email).from('vvega@wallaceinc.com').to(nil)
70
- )
71
-
72
- expect(response).to redirect_to("#{redirect}?account_confirmation_success=true")
73
- end
74
- end
75
- end
76
-
77
- context 'when reset password token is not found' do
78
- let(:token) { "#{user.confirmation_token}-invalid" }
79
-
80
- it 'does *NOT* confirm the user nor does the redirection' do
81
- expect do
82
- get_request
83
- user.reload
84
- end.not_to(change(user, :confirmed_at).from(nil))
85
-
86
- expect(response).not_to be_redirect
87
- expect(json_response[:errors]).to contain_exactly(
88
- hash_including(
89
- message: 'Invalid confirmation token. Please try again',
90
- extensions: { code: 'USER_ERROR' }
91
- )
92
- )
93
- end
94
- end
95
- end
96
-
97
- context 'when using the admin model' do
98
- let(:admin) { create(:admin, confirmed_at: nil) }
99
- let(:redirect) { 'https://google.com' }
100
- let(:query) do
101
- <<-GRAPHQL
102
- {
103
- adminConfirmAccount(
104
- confirmationToken: "#{token}"
105
- redirectUrl: "#{redirect}"
106
- ) {
107
- email
108
- }
109
- }
110
- GRAPHQL
111
- end
112
-
113
- context 'when confirmation token is correct' do
114
- let(:token) { admin.confirmation_token }
115
-
116
- before do
117
- admin.send_confirmation_instructions(
118
- template_path: ['graphql_devise/mailer'],
119
- controller: 'graphql_devise/graphql',
120
- schema_url: 'http://not-using-this-value.com/gql'
121
- )
122
- end
123
-
124
- it 'confirms the resource, persists credentials on the DB and redirects to the sent url' do
125
- expect do
126
- get_request
127
- admin.reload
128
- end.to change(admin, :confirmed_at).from(nil).and(
129
- change { admin.tokens.keys.count }.from(0).to(1)
130
- )
131
-
132
- expect(response).to redirect_to(/\A#{redirect}.+access\-token=/)
133
- expect(admin).to be_active_for_authentication
134
- end
135
- end
136
- end
137
- end