devise_token_auth_fork_dfabarbosa 1.0.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.
Files changed (164) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +97 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +79 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +44 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +164 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +39 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +239 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +188 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +204 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +131 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +89 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +34 -0
  16. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  17. data/app/models/devise_token_auth/concerns/user.rb +262 -0
  18. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +28 -0
  19. data/app/validators/devise_token_auth/email_validator.rb +23 -0
  20. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  21. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  22. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  23. data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
  24. data/config/locales/da-DK.yml +50 -0
  25. data/config/locales/de.yml +49 -0
  26. data/config/locales/en.yml +50 -0
  27. data/config/locales/es.yml +49 -0
  28. data/config/locales/fr.yml +49 -0
  29. data/config/locales/it.yml +46 -0
  30. data/config/locales/ja.yml +46 -0
  31. data/config/locales/nl.yml +30 -0
  32. data/config/locales/pl.yml +48 -0
  33. data/config/locales/pt-BR.yml +46 -0
  34. data/config/locales/pt.yml +48 -0
  35. data/config/locales/ro.yml +46 -0
  36. data/config/locales/ru.yml +50 -0
  37. data/config/locales/sq.yml +46 -0
  38. data/config/locales/sv.yml +50 -0
  39. data/config/locales/uk.yml +59 -0
  40. data/config/locales/vi.yml +50 -0
  41. data/config/locales/zh-CN.yml +46 -0
  42. data/config/locales/zh-HK.yml +48 -0
  43. data/config/locales/zh-TW.yml +48 -0
  44. data/lib/devise_token_auth.rb +13 -0
  45. data/lib/devise_token_auth/blacklist.rb +2 -0
  46. data/lib/devise_token_auth/controllers/helpers.rb +161 -0
  47. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  48. data/lib/devise_token_auth/engine.rb +90 -0
  49. data/lib/devise_token_auth/errors.rb +8 -0
  50. data/lib/devise_token_auth/rails/routes.rb +116 -0
  51. data/lib/devise_token_auth/url.rb +41 -0
  52. data/lib/devise_token_auth/version.rb +5 -0
  53. data/lib/generators/devise_token_auth/USAGE +31 -0
  54. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  55. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  56. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  57. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  58. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +50 -0
  59. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +56 -0
  60. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  61. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +63 -0
  62. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  63. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  64. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  65. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  66. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  67. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  68. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  69. data/test/controllers/demo_group_controller_test.rb +151 -0
  70. data/test/controllers/demo_mang_controller_test.rb +284 -0
  71. data/test/controllers/demo_user_controller_test.rb +629 -0
  72. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +127 -0
  73. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +376 -0
  74. data/test/controllers/devise_token_auth/passwords_controller_test.rb +666 -0
  75. data/test/controllers/devise_token_auth/registrations_controller_test.rb +907 -0
  76. data/test/controllers/devise_token_auth/sessions_controller_test.rb +541 -0
  77. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +102 -0
  78. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +196 -0
  79. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  80. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  81. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  82. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  83. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  84. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  85. data/test/dummy/README.rdoc +28 -0
  86. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  87. data/test/dummy/app/active_record/mang.rb +5 -0
  88. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  89. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  90. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  91. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  92. data/test/dummy/app/active_record/user.rb +6 -0
  93. data/test/dummy/app/controllers/application_controller.rb +18 -0
  94. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  95. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  96. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  97. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  98. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  99. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  100. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  101. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  102. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  103. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  104. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +28 -0
  105. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  106. data/test/dummy/app/controllers/overrides/passwords_controller.rb +35 -0
  107. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  108. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  109. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  110. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  111. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  112. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  113. data/test/dummy/app/mongoid/mang.rb +53 -0
  114. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  115. data/test/dummy/app/mongoid/scoped_user.rb +57 -0
  116. data/test/dummy/app/mongoid/unconfirmable_user.rb +51 -0
  117. data/test/dummy/app/mongoid/unregisterable_user.rb +54 -0
  118. data/test/dummy/app/mongoid/user.rb +56 -0
  119. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  120. data/test/dummy/config.ru +18 -0
  121. data/test/dummy/config/application.rb +48 -0
  122. data/test/dummy/config/application.yml.bk +0 -0
  123. data/test/dummy/config/boot.rb +11 -0
  124. data/test/dummy/config/environment.rb +7 -0
  125. data/test/dummy/config/environments/development.rb +46 -0
  126. data/test/dummy/config/environments/production.rb +84 -0
  127. data/test/dummy/config/environments/test.rb +50 -0
  128. data/test/dummy/config/initializers/assets.rb +10 -0
  129. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  130. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  131. data/test/dummy/config/initializers/devise.rb +17 -0
  132. data/test/dummy/config/initializers/devise_token_auth.rb +24 -0
  133. data/test/dummy/config/initializers/figaro.rb +3 -0
  134. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  135. data/test/dummy/config/initializers/inflections.rb +18 -0
  136. data/test/dummy/config/initializers/mime_types.rb +6 -0
  137. data/test/dummy/config/initializers/omniauth.rb +10 -0
  138. data/test/dummy/config/initializers/session_store.rb +5 -0
  139. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  140. data/test/dummy/config/routes.rb +55 -0
  141. data/test/dummy/config/spring.rb +3 -0
  142. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +65 -0
  143. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +64 -0
  144. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  145. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  146. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +62 -0
  147. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +63 -0
  148. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +63 -0
  149. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +63 -0
  150. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +63 -0
  151. data/test/dummy/db/schema.rb +200 -0
  152. data/test/dummy/lib/migration_database_helper.rb +43 -0
  153. data/test/factories/users.rb +40 -0
  154. data/test/lib/devise_token_auth/blacklist_test.rb +11 -0
  155. data/test/lib/devise_token_auth/url_test.rb +26 -0
  156. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  157. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  158. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  159. data/test/models/concerns/mongoid_support_test.rb +31 -0
  160. data/test/models/only_email_user_test.rb +37 -0
  161. data/test/models/user_test.rb +140 -0
  162. data/test/support/controllers/routes.rb +43 -0
  163. data/test/test_helper.rb +103 -0
  164. metadata +437 -0
@@ -0,0 +1,666 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ # was the web request successful?
6
+ # was the user redirected to the right page?
7
+ # was the user successfully authenticated?
8
+ # was the correct object stored in the response?
9
+ # was the appropriate message delivered in the json payload?
10
+
11
+ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
12
+ describe DeviseTokenAuth::PasswordsController do
13
+ describe 'Password reset' do
14
+ before do
15
+ @resource = create(:user, :confirmed)
16
+ @redirect_url = 'http://ng-token-auth.dev'
17
+ end
18
+
19
+ describe 'not email should return 401' do
20
+ before do
21
+ @auth_headers = @resource.create_new_auth_token
22
+ @new_password = Faker::Internet.password
23
+
24
+ post :create,
25
+ params: { redirect_url: @redirect_url }
26
+ @data = JSON.parse(response.body)
27
+ end
28
+
29
+ test 'response should fail' do
30
+ assert_equal 401, response.status
31
+ end
32
+
33
+ test 'error message should be returned' do
34
+ assert @data['errors']
35
+ assert_equal @data['errors'],
36
+ [I18n.t('devise_token_auth.passwords.missing_email')]
37
+ end
38
+ end
39
+
40
+ describe 'not redirect_url should return 401' do
41
+ before do
42
+ @auth_headers = @resource.create_new_auth_token
43
+ @new_password = Faker::Internet.password
44
+ end
45
+
46
+ describe 'for create' do
47
+ before do
48
+ post :create,
49
+ params: { email: 'chester@cheet.ah' }
50
+ @data = JSON.parse(response.body)
51
+ end
52
+
53
+ test 'response should fail' do
54
+ assert_equal 401, response.status
55
+ end
56
+
57
+ test 'error message should be returned' do
58
+ assert @data['errors']
59
+ assert_equal(
60
+ @data['errors'],
61
+ [I18n.t('devise_token_auth.passwords.missing_redirect_url')]
62
+ )
63
+ end
64
+ end
65
+
66
+ describe 'for edit' do
67
+ before do
68
+ @auth_headers = @resource.create_new_auth_token
69
+ @new_password = Faker::Internet.password
70
+
71
+ put :edit,
72
+ params: { email: 'chester@cheet.ah' }
73
+ @data = JSON.parse(response.body)
74
+ end
75
+
76
+ test 'response should fail' do
77
+ assert_equal 401, response.status
78
+ end
79
+
80
+ test 'error message should be returned' do
81
+ assert @data['errors']
82
+ assert_equal(
83
+ @data['errors'],
84
+ [I18n.t('devise_token_auth.passwords.missing_redirect_url')]
85
+ )
86
+ end
87
+ end
88
+ end
89
+
90
+ describe 'request password reset' do
91
+ describe 'unknown user should return 404' do
92
+ before do
93
+ post :create,
94
+ params: { email: 'chester@cheet.ah',
95
+ redirect_url: @redirect_url }
96
+ @data = JSON.parse(response.body)
97
+ end
98
+
99
+ test 'unknown user should return 404' do
100
+ assert_equal 404, response.status
101
+ end
102
+
103
+ test 'errors should be returned' do
104
+ assert @data['errors']
105
+ assert_equal @data['errors'],
106
+ [I18n.t('devise_token_auth.passwords.user_not_found',
107
+ email: 'chester@cheet.ah')]
108
+ end
109
+ end
110
+
111
+ describe 'successfully requested password reset' do
112
+ before do
113
+ post :create,
114
+ params: { email: @resource.email,
115
+ redirect_url: @redirect_url }
116
+
117
+ @data = JSON.parse(response.body)
118
+ end
119
+
120
+ test 'response should not contain extra data' do
121
+ assert_nil @data['data']
122
+ end
123
+ end
124
+
125
+ describe 'case-sensitive email' do
126
+ before do
127
+ post :create,
128
+ params: { email: @resource.email,
129
+ redirect_url: @redirect_url }
130
+
131
+ @mail = ActionMailer::Base.deliveries.last
132
+ @resource.reload
133
+ @data = JSON.parse(response.body)
134
+
135
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
136
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
137
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
138
+ end
139
+
140
+ test 'response should return success status' do
141
+ assert_equal 200, response.status
142
+ end
143
+
144
+ test 'response should contains message' do
145
+ assert_equal \
146
+ @data['message'],
147
+ I18n.t('devise_token_auth.passwords.sended', email: @resource.email)
148
+ end
149
+
150
+ test 'action should send an email' do
151
+ assert @mail
152
+ end
153
+
154
+ test 'the email should be addressed to the user' do
155
+ assert_equal @mail.to.first, @resource.email
156
+ end
157
+
158
+ test 'the email body should contain a link with redirect url as a query param' do
159
+ assert_equal @redirect_url, @mail_redirect_url
160
+ end
161
+
162
+ test 'the client config name should fall back to "default"' do
163
+ assert_equal 'default', @mail_config_name
164
+ end
165
+
166
+ test 'the email body should contain a link with reset token as a query param' do
167
+ user = User.reset_password_by_token(reset_password_token: @mail_reset_token)
168
+
169
+ assert_equal user.id, @resource.id
170
+ end
171
+
172
+ describe 'password reset link failure' do
173
+ test 'response should return 404' do
174
+ assert_raises(ActionController::RoutingError) do
175
+ get :edit,
176
+ params: { reset_password_token: 'bogus',
177
+ redirect_url: @mail_redirect_url }
178
+ end
179
+ end
180
+ end
181
+
182
+ describe 'password reset link success' do
183
+ before do
184
+ get :edit,
185
+ params: { reset_password_token: @mail_reset_token,
186
+ redirect_url: @mail_redirect_url }
187
+
188
+ @resource.reload
189
+
190
+ raw_qs = response.location.split('?')[1]
191
+ @qs = Rack::Utils.parse_nested_query(raw_qs)
192
+
193
+ @access_token = @qs['access-token']
194
+ @client_id = @qs['client_id']
195
+ @client = @qs['client']
196
+ @expiry = @qs['expiry']
197
+ @reset_password = @qs['reset_password']
198
+ @token = @qs['token']
199
+ @uid = @qs['uid']
200
+ end
201
+
202
+ test 'response should have success redirect status' do
203
+ assert_equal 302, response.status
204
+ end
205
+
206
+ test 'response should contain auth params' do
207
+ assert @access_token
208
+ assert @client
209
+ assert @client_id
210
+ assert @expiry
211
+ assert @reset_password
212
+ assert @token
213
+ assert @uid
214
+ end
215
+
216
+ test 'response auth params should be valid' do
217
+ assert @resource.valid_token?(@token, @client_id)
218
+ assert @resource.valid_token?(@access_token, @client)
219
+ end
220
+ end
221
+ end
222
+
223
+ describe 'case-insensitive email' do
224
+ before do
225
+ @resource_class = User
226
+ @request_params = {
227
+ email: @resource.email.upcase,
228
+ redirect_url: @redirect_url
229
+ }
230
+ end
231
+
232
+ test 'response should return success status if configured' do
233
+ @resource_class.case_insensitive_keys = [:email]
234
+ post :create, params: @request_params
235
+ assert_equal 200, response.status
236
+ end
237
+
238
+ test 'response should return failure status if not configured' do
239
+ @resource_class.case_insensitive_keys = []
240
+ post :create, params: @request_params
241
+ assert_equal 404, response.status
242
+ end
243
+ end
244
+
245
+ describe 'Cheking reset_password_token' do
246
+ before do
247
+ post :create, params: {
248
+ email: @resource.email,
249
+ redirect_url: @redirect_url
250
+ }
251
+
252
+ @mail = ActionMailer::Base.deliveries.last
253
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
254
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
255
+
256
+ @resource.reload
257
+ end
258
+
259
+ describe 'reset_password_token is valid' do
260
+
261
+ test 'mail_reset_token should be the same as reset_password_token' do
262
+ assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
263
+ end
264
+
265
+ test 'reset_password_token should not be rewritten by origin mail_reset_token' do
266
+ get :edit, params: {
267
+ reset_password_token: @mail_reset_token,
268
+ redirect_url: @mail_redirect_url
269
+ }
270
+ @resource.reload
271
+
272
+ assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
273
+ end
274
+
275
+ test 'response should return success status' do
276
+ get :edit, params: {
277
+ reset_password_token: @mail_reset_token,
278
+ redirect_url: @mail_redirect_url
279
+ }
280
+
281
+ assert_equal 302, response.status
282
+ end
283
+
284
+ test 'reset_password_sent_at should be valid' do
285
+ assert_equal @resource.reset_password_period_valid?, true
286
+
287
+ get :edit, params: {
288
+ reset_password_token: @mail_reset_token,
289
+ redirect_url: @mail_redirect_url
290
+ }
291
+
292
+ @resource.reload
293
+ assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
294
+ end
295
+
296
+ test 'reset_password_sent_at should be expired' do
297
+ assert_equal @resource.reset_password_period_valid?, true
298
+
299
+ @resource.update reset_password_sent_at: @resource.reset_password_sent_at - Devise.reset_password_within - 1.seconds
300
+ assert_equal @resource.reset_password_period_valid?, false
301
+
302
+ assert_raises(ActionController::RoutingError) {
303
+ get :edit, params: {
304
+ reset_password_token: @mail_reset_token,
305
+ redirect_url: @mail_redirect_url
306
+ }
307
+ }
308
+ end
309
+ end
310
+
311
+ describe 'reset_password_token is not valid' do
312
+ test 'response should return error status' do
313
+ @resource.update reset_password_token: 'koskoskoskos'
314
+
315
+ assert_not_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
316
+
317
+ assert_raises(ActionController::RoutingError) {
318
+ get :edit, params: {
319
+ reset_password_token: @mail_reset_token,
320
+ redirect_url: @mail_redirect_url
321
+ }
322
+ }
323
+ end
324
+ end
325
+ end
326
+ end
327
+
328
+ describe 'Using default_password_reset_url' do
329
+ before do
330
+ @resource = create(:user, :confirmed)
331
+ @redirect_url = 'http://ng-token-auth.dev'
332
+
333
+ DeviseTokenAuth.default_password_reset_url = @redirect_url
334
+
335
+ post :create,
336
+ params: { email: @resource.email,
337
+ redirect_url: @redirect_url }
338
+
339
+ @mail = ActionMailer::Base.deliveries.last
340
+ @resource.reload
341
+
342
+ @sent_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
343
+ end
344
+
345
+ teardown do
346
+ DeviseTokenAuth.default_password_reset_url = nil
347
+ end
348
+
349
+ test 'response should return success status' do
350
+ assert_equal 200, response.status
351
+ end
352
+
353
+ test 'action should send an email' do
354
+ assert @mail
355
+ end
356
+
357
+ test 'the email body should contain a link with redirect url as a query param' do
358
+ assert_equal @redirect_url, @sent_redirect_url
359
+ end
360
+ end
361
+
362
+ describe 'Using redirect_whitelist' do
363
+ before do
364
+ @resource = create(:user, :confirmed)
365
+ @good_redirect_url = Faker::Internet.url
366
+ @bad_redirect_url = Faker::Internet.url
367
+ DeviseTokenAuth.redirect_whitelist = [@good_redirect_url]
368
+ end
369
+
370
+ teardown do
371
+ DeviseTokenAuth.redirect_whitelist = nil
372
+ end
373
+
374
+ test 'request to whitelisted redirect should be successful' do
375
+ post :create,
376
+ params: { email: @resource.email,
377
+ redirect_url: @good_redirect_url }
378
+
379
+ assert_equal 200, response.status
380
+ end
381
+
382
+ test 'request to non-whitelisted redirect should fail' do
383
+ post :create,
384
+ params: { email: @resource.email,
385
+ redirect_url: @bad_redirect_url }
386
+
387
+ assert_equal 422, response.status
388
+ end
389
+ test 'request to non-whitelisted redirect should return error message' do
390
+ post :create,
391
+ params: { email: @resource.email,
392
+ redirect_url: @bad_redirect_url }
393
+
394
+ @data = JSON.parse(response.body)
395
+ assert @data['errors']
396
+ assert_equal @data['errors'],
397
+ [I18n.t('devise_token_auth.passwords.not_allowed_redirect_url',
398
+ redirect_url: @bad_redirect_url)]
399
+ end
400
+ end
401
+
402
+ describe 'change password with current password required' do
403
+ before do
404
+ DeviseTokenAuth.check_current_password_before_update = :password
405
+ end
406
+
407
+ after do
408
+ DeviseTokenAuth.check_current_password_before_update = false
409
+ end
410
+
411
+ describe 'success' do
412
+ before do
413
+ @auth_headers = @resource.create_new_auth_token
414
+ request.headers.merge!(@auth_headers)
415
+ @new_password = Faker::Internet.password
416
+ @resource.update password: 'secret123', password_confirmation: 'secret123'
417
+
418
+ put :update,
419
+ params: { password: @new_password,
420
+ password_confirmation: @new_password,
421
+ current_password: 'secret123' }
422
+
423
+ @data = JSON.parse(response.body)
424
+ @resource.reload
425
+ end
426
+
427
+ test 'request should be successful' do
428
+ assert_equal 200, response.status
429
+ end
430
+ end
431
+
432
+ describe 'success with after password reset' do
433
+ before do
434
+ # create a new password reset request
435
+ post :create, params: { email: @resource.email,
436
+ redirect_url: @redirect_url }
437
+
438
+ @mail = ActionMailer::Base.deliveries.last
439
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
440
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
441
+
442
+ # confirm via password reset email link
443
+ get :edit, params: { reset_password_token: @mail_reset_token,
444
+ redirect_url: @mail_redirect_url }
445
+
446
+ @resource.reload
447
+ @allow_password_change_after_reset = @resource.allow_password_change
448
+
449
+ @auth_headers = @resource.create_new_auth_token
450
+ request.headers.merge!(@auth_headers)
451
+ @new_password = Faker::Internet.password
452
+
453
+ put :update, params: { password: @new_password,
454
+ password_confirmation: @new_password }
455
+
456
+ @data = JSON.parse(response.body)
457
+ @resource.reload
458
+ @allow_password_change = @resource.allow_password_change
459
+ @resource.reload
460
+ end
461
+
462
+ test 'request should be successful' do
463
+ assert_equal 200, response.status
464
+ end
465
+
466
+ test 'changes allow_password_change to true on reset' do
467
+ assert_equal true, @allow_password_change_after_reset
468
+ end
469
+
470
+ test 'sets allow_password_change false' do
471
+ assert_equal false, @allow_password_change
472
+ end
473
+ end
474
+
475
+ describe 'current password mismatch error' do
476
+ before do
477
+ @auth_headers = @resource.create_new_auth_token
478
+ request.headers.merge!(@auth_headers)
479
+ @new_password = Faker::Internet.password
480
+
481
+ put :update, params: { password: @new_password,
482
+ password_confirmation: @new_password,
483
+ current_password: 'not_very_secret321' }
484
+ end
485
+
486
+ test 'response should fail unauthorized' do
487
+ assert_equal 422, response.status
488
+ end
489
+ end
490
+ end
491
+
492
+ describe 'change password' do
493
+ describe 'success' do
494
+ before do
495
+ @auth_headers = @resource.create_new_auth_token
496
+ request.headers.merge!(@auth_headers)
497
+ @new_password = Faker::Internet.password
498
+
499
+ put :update, params: { password: @new_password,
500
+ password_confirmation: @new_password }
501
+
502
+ @data = JSON.parse(response.body)
503
+ @resource.reload
504
+ end
505
+
506
+ test 'request should be successful' do
507
+ assert_equal 200, response.status
508
+ end
509
+
510
+ test 'request should return success message' do
511
+ assert @data['message']
512
+ assert_equal @data['message'],
513
+ I18n.t('devise_token_auth.passwords.successfully_updated')
514
+ end
515
+
516
+ test 'new password should authenticate user' do
517
+ assert @resource.valid_password?(@new_password)
518
+ end
519
+
520
+ test 'reset_password_token should be removed' do
521
+ assert_nil @resource.reset_password_token
522
+ end
523
+ end
524
+
525
+ describe 'password mismatch error' do
526
+ before do
527
+ @auth_headers = @resource.create_new_auth_token
528
+ request.headers.merge!(@auth_headers)
529
+ @new_password = Faker::Internet.password
530
+
531
+ put :update, params: { password: 'chong',
532
+ password_confirmation: 'bong' }
533
+ end
534
+
535
+ test 'response should fail' do
536
+ assert_equal 422, response.status
537
+ end
538
+ end
539
+
540
+ describe 'unauthorized user' do
541
+ before do
542
+ @auth_headers = @resource.create_new_auth_token
543
+ @new_password = Faker::Internet.password
544
+
545
+ put :update, params: { password: @new_password,
546
+ password_confirmation: @new_password }
547
+ end
548
+
549
+ test 'response should fail' do
550
+ assert_equal 401, response.status
551
+ end
552
+ end
553
+ end
554
+ end
555
+
556
+ describe 'Alternate user class' do
557
+ setup do
558
+ @request.env['devise.mapping'] = Devise.mappings[:mang]
559
+ end
560
+
561
+ teardown do
562
+ @request.env['devise.mapping'] = Devise.mappings[:user]
563
+ end
564
+
565
+ before do
566
+ @resource = create(:mang_user, :confirmed)
567
+ @redirect_url = 'http://ng-token-auth.dev'
568
+
569
+ post :create, params: { email: @resource.email,
570
+ redirect_url: @redirect_url }
571
+
572
+ @mail = ActionMailer::Base.deliveries.last
573
+ @resource.reload
574
+
575
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
576
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
577
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
578
+ end
579
+
580
+ test 'response should return success status' do
581
+ assert_equal 200, response.status
582
+ end
583
+
584
+ test 'the email body should contain a link with reset token as a query param' do
585
+ user = Mang.reset_password_by_token(reset_password_token: @mail_reset_token)
586
+
587
+ assert_equal user.id, @resource.id
588
+ end
589
+ end
590
+
591
+ describe 'unconfirmed user' do
592
+ before do
593
+ @resource = create(:user)
594
+ @redirect_url = 'http://ng-token-auth.dev'
595
+
596
+ post :create, params: { email: @resource.email,
597
+ redirect_url: @redirect_url }
598
+
599
+ @mail = ActionMailer::Base.deliveries.last
600
+ @resource.reload
601
+
602
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
603
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
604
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
605
+
606
+ get :edit, params: { reset_password_token: @mail_reset_token,
607
+ redirect_url: @mail_redirect_url }
608
+
609
+ @resource.reload
610
+ end
611
+ end
612
+
613
+ describe 'unconfirmable user' do
614
+ setup do
615
+ @request.env['devise.mapping'] = Devise.mappings[:unconfirmable_user]
616
+ end
617
+
618
+ teardown do
619
+ @request.env['devise.mapping'] = Devise.mappings[:user]
620
+ end
621
+
622
+ before do
623
+ @resource = unconfirmable_users(:user)
624
+ @redirect_url = 'http://ng-token-auth.dev'
625
+
626
+ post :create, params: { email: @resource.email,
627
+ redirect_url: @redirect_url }
628
+
629
+ @mail = ActionMailer::Base.deliveries.last
630
+ @resource.reload
631
+
632
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
633
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
634
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
635
+
636
+ get :edit, params: { reset_password_token: @mail_reset_token,
637
+ redirect_url: @mail_redirect_url }
638
+
639
+ @resource.reload
640
+ end
641
+ end
642
+
643
+ describe 'alternate user type' do
644
+ before do
645
+ @resource = create(:user, :confirmed)
646
+ @redirect_url = 'http://ng-token-auth.dev'
647
+ @config_name = 'altUser'
648
+
649
+ post :create, params: { email: @resource.email,
650
+ redirect_url: @redirect_url,
651
+ config_name: @config_name }
652
+
653
+ @mail = ActionMailer::Base.deliveries.last
654
+ @resource.reload
655
+
656
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
657
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
658
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
659
+ end
660
+
661
+ test 'config_name param is included in the confirmation email link' do
662
+ assert_equal @config_name, @mail_config_name
663
+ end
664
+ end
665
+ end
666
+ end