devise_token_auth 0.1.43 → 1.2.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 (183) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +42 -895
  3. data/Rakefile +11 -4
  4. data/app/controllers/devise_token_auth/application_controller.rb +19 -8
  5. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +26 -12
  6. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +106 -85
  7. data/app/controllers/devise_token_auth/confirmations_controller.rb +73 -17
  8. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +95 -51
  9. data/app/controllers/devise_token_auth/passwords_controller.rb +65 -57
  10. data/app/controllers/devise_token_auth/registrations_controller.rb +61 -61
  11. data/app/controllers/devise_token_auth/sessions_controller.rb +22 -18
  12. data/app/controllers/devise_token_auth/token_validations_controller.rb +5 -3
  13. data/app/controllers/devise_token_auth/unlocks_controller.rb +20 -16
  14. data/app/models/devise_token_auth/concerns/active_record_support.rb +14 -0
  15. data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
  16. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  17. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
  18. data/app/models/devise_token_auth/concerns/user.rb +92 -100
  19. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +8 -3
  20. data/app/validators/{email_validator.rb → devise_token_auth_email_validator.rb} +5 -3
  21. data/app/views/devise_token_auth/omniauth_external_window.html.erb +1 -1
  22. data/config/locales/da-DK.yml +11 -9
  23. data/config/locales/de.yml +2 -0
  24. data/config/locales/en.yml +10 -0
  25. data/config/locales/es.yml +2 -0
  26. data/config/locales/fr.yml +2 -0
  27. data/config/locales/he.yml +52 -0
  28. data/config/locales/it.yml +2 -0
  29. data/config/locales/ja.yml +4 -2
  30. data/config/locales/ko.yml +51 -0
  31. data/config/locales/nl.yml +2 -0
  32. data/config/locales/pl.yml +6 -3
  33. data/config/locales/pt-BR.yml +2 -0
  34. data/config/locales/pt.yml +6 -3
  35. data/config/locales/ro.yml +2 -0
  36. data/config/locales/ru.yml +2 -0
  37. data/config/locales/sq.yml +2 -0
  38. data/config/locales/sv.yml +52 -0
  39. data/config/locales/uk.yml +2 -0
  40. data/config/locales/vi.yml +2 -0
  41. data/config/locales/zh-CN.yml +2 -0
  42. data/config/locales/zh-HK.yml +2 -0
  43. data/config/locales/zh-TW.yml +2 -0
  44. data/lib/devise_token_auth/blacklist.rb +6 -0
  45. data/lib/devise_token_auth/controllers/helpers.rb +21 -13
  46. data/lib/devise_token_auth/controllers/url_helpers.rb +2 -0
  47. data/lib/devise_token_auth/engine.rb +26 -14
  48. data/lib/devise_token_auth/errors.rb +8 -0
  49. data/lib/devise_token_auth/rails/routes.rb +37 -30
  50. data/lib/devise_token_auth/token_factory.rb +126 -0
  51. data/lib/devise_token_auth/url.rb +11 -4
  52. data/lib/devise_token_auth/version.rb +3 -1
  53. data/lib/devise_token_auth.rb +11 -5
  54. data/lib/generators/devise_token_auth/USAGE +2 -2
  55. data/lib/generators/devise_token_auth/install_generator.rb +36 -105
  56. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  57. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  58. data/lib/generators/devise_token_auth/install_views_generator.rb +7 -5
  59. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +12 -0
  60. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +8 -14
  61. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  62. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  63. data/lib/tasks/devise_token_auth_tasks.rake +2 -0
  64. data/test/controllers/custom/custom_confirmations_controller_test.rb +5 -1
  65. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +4 -0
  66. data/test/controllers/custom/custom_passwords_controller_test.rb +6 -2
  67. data/test/controllers/custom/custom_registrations_controller_test.rb +17 -8
  68. data/test/controllers/custom/custom_sessions_controller_test.rb +7 -5
  69. data/test/controllers/custom/custom_token_validations_controller_test.rb +5 -3
  70. data/test/controllers/demo_group_controller_test.rb +4 -6
  71. data/test/controllers/demo_mang_controller_test.rb +3 -3
  72. data/test/controllers/demo_user_controller_test.rb +53 -25
  73. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +159 -25
  74. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +117 -47
  75. data/test/controllers/devise_token_auth/passwords_controller_test.rb +309 -126
  76. data/test/controllers/devise_token_auth/registrations_controller_test.rb +65 -23
  77. data/test/controllers/devise_token_auth/sessions_controller_test.rb +93 -61
  78. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +18 -6
  79. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +24 -5
  80. data/test/controllers/overrides/confirmations_controller_test.rb +6 -2
  81. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +5 -1
  82. data/test/controllers/overrides/passwords_controller_test.rb +27 -29
  83. data/test/controllers/overrides/registrations_controller_test.rb +33 -27
  84. data/test/controllers/overrides/sessions_controller_test.rb +6 -4
  85. data/test/controllers/overrides/token_validations_controller_test.rb +5 -3
  86. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  87. data/test/dummy/app/{models → active_record}/lockable_user.rb +2 -0
  88. data/test/dummy/app/{models → active_record}/mang.rb +2 -0
  89. data/test/dummy/app/{models → active_record}/only_email_user.rb +2 -0
  90. data/test/dummy/app/{models → active_record}/scoped_user.rb +4 -2
  91. data/test/dummy/app/{models → active_record}/unconfirmable_user.rb +3 -2
  92. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  93. data/test/dummy/app/active_record/user.rb +6 -0
  94. data/test/dummy/app/controllers/application_controller.rb +2 -0
  95. data/test/dummy/app/controllers/auth_origin_controller.rb +2 -0
  96. data/test/dummy/app/controllers/custom/confirmations_controller.rb +2 -2
  97. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +2 -0
  98. data/test/dummy/app/controllers/custom/passwords_controller.rb +3 -4
  99. data/test/dummy/app/controllers/custom/registrations_controller.rb +3 -3
  100. data/test/dummy/app/controllers/custom/sessions_controller.rb +3 -3
  101. data/test/dummy/app/controllers/custom/token_validations_controller.rb +3 -3
  102. data/test/dummy/app/controllers/demo_group_controller.rb +2 -0
  103. data/test/dummy/app/controllers/demo_mang_controller.rb +2 -0
  104. data/test/dummy/app/controllers/demo_user_controller.rb +2 -0
  105. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +8 -6
  106. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +5 -3
  107. data/test/dummy/app/controllers/overrides/passwords_controller.rb +10 -8
  108. data/test/dummy/app/controllers/overrides/registrations_controller.rb +5 -3
  109. data/test/dummy/app/controllers/overrides/sessions_controller.rb +12 -12
  110. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +5 -5
  111. data/test/dummy/app/helpers/application_helper.rb +1029 -1036
  112. data/test/dummy/app/models/{user.rb → concerns/favorite_color.rb} +8 -7
  113. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  114. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  115. data/test/dummy/app/mongoid/mang.rb +46 -0
  116. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  117. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  118. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  119. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  120. data/test/dummy/app/mongoid/user.rb +49 -0
  121. data/test/dummy/app/views/layouts/application.html.erb +0 -2
  122. data/test/dummy/config/application.rb +26 -3
  123. data/test/dummy/config/boot.rb +8 -2
  124. data/test/dummy/config/environment.rb +3 -1
  125. data/test/dummy/config/environments/development.rb +5 -13
  126. data/test/dummy/config/environments/production.rb +2 -16
  127. data/test/dummy/config/environments/test.rb +3 -1
  128. data/test/dummy/config/initializers/backtrace_silencers.rb +2 -0
  129. data/test/dummy/config/initializers/cookies_serializer.rb +3 -1
  130. data/test/dummy/config/initializers/devise.rb +287 -0
  131. data/test/dummy/config/initializers/devise_token_auth.rb +37 -4
  132. data/test/dummy/config/initializers/figaro.rb +3 -1
  133. data/test/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  134. data/test/dummy/config/initializers/inflections.rb +2 -0
  135. data/test/dummy/config/initializers/mime_types.rb +2 -0
  136. data/test/dummy/config/initializers/omniauth.rb +5 -2
  137. data/test/dummy/config/initializers/session_store.rb +2 -0
  138. data/test/dummy/config/initializers/wrap_parameters.rb +2 -0
  139. data/test/dummy/config/routes.rb +14 -29
  140. data/test/dummy/config/spring.rb +2 -0
  141. data/test/dummy/config.ru +5 -3
  142. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +9 -14
  143. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +8 -13
  144. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +2 -0
  145. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +2 -0
  146. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +6 -11
  147. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +8 -13
  148. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +8 -13
  149. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +8 -13
  150. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +8 -13
  151. data/test/dummy/{tmp/generators/db/migrate/20171014052631_devise_token_auth_create_users.rb → db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb} +8 -14
  152. data/test/dummy/db/schema.rb +11 -71
  153. data/test/dummy/lib/migration_database_helper.rb +15 -1
  154. data/test/dummy/tmp/generators/app/controllers/application_controller.rb +6 -0
  155. data/test/dummy/tmp/generators/app/models/azpire/v1/human_resource/user.rb +56 -0
  156. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +12 -0
  157. data/test/factories/users.rb +41 -0
  158. data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
  159. data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
  160. data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
  161. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  162. data/test/lib/devise_token_auth/url_test.rb +9 -7
  163. data/test/lib/generators/devise_token_auth/install_generator_test.rb +67 -37
  164. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  165. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +3 -1
  166. data/test/models/concerns/mongoid_support_test.rb +31 -0
  167. data/test/models/concerns/tokens_serialization_test.rb +104 -0
  168. data/test/models/confirmable_user_test.rb +35 -0
  169. data/test/models/only_email_user_test.rb +2 -8
  170. data/test/models/user_test.rb +18 -79
  171. data/test/support/controllers/routes.rb +43 -0
  172. data/test/test_helper.rb +83 -26
  173. metadata +153 -44
  174. data/config/initializers/devise.rb +0 -196
  175. data/lib/generators/devise_token_auth/templates/user.rb +0 -7
  176. data/test/dummy/app/models/evil_user.rb +0 -3
  177. data/test/dummy/app/models/nice_user.rb +0 -7
  178. data/test/dummy/app/models/unregisterable_user.rb +0 -7
  179. data/test/dummy/config/initializers/assets.rb +0 -8
  180. data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +0 -64
  181. data/test/dummy/db/migrate/20150409095712_devise_token_auth_create_nice_users.rb +0 -61
  182. data/test/dummy/tmp/generators/app/models/user.rb +0 -11
  183. data/test/integration/navigation_test.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -10,7 +12,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
10
12
  describe DeviseTokenAuth::PasswordsController do
11
13
  describe 'Password reset' do
12
14
  before do
13
- @resource = users(:confirmed_email_user)
15
+ @resource = create(:user, :confirmed)
14
16
  @redirect_url = 'http://ng-token-auth.dev'
15
17
  end
16
18
 
@@ -39,55 +41,133 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
39
41
  before do
40
42
  @auth_headers = @resource.create_new_auth_token
41
43
  @new_password = Faker::Internet.password
42
-
43
- post :create,
44
- params: { email: 'chester@cheet.ah' }
45
- @data = JSON.parse(response.body)
46
44
  end
47
45
 
48
- test 'response should fail' do
49
- assert_equal 401, response.status
50
- end
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
51
52
 
52
- test 'error message should be returned' do
53
- assert @data['errors']
54
- assert_equal @data['errors'],
55
- [I18n.t('devise_token_auth.passwords.missing_redirect_url')]
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
56
64
  end
57
- end
58
65
 
59
- describe 'request password reset' do
60
- describe 'unknown user should return 404' do
66
+ describe 'for edit' do
61
67
  before do
62
- post :create,
63
- params: { email: 'chester@cheet.ah',
64
- redirect_url: @redirect_url }
68
+ get_reset_token
69
+ get :edit, params: { reset_password_token: @mail_reset_token}
65
70
  @data = JSON.parse(response.body)
66
71
  end
67
72
 
68
- test 'unknown user should return 404' do
69
- assert_equal 404, response.status
73
+ test 'response should fail' do
74
+ assert_equal 401, response.status
70
75
  end
71
76
 
72
- test 'errors should be returned' do
77
+ test 'error message should be returned' do
73
78
  assert @data['errors']
74
- assert_equal @data['errors'],
75
- [I18n.t('devise_token_auth.passwords.user_not_found',
76
- email: 'chester@cheet.ah')]
79
+ assert_equal(
80
+ @data['errors'],
81
+ [I18n.t('devise_token_auth.passwords.missing_redirect_url')]
82
+ )
83
+ end
84
+ end
85
+ end
86
+
87
+ describe 'request password reset' do
88
+ describe 'unknown user' do
89
+ describe 'without paranoid mode' do
90
+ before do
91
+ post :create,
92
+ params: { email: 'chester@cheet.ah',
93
+ redirect_url: @redirect_url }
94
+ @data = JSON.parse(response.body)
95
+ end
96
+
97
+ test 'unknown user should return 404' do
98
+ assert_equal 404, response.status
99
+ end
100
+
101
+ test 'errors should be returned' do
102
+ assert @data['errors']
103
+ assert_equal @data['errors'],
104
+ [I18n.t('devise_token_auth.passwords.user_not_found',
105
+ email: 'chester@cheet.ah')]
106
+ end
107
+ end
108
+
109
+ describe 'with paranoid mode' do
110
+ before do
111
+ swap Devise, paranoid: true do
112
+ post :create,
113
+ params: { email: 'chester@cheet.ah',
114
+ redirect_url: @redirect_url }
115
+ @data = JSON.parse(response.body)
116
+ end
117
+ end
118
+
119
+ test 'unknown user should return 404' do
120
+ assert_equal 404, response.status
121
+ end
122
+
123
+ test 'errors should be returned' do
124
+ assert @data['errors']
125
+ assert_equal @data['errors'],
126
+ [I18n.t('devise_token_auth.passwords.sended_paranoid')]
127
+ end
77
128
  end
78
129
  end
79
130
 
80
131
  describe 'successfully requested password reset' do
81
- before do
82
- post :create,
83
- params: { email: @resource.email,
84
- redirect_url: @redirect_url }
132
+ describe 'without paranoid mode' do
133
+ before do
134
+ post :create,
135
+ params: { email: @resource.email,
136
+ redirect_url: @redirect_url }
85
137
 
86
- @data = JSON.parse(response.body)
138
+ @data = JSON.parse(response.body)
139
+ end
140
+
141
+ test 'response should not contain extra data' do
142
+ assert_nil @data['data']
143
+ end
144
+
145
+ test 'response should contains message' do
146
+ assert_equal \
147
+ @data['message'],
148
+ I18n.t('devise_token_auth.passwords.sended', email: @resource.email)
149
+ end
87
150
  end
88
151
 
89
- test 'response should not contain extra data' do
90
- assert_nil @data['data']
152
+ describe 'with paranoid mode' do
153
+ before do
154
+ swap Devise, paranoid: true do
155
+ post :create,
156
+ params: { email: @resource.email,
157
+ redirect_url: @redirect_url }
158
+ @data = JSON.parse(response.body)
159
+ end
160
+ end
161
+
162
+ test 'response should return success status' do
163
+ assert_equal 200, response.status
164
+ end
165
+
166
+ test 'response should contain message' do
167
+ assert_equal \
168
+ @data['message'],
169
+ I18n.t('devise_token_auth.passwords.sended_paranoid')
170
+ end
91
171
  end
92
172
  end
93
173
 
@@ -111,7 +191,9 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
111
191
  end
112
192
 
113
193
  test 'response should contains message' do
114
- assert_equal @data['message'], I18n.t('devise_token_auth.passwords.sended', email: @resource.email)
194
+ assert_equal \
195
+ @data['message'],
196
+ I18n.t('devise_token_auth.passwords.sended', email: @resource.email)
115
197
  end
116
198
 
117
199
  test 'action should send an email' do
@@ -209,10 +291,10 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
209
291
  end
210
292
  end
211
293
 
212
- describe 'Cheking reset_password_token' do
294
+ describe 'Checking reset_password_token' do
213
295
  before do
214
296
  post :create, params: {
215
- email: @resource.email,
297
+ email: @resource.email,
216
298
  redirect_url: @redirect_url
217
299
  }
218
300
 
@@ -229,14 +311,14 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
229
311
  assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
230
312
  end
231
313
 
232
- test 'reset_password_token should be rewritten by origin mail_reset_token' do
314
+ test 'reset_password_token should not be rewritten by origin mail_reset_token' do
233
315
  get :edit, params: {
234
316
  reset_password_token: @mail_reset_token,
235
317
  redirect_url: @mail_redirect_url
236
318
  }
237
319
  @resource.reload
238
320
 
239
- assert_equal @mail_reset_token, @resource.reset_password_token
321
+ assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
240
322
  end
241
323
 
242
324
  test 'response should return success status' do
@@ -248,26 +330,6 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
248
330
  assert_equal 302, response.status
249
331
  end
250
332
 
251
- test 'reset_password_token should be valid only one first time' do
252
- get :edit, params: {
253
- reset_password_token: @mail_reset_token,
254
- redirect_url: @mail_redirect_url
255
- }
256
-
257
- @resource.reload
258
- assert_equal @mail_reset_token, @resource.reset_password_token
259
-
260
- assert_raises(ActionController::RoutingError) {
261
- get :edit, params: {
262
- reset_password_token: @mail_reset_token,
263
- redirect_url: @mail_redirect_url
264
- }
265
- }
266
-
267
- @resource.reload
268
- assert_equal @mail_reset_token, @resource.reset_password_token
269
- end
270
-
271
333
  test 'reset_password_sent_at should be valid' do
272
334
  assert_equal @resource.reset_password_period_valid?, true
273
335
 
@@ -277,7 +339,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
277
339
  }
278
340
 
279
341
  @resource.reload
280
- assert_equal @mail_reset_token, @resource.reset_password_token
342
+ assert_equal Devise.token_generator.digest(self, :reset_password_token, @mail_reset_token), @resource.reset_password_token
281
343
  end
282
344
 
283
345
  test 'reset_password_sent_at should be expired' do
@@ -314,7 +376,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
314
376
 
315
377
  describe 'Using default_password_reset_url' do
316
378
  before do
317
- @resource = users(:confirmed_email_user)
379
+ @resource = create(:user, :confirmed)
318
380
  @redirect_url = 'http://ng-token-auth.dev'
319
381
 
320
382
  DeviseTokenAuth.default_password_reset_url = @redirect_url
@@ -348,8 +410,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
348
410
 
349
411
  describe 'Using redirect_whitelist' do
350
412
  before do
351
- @resource = users(:confirmed_email_user)
352
- @good_redirect_url = Faker::Internet.url
413
+ @good_redirect_url = @redirect_url
353
414
  @bad_redirect_url = Faker::Internet.url
354
415
  DeviseTokenAuth.redirect_whitelist = [@good_redirect_url]
355
416
  end
@@ -358,31 +419,65 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
358
419
  DeviseTokenAuth.redirect_whitelist = nil
359
420
  end
360
421
 
361
- test 'request to whitelisted redirect should be successful' do
362
- post :create,
363
- params: { email: @resource.email,
364
- redirect_url: @good_redirect_url }
422
+ describe 'for create' do
423
+ test 'request to whitelisted redirect should be successful' do
424
+ post :create,
425
+ params: { email: @resource.email,
426
+ redirect_url: @good_redirect_url }
365
427
 
366
- assert_equal 200, response.status
367
- end
428
+ assert_equal 200, response.status
429
+ end
368
430
 
369
- test 'request to non-whitelisted redirect should fail' do
370
- post :create,
371
- params: { email: @resource.email,
372
- redirect_url: @bad_redirect_url }
431
+ test 'request to non-whitelisted redirect should fail' do
432
+ post :create,
433
+ params: { email: @resource.email,
434
+ redirect_url: @bad_redirect_url }
435
+
436
+ assert_equal 422, response.status
437
+ end
438
+
439
+ test 'request to non-whitelisted redirect should return error message' do
440
+ post :create,
441
+ params: { email: @resource.email,
442
+ redirect_url: @bad_redirect_url }
373
443
 
374
- assert_equal 422, response.status
444
+ @data = JSON.parse(response.body)
445
+ assert @data['errors']
446
+ assert_equal @data['errors'],
447
+ [I18n.t('devise_token_auth.passwords.not_allowed_redirect_url',
448
+ redirect_url: @bad_redirect_url)]
449
+ end
375
450
  end
376
- test 'request to non-whitelisted redirect should return error message' do
377
- post :create,
378
- params: { email: @resource.email,
379
- redirect_url: @bad_redirect_url }
380
451
 
381
- @data = JSON.parse(response.body)
382
- assert @data['errors']
383
- assert_equal @data['errors'],
384
- [I18n.t('devise_token_auth.passwords.not_allowed_redirect_url',
385
- redirect_url: @bad_redirect_url)]
452
+ describe 'for edit' do
453
+ before do
454
+ @auth_headers = @resource.create_new_auth_token
455
+ @new_password = Faker::Internet.password
456
+
457
+ get_reset_token
458
+ end
459
+
460
+ test 'request to whitelisted redirect should be successful' do
461
+ get :edit, params: { reset_password_token: @mail_reset_token, redirect_url: @good_redirect_url }
462
+
463
+ assert_equal 302, response.status
464
+ end
465
+
466
+ test 'request to non-whitelisted redirect should fail' do
467
+ get :edit, params: { reset_password_token: @mail_reset_token, redirect_url: @bad_redirect_url }
468
+
469
+ assert_equal 422, response.status
470
+ end
471
+
472
+ test 'request to non-whitelisted redirect should return error message' do
473
+ get :edit, params: { reset_password_token: @mail_reset_token, redirect_url: @bad_redirect_url }
474
+
475
+ @data = JSON.parse(response.body)
476
+ assert @data['errors']
477
+ assert_equal @data['errors'],
478
+ [I18n.t('devise_token_auth.passwords.not_allowed_redirect_url',
479
+ redirect_url: @bad_redirect_url)]
480
+ end
386
481
  end
387
482
  end
388
483
 
@@ -397,6 +492,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
397
492
 
398
493
  describe 'success' do
399
494
  before do
495
+ DeviseTokenAuth.require_client_password_reset_token = false
400
496
  @auth_headers = @resource.create_new_auth_token
401
497
  request.headers.merge!(@auth_headers)
402
498
  @new_password = Faker::Internet.password
@@ -461,6 +557,7 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
461
557
 
462
558
  describe 'current password mismatch error' do
463
559
  before do
560
+ DeviseTokenAuth.require_client_password_reset_token = false
464
561
  @auth_headers = @resource.create_new_auth_token
465
562
  request.headers.merge!(@auth_headers)
466
563
  @new_password = Faker::Internet.password
@@ -477,7 +574,35 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
477
574
  end
478
575
 
479
576
  describe 'change password' do
480
- describe 'success' do
577
+ describe 'using reset token' do
578
+ before do
579
+ DeviseTokenAuth.require_client_password_reset_token = true
580
+ @redirect_url = 'http://client-app.dev'
581
+ get_reset_token
582
+ edit_url = CGI.unescape(@mail.body.match(/href=\"(.+)\"/)[1])
583
+ query_parts = Rack::Utils.parse_nested_query(URI.parse(edit_url).query)
584
+ get :edit, params: query_parts
585
+ end
586
+
587
+ test 'request should be redirect' do
588
+ assert_equal 302, response.status
589
+ end
590
+
591
+ test 'request should redirect to correct redirect url' do
592
+ host = URI.parse(response.location).host
593
+ query_parts = Rack::Utils.parse_nested_query(URI.parse(response.location).query)
594
+
595
+ assert_equal 'client-app.dev', host
596
+ assert_equal @mail_reset_token, query_parts['reset_password_token']
597
+ assert_equal 1, query_parts.keys.size
598
+ end
599
+
600
+ teardown do
601
+ DeviseTokenAuth.require_client_password_reset_token = false
602
+ end
603
+ end
604
+
605
+ describe 'with valid headers' do
481
606
  before do
482
607
  @auth_headers = @resource.create_new_auth_token
483
608
  request.headers.merge!(@auth_headers)
@@ -503,6 +628,10 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
503
628
  test 'new password should authenticate user' do
504
629
  assert @resource.valid_password?(@new_password)
505
630
  end
631
+
632
+ test 'reset_password_token should be removed' do
633
+ assert_nil @resource.reset_password_token
634
+ end
506
635
  end
507
636
 
508
637
  describe 'password mismatch error' do
@@ -520,19 +649,93 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
520
649
  end
521
650
  end
522
651
 
523
- describe 'unauthorized user' do
652
+ describe 'without valid headers' do
524
653
  before do
525
- @auth_headers = @resource.create_new_auth_token
526
- @new_password = Faker::Internet.password
654
+ @resource.create_new_auth_token
655
+ new_password = Faker::Internet.password
527
656
 
528
- put :update, params: { password: @new_password,
529
- password_confirmation: @new_password }
657
+ put :update, params: { password: new_password,
658
+ password_confirmation: new_password }
530
659
  end
531
660
 
532
661
  test 'response should fail' do
533
662
  assert_equal 401, response.status
534
663
  end
535
664
  end
665
+
666
+ describe 'with valid reset password token' do
667
+ before do
668
+ reset_password_token = @resource.send_reset_password_instructions
669
+ @new_password = Faker::Internet.password
670
+ @params = { password: @new_password,
671
+ password_confirmation: @new_password,
672
+ reset_password_token: reset_password_token }
673
+ end
674
+
675
+ describe 'with require_client_password_reset_token disabled' do
676
+ before do
677
+ DeviseTokenAuth.require_client_password_reset_token = false
678
+ put :update, params: @params
679
+
680
+ @data = JSON.parse(response.body)
681
+ @resource.reload
682
+ end
683
+
684
+ test 'request should be not be successful' do
685
+ assert_equal 401, response.status
686
+ end
687
+ end
688
+
689
+ describe 'with require_client_password_reset_token enabled' do
690
+ before do
691
+ DeviseTokenAuth.require_client_password_reset_token = true
692
+ put :update, params: @params
693
+
694
+ @data = JSON.parse(response.body)
695
+ @resource.reload
696
+ end
697
+
698
+ test 'request should be successful' do
699
+ assert_equal 200, response.status
700
+ end
701
+
702
+ test 'request should return success message' do
703
+ assert @data['message']
704
+ assert_equal @data['message'],
705
+ I18n.t('devise_token_auth.passwords.successfully_updated')
706
+ end
707
+
708
+ test 'new password should authenticate user' do
709
+ assert @resource.valid_password?(@new_password)
710
+ end
711
+
712
+ teardown do
713
+ DeviseTokenAuth.require_client_password_reset_token = false
714
+ end
715
+ end
716
+ end
717
+
718
+ describe 'with invalid reset password token' do
719
+ before do
720
+ DeviseTokenAuth.require_client_password_reset_token = true
721
+ @resource.update reset_password_token: 'koskoskoskos'
722
+ put :update, params: @params
723
+ @data = JSON.parse(response.body)
724
+ @resource.reload
725
+ end
726
+
727
+ test 'request should fail' do
728
+ assert_equal 401, response.status
729
+ end
730
+
731
+ test 'new password should not authenticate user' do
732
+ assert !@resource.valid_password?(@new_password)
733
+ end
734
+
735
+ teardown do
736
+ DeviseTokenAuth.require_client_password_reset_token = false
737
+ end
738
+ end
536
739
  end
537
740
  end
538
741
 
@@ -546,18 +749,9 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
546
749
  end
547
750
 
548
751
  before do
549
- @resource = mangs(:confirmed_email_user)
752
+ @resource = create(:mang_user, :confirmed)
550
753
  @redirect_url = 'http://ng-token-auth.dev'
551
-
552
- post :create, params: { email: @resource.email,
553
- redirect_url: @redirect_url }
554
-
555
- @mail = ActionMailer::Base.deliveries.last
556
- @resource.reload
557
-
558
- @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
559
- @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
560
- @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
754
+ get_reset_token
561
755
  end
562
756
 
563
757
  test 'response should return success status' do
@@ -573,18 +767,10 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
573
767
 
574
768
  describe 'unconfirmed user' do
575
769
  before do
576
- @resource = users(:unconfirmed_email_user)
770
+ @resource = create(:user)
577
771
  @redirect_url = 'http://ng-token-auth.dev'
578
772
 
579
- post :create, params: { email: @resource.email,
580
- redirect_url: @redirect_url }
581
-
582
- @mail = ActionMailer::Base.deliveries.last
583
- @resource.reload
584
-
585
- @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
586
- @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
587
- @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
773
+ get_reset_token
588
774
 
589
775
  get :edit, params: { reset_password_token: @mail_reset_token,
590
776
  redirect_url: @mail_redirect_url }
@@ -604,17 +790,8 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
604
790
 
605
791
  before do
606
792
  @resource = unconfirmable_users(:user)
607
- @redirect_url = 'http://ng-token-auth.dev'
608
-
609
- post :create, params: { email: @resource.email,
610
- redirect_url: @redirect_url }
611
793
 
612
- @mail = ActionMailer::Base.deliveries.last
613
- @resource.reload
614
-
615
- @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
616
- @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
617
- @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
794
+ get_reset_token
618
795
 
619
796
  get :edit, params: { reset_password_token: @mail_reset_token,
620
797
  redirect_url: @mail_redirect_url }
@@ -625,25 +802,31 @@ class DeviseTokenAuth::PasswordsControllerTest < ActionController::TestCase
625
802
 
626
803
  describe 'alternate user type' do
627
804
  before do
628
- @resource = users(:confirmed_email_user)
805
+ @resource = create(:user, :confirmed)
629
806
  @redirect_url = 'http://ng-token-auth.dev'
630
807
  @config_name = 'altUser'
631
808
 
632
- post :create, params: { email: @resource.email,
809
+ params = { email: @resource.email,
633
810
  redirect_url: @redirect_url,
634
811
  config_name: @config_name }
635
-
636
- @mail = ActionMailer::Base.deliveries.last
637
- @resource.reload
638
-
639
- @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
640
- @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
641
- @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
812
+ get_reset_token params
642
813
  end
643
814
 
644
815
  test 'config_name param is included in the confirmation email link' do
645
816
  assert_equal @config_name, @mail_config_name
646
817
  end
647
818
  end
819
+
820
+ def get_reset_token(params = nil)
821
+ params ||= { email: @resource.email, redirect_url: @redirect_url }
822
+ post :create, params: params
823
+
824
+ @mail = ActionMailer::Base.deliveries.last
825
+ @resource.reload
826
+
827
+ @mail_config_name = CGI.unescape(@mail.body.match(/config=([^&]*)&/)[1])
828
+ @mail_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)&/)[1])
829
+ @mail_reset_token = @mail.body.match(/reset_password_token=(.*)\"/)[1]
830
+ end
648
831
  end
649
832
  end