devise_token_auth_multi_email 0.9.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 +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 +100 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
  16. data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
  17. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
  19. data/app/models/devise_token_auth/concerns/user.rb +282 -0
  20. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
  21. data/app/validators/devise_token_auth_email_validator.rb +31 -0
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  23. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  24. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  25. data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
  26. data/config/locales/da-DK.yml +52 -0
  27. data/config/locales/de.yml +51 -0
  28. data/config/locales/en.yml +60 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fa.yml +60 -0
  31. data/config/locales/fr.yml +51 -0
  32. data/config/locales/he.yml +52 -0
  33. data/config/locales/it.yml +48 -0
  34. data/config/locales/ja.yml +60 -0
  35. data/config/locales/ko.yml +51 -0
  36. data/config/locales/nl.yml +32 -0
  37. data/config/locales/pl.yml +51 -0
  38. data/config/locales/pt-BR.yml +48 -0
  39. data/config/locales/pt.yml +51 -0
  40. data/config/locales/ro.yml +48 -0
  41. data/config/locales/ru.yml +52 -0
  42. data/config/locales/sq.yml +48 -0
  43. data/config/locales/sv.yml +52 -0
  44. data/config/locales/uk.yml +61 -0
  45. data/config/locales/vi.yml +52 -0
  46. data/config/locales/zh-CN.yml +48 -0
  47. data/config/locales/zh-HK.yml +50 -0
  48. data/config/locales/zh-TW.yml +50 -0
  49. data/lib/devise_token_auth/blacklist.rb +6 -0
  50. data/lib/devise_token_auth/controllers/helpers.rb +157 -0
  51. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_token_auth/engine.rb +105 -0
  53. data/lib/devise_token_auth/errors.rb +8 -0
  54. data/lib/devise_token_auth/rails/routes.rb +122 -0
  55. data/lib/devise_token_auth/token_factory.rb +126 -0
  56. data/lib/devise_token_auth/url.rb +44 -0
  57. data/lib/devise_token_auth/version.rb +5 -0
  58. data/lib/devise_token_auth.rb +14 -0
  59. data/lib/generators/devise_token_auth/USAGE +31 -0
  60. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  61. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  62. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  63. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  64. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
  65. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
  66. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  67. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  68. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  69. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  70. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  71. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  72. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  73. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  74. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  75. data/test/controllers/demo_group_controller_test.rb +151 -0
  76. data/test/controllers/demo_mang_controller_test.rb +313 -0
  77. data/test/controllers/demo_user_controller_test.rb +658 -0
  78. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
  79. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
  80. data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
  81. data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
  82. data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
  83. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
  84. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
  85. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  86. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  87. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  88. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  89. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  90. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  91. data/test/dummy/README.rdoc +28 -0
  92. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  93. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  94. data/test/dummy/app/active_record/mang.rb +5 -0
  95. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  96. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  97. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  98. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  99. data/test/dummy/app/active_record/user.rb +6 -0
  100. data/test/dummy/app/controllers/application_controller.rb +14 -0
  101. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  102. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  104. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  105. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  106. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  107. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  108. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  109. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  110. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  111. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
  112. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  113. data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
  114. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  115. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  116. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  117. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  118. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  119. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  120. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  121. data/test/dummy/app/mongoid/mang.rb +46 -0
  122. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  123. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  124. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  125. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  126. data/test/dummy/app/mongoid/user.rb +49 -0
  127. data/test/dummy/app/views/layouts/application.html.erb +12 -0
  128. data/test/dummy/config/application.rb +50 -0
  129. data/test/dummy/config/application.yml.bk +0 -0
  130. data/test/dummy/config/boot.rb +11 -0
  131. data/test/dummy/config/environment.rb +7 -0
  132. data/test/dummy/config/environments/development.rb +36 -0
  133. data/test/dummy/config/environments/production.rb +68 -0
  134. data/test/dummy/config/environments/test.rb +58 -0
  135. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  136. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  137. data/test/dummy/config/initializers/devise.rb +290 -0
  138. data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
  139. data/test/dummy/config/initializers/figaro.rb +3 -0
  140. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  141. data/test/dummy/config/initializers/inflections.rb +18 -0
  142. data/test/dummy/config/initializers/mime_types.rb +6 -0
  143. data/test/dummy/config/initializers/omniauth.rb +11 -0
  144. data/test/dummy/config/initializers/session_store.rb +5 -0
  145. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  146. data/test/dummy/config/routes.rb +57 -0
  147. data/test/dummy/config/spring.rb +3 -0
  148. data/test/dummy/config.ru +18 -0
  149. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
  150. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
  151. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  152. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  153. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
  154. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
  155. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
  156. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
  157. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
  158. data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
  159. data/test/dummy/db/schema.rb +198 -0
  160. data/test/dummy/lib/migration_database_helper.rb +43 -0
  161. data/test/dummy/tmp/generators/app/models/mang.rb +9 -0
  162. data/test/dummy/tmp/generators/app/models/user.rb +9 -0
  163. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
  164. data/test/dummy/tmp/generators/config/routes.rb +9 -0
  165. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
  166. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
  167. data/test/factories/users.rb +41 -0
  168. data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
  169. data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
  170. data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
  171. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  172. data/test/lib/devise_token_auth/url_test.rb +26 -0
  173. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  174. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  175. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  176. data/test/models/concerns/mongoid_support_test.rb +31 -0
  177. data/test/models/concerns/tokens_serialization_test.rb +104 -0
  178. data/test/models/confirmable_user_test.rb +35 -0
  179. data/test/models/only_email_user_test.rb +29 -0
  180. data/test/models/user_test.rb +224 -0
  181. data/test/support/controllers/routes.rb +43 -0
  182. data/test/test_helper.rb +134 -0
  183. metadata +502 -0
@@ -0,0 +1,605 @@
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::SessionsControllerTest < ActionController::TestCase
12
+ describe DeviseTokenAuth::SessionsController do
13
+ describe 'Confirmed user' do
14
+ before do
15
+ @existing_user = create(:user, :with_nickname, :confirmed)
16
+ end
17
+
18
+ describe 'success' do
19
+ before do
20
+ @user_session_params = {
21
+ email: @existing_user.email,
22
+ password: @existing_user.password
23
+ }
24
+
25
+ post :create, params: @user_session_params
26
+
27
+ @resource = assigns(:resource)
28
+ @data = JSON.parse(response.body)
29
+ end
30
+
31
+ test 'request should succeed' do
32
+ assert_equal 200, response.status
33
+ end
34
+
35
+ test 'request should return user data' do
36
+ assert_equal @existing_user.email, @data['data']['email']
37
+ end
38
+
39
+ describe 'using auth cookie' do
40
+ before do
41
+ DeviseTokenAuth.cookie_enabled = true
42
+ post :create, params: @user_session_params
43
+ end
44
+
45
+ test 'request should return auth cookie' do
46
+ assert response.cookies[DeviseTokenAuth.cookie_name]
47
+ end
48
+
49
+ test 'request should not include bearer token' do
50
+ assert_nil response.headers["Authorization"]
51
+ end
52
+
53
+ after do
54
+ DeviseTokenAuth.cookie_enabled = false
55
+ end
56
+ end
57
+
58
+ describe "with multiple clients and headers don't change in each request" do
59
+ before do
60
+ # Set the max_number_of_devices to a lower number
61
+ # to expedite tests! (Default is 10)
62
+ DeviseTokenAuth.max_number_of_devices = 2
63
+ DeviseTokenAuth.change_headers_on_each_request = false
64
+ end
65
+
66
+ test 'should limit the maximum number of concurrent devices' do
67
+ # increment the number of devices until the maximum is exceeded
68
+ 1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
69
+ initial_tokens = @existing_user.reload.tokens
70
+
71
+ assert_equal(
72
+ [n, DeviseTokenAuth.max_number_of_devices].min,
73
+ @existing_user.reload.tokens.length
74
+ )
75
+
76
+ # Already have the max number of devices
77
+ post :create, params: @user_session_params
78
+
79
+ # A session for a new device maintains the max number of concurrent devices
80
+ refute_equal initial_tokens, @existing_user.reload.tokens
81
+ end
82
+ end
83
+
84
+ test 'should drop old tokens when max number of devices is exceeded' do
85
+ 1.upto(DeviseTokenAuth.max_number_of_devices).each do |n|
86
+ post :create, params: @user_session_params
87
+ end
88
+
89
+ oldest_token, _ = @existing_user.reload.tokens \
90
+ .min_by { |cid, v| v[:expiry] || v['expiry'] }
91
+
92
+ post :create, params: @user_session_params
93
+
94
+ assert_not_includes @existing_user.reload.tokens.keys, oldest_token
95
+ end
96
+
97
+ after do
98
+ DeviseTokenAuth.max_number_of_devices = 10
99
+ DeviseTokenAuth.change_headers_on_each_request = true
100
+ end
101
+ end
102
+ end
103
+
104
+ describe 'get sign_in is not supported' do
105
+ before do
106
+ get :new,
107
+ params: { nickname: @existing_user.nickname,
108
+ password: @existing_user.password }
109
+ @data = JSON.parse(response.body)
110
+ end
111
+
112
+ test 'user is notified that they should use post sign_in to authenticate' do
113
+ assert_equal 405, response.status
114
+ end
115
+ test 'response should contain errors' do
116
+ assert @data['errors']
117
+ assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.not_supported')]
118
+ end
119
+ end
120
+
121
+ describe 'header sign_in is supported' do
122
+ before do
123
+ request.headers.merge!(
124
+ 'email' => @existing_user.email,
125
+ 'password' => @existing_user.password
126
+ )
127
+
128
+ head :create
129
+ @data = JSON.parse(response.body)
130
+ end
131
+
132
+ test 'user can sign in using header request' do
133
+ assert_equal 200, response.status
134
+ end
135
+ end
136
+
137
+ describe 'alt auth keys' do
138
+ before do
139
+ post :create,
140
+ params: { nickname: @existing_user.nickname,
141
+ password: @existing_user.password }
142
+ @data = JSON.parse(response.body)
143
+ end
144
+
145
+ test 'user can sign in using nickname' do
146
+ assert_equal 200, response.status
147
+ assert_equal @existing_user.email, @data['data']['email']
148
+ end
149
+ end
150
+
151
+ describe 'authed user sign out' do
152
+ before do
153
+ def @controller.reset_session_called
154
+ @reset_session_called == true
155
+ end
156
+
157
+ def @controller.reset_session
158
+ @reset_session_called = true
159
+ end
160
+ @auth_headers = @existing_user.create_new_auth_token
161
+ request.headers.merge!(@auth_headers)
162
+ delete :destroy, format: :json
163
+ end
164
+
165
+ test 'user is successfully logged out' do
166
+ assert_equal 200, response.status
167
+ end
168
+
169
+ test 'token was destroyed' do
170
+ @existing_user.reload
171
+ refute @existing_user.tokens[@auth_headers['client']]
172
+ end
173
+
174
+ test 'session was destroyed' do
175
+ assert_equal true, @controller.reset_session_called
176
+ end
177
+
178
+ describe 'using auth cookie' do
179
+ before do
180
+ DeviseTokenAuth.cookie_enabled = true
181
+ @auth_token = @existing_user.create_new_auth_token
182
+ @controller.send(:cookies)[DeviseTokenAuth.cookie_name] = { value: @auth_token.to_json }
183
+ end
184
+
185
+ test 'auth cookie was destroyed' do
186
+ assert_equal @auth_token.to_json, @controller.send(:cookies)[DeviseTokenAuth.cookie_name] # sanity check
187
+ delete :destroy, format: :json
188
+ assert_nil @controller.send(:cookies)[DeviseTokenAuth.cookie_name]
189
+ end
190
+
191
+ after do
192
+ DeviseTokenAuth.cookie_enabled = false
193
+ end
194
+ end
195
+ end
196
+
197
+ describe 'unauthed user sign out' do
198
+ before do
199
+ @auth_headers = @existing_user.create_new_auth_token
200
+ delete :destroy, format: :json
201
+ @data = JSON.parse(response.body)
202
+ end
203
+
204
+ test 'unauthed request returns 404' do
205
+ assert_equal 404, response.status
206
+ end
207
+
208
+ test 'response should contain errors' do
209
+ assert @data['errors']
210
+ assert_equal @data['errors'],
211
+ [I18n.t('devise_token_auth.sessions.user_not_found')]
212
+ end
213
+ end
214
+
215
+ describe 'failure' do
216
+ before do
217
+ post :create,
218
+ params: { email: @existing_user.email,
219
+ password: 'bogus' }
220
+
221
+ @resource = assigns(:resource)
222
+ @data = JSON.parse(response.body)
223
+ end
224
+
225
+ test 'request should fail' do
226
+ assert_equal 401, response.status
227
+ end
228
+
229
+ test 'response should contain errors' do
230
+ assert @data['errors']
231
+ assert_equal @data['errors'],
232
+ [I18n.t('devise_token_auth.sessions.bad_credentials')]
233
+ end
234
+ end
235
+
236
+ describe 'failure with bad password when change_headers_on_each_request false' do
237
+ before do
238
+ DeviseTokenAuth.change_headers_on_each_request = false
239
+
240
+ # accessing current_user calls through set_user_by_token,
241
+ # which initializes client_id
242
+ @controller.current_user
243
+
244
+ post :create,
245
+ params: { email: @existing_user.email,
246
+ password: 'bogus' }
247
+
248
+ @resource = assigns(:resource)
249
+ @data = JSON.parse(response.body)
250
+ end
251
+
252
+ test 'request should fail' do
253
+ assert_equal 401, response.status
254
+ end
255
+
256
+ test 'response should contain errors' do
257
+ assert @data['errors']
258
+ assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
259
+ end
260
+
261
+ after do
262
+ DeviseTokenAuth.change_headers_on_each_request = true
263
+ end
264
+ end
265
+
266
+ describe 'case-insensitive email' do
267
+ before do
268
+ @resource_class = User
269
+ @request_params = {
270
+ email: @existing_user.email.upcase,
271
+ password: @existing_user.password
272
+ }
273
+ end
274
+
275
+ test 'request should succeed if configured' do
276
+ @resource_class.case_insensitive_keys = [:email]
277
+ post :create, params: @request_params
278
+ assert_equal 200, response.status
279
+ end
280
+
281
+ test 'request should fail if not configured' do
282
+ @resource_class.case_insensitive_keys = []
283
+ post :create, params: @request_params
284
+ assert_equal 401, response.status
285
+ end
286
+ end
287
+
288
+ describe 'stripping whitespace on email' do
289
+ before do
290
+ @resource_class = User
291
+ @request_params = {
292
+ # adding whitespace before and after email
293
+ email: " #{@existing_user.email} ",
294
+ password: @existing_user.password
295
+ }
296
+ end
297
+
298
+ test 'request should succeed if configured' do
299
+ @resource_class.strip_whitespace_keys = [:email]
300
+ post :create, params: @request_params
301
+ assert_equal 200, response.status
302
+ end
303
+
304
+ test 'request should fail if not configured' do
305
+ @resource_class.strip_whitespace_keys = []
306
+ post :create, params: @request_params
307
+ assert_equal 401, response.status
308
+ end
309
+ end
310
+ end
311
+
312
+ describe 'Unconfirmed user' do
313
+ describe 'Without paranoid mode' do
314
+ before do
315
+ @unconfirmed_user = create(:user)
316
+ post :create, params: { email: @unconfirmed_user.email,
317
+ password: @unconfirmed_user.password }
318
+ @resource = assigns(:resource)
319
+ @data = JSON.parse(response.body)
320
+ end
321
+
322
+ test 'request should fail' do
323
+ assert_equal 401, response.status
324
+ end
325
+
326
+ test 'response should contain errors' do
327
+ assert @data['errors']
328
+ assert_equal @data['errors'],
329
+ [I18n.t('devise_token_auth.sessions.not_confirmed',
330
+ email: @unconfirmed_user.email)]
331
+ end
332
+ end
333
+
334
+ describe 'With paranoid mode' do
335
+ before do
336
+ @unconfirmed_user = create(:user)
337
+ swap Devise, paranoid: true do
338
+ post :create, params: { email: @unconfirmed_user.email,
339
+ password: @unconfirmed_user.password }
340
+ end
341
+ @resource = assigns(:resource)
342
+ @data = JSON.parse(response.body)
343
+ end
344
+
345
+ test 'request should fail' do
346
+ assert_equal 401, response.status
347
+ end
348
+
349
+ test 'response should contain errors that do not leak the existence of the account' do
350
+ assert @data['errors']
351
+ assert_equal @data['errors'],
352
+ [I18n.t('devise_token_auth.sessions.bad_credentials')]
353
+ end
354
+ end
355
+ end
356
+
357
+ describe 'Unconfirmed user with allowed unconfirmed access' do
358
+ before do
359
+ @original_duration = Devise.allow_unconfirmed_access_for
360
+ Devise.allow_unconfirmed_access_for = 3.days
361
+ @recent_unconfirmed_user = create(:user)
362
+ post :create,
363
+ params: { email: @recent_unconfirmed_user.email,
364
+ password: @recent_unconfirmed_user.password }
365
+ @resource = assigns(:resource)
366
+ @data = JSON.parse(response.body)
367
+ end
368
+
369
+ after do
370
+ Devise.allow_unconfirmed_access_for = @original_duration
371
+ end
372
+
373
+ test 'request should succeed' do
374
+ assert_equal 200, response.status
375
+ end
376
+
377
+ test 'request should return user data' do
378
+ assert_equal @recent_unconfirmed_user.email, @data['data']['email']
379
+ end
380
+ end
381
+
382
+ describe 'Unconfirmed user with expired unconfirmed access' do
383
+ before do
384
+ @unconfirmed_user = create(:user, :unconfirmed)
385
+ post :create,
386
+ params: { email: @unconfirmed_user.email,
387
+ password: @unconfirmed_user.password }
388
+ @resource = assigns(:resource)
389
+ @data = JSON.parse(response.body)
390
+ end
391
+
392
+ test 'request should fail' do
393
+ assert_equal 401, response.status
394
+ end
395
+
396
+ test 'response should contain errors' do
397
+ assert @data['errors']
398
+ end
399
+ end
400
+
401
+ describe 'Non-existing user' do
402
+ describe 'Without paranoid mode' do
403
+ before do
404
+ post :create,
405
+ params: { email: -> { Faker::Internet.email },
406
+ password: -> { Faker::Number.number(10) } }
407
+ @resource = assigns(:resource)
408
+ @data = JSON.parse(response.body)
409
+ end
410
+
411
+ test 'request should fail' do
412
+ assert_equal 401, response.status
413
+ end
414
+
415
+ test 'response should contain errors' do
416
+ assert @data['errors']
417
+ end
418
+ end
419
+
420
+ describe 'With paranoid mode' do
421
+ before do
422
+ mock_hash = '$2a$04$MUWADkfA6MHXDdWHoep6QOvX1o0Y56pNqt3NMWQ9zCRwKSp1HZJba'
423
+ @bcrypt_mock = Minitest::Mock.new
424
+ @bcrypt_mock.expect(:call, mock_hash, [Object, String])
425
+
426
+ swap Devise, paranoid: true do
427
+ BCrypt::Engine.stub :hash_secret, @bcrypt_mock do
428
+ post :create,
429
+ params: { email: -> { Faker::Internet.email },
430
+ password: -> { Faker::Number.number(10) } }
431
+ end
432
+ end
433
+ end
434
+
435
+ test 'password should be hashed' do
436
+ @bcrypt_mock.verify
437
+ end
438
+ end
439
+ end
440
+
441
+ describe 'Alternate user class' do
442
+ setup do
443
+ @request.env['devise.mapping'] = Devise.mappings[:mang]
444
+ end
445
+
446
+ teardown do
447
+ @request.env['devise.mapping'] = Devise.mappings[:user]
448
+ end
449
+
450
+ before do
451
+ @existing_user = create(:mang_user, :confirmed)
452
+
453
+ post :create,
454
+ params: { email: @existing_user.email,
455
+ password: @existing_user.password }
456
+
457
+ @resource = assigns(:resource)
458
+ @data = JSON.parse(response.body)
459
+ end
460
+
461
+ test 'request should succeed' do
462
+ assert_equal 200, response.status
463
+ end
464
+
465
+ test 'request should return user data' do
466
+ assert_equal @existing_user.email, @data['data']['email']
467
+ end
468
+ end
469
+
470
+ describe 'User with only :database_authenticatable and :registerable included' do
471
+ setup do
472
+ @request.env['devise.mapping'] = Devise.mappings[:only_email_user]
473
+ end
474
+
475
+ teardown do
476
+ @request.env['devise.mapping'] = Devise.mappings[:user]
477
+ end
478
+
479
+ before do
480
+ @existing_user = create(:only_email_user)
481
+
482
+ post :create,
483
+ params: { email: @existing_user.email,
484
+ password: @existing_user.password }
485
+
486
+ @resource = assigns(:resource)
487
+ @data = JSON.parse(response.body)
488
+ end
489
+
490
+ test 'user should be able to sign in without confirmation' do
491
+ assert 200, response.status
492
+ refute OnlyEmailUser.method_defined?(:confirmed_at)
493
+ end
494
+ end
495
+
496
+ describe 'Lockable User' do
497
+ setup do
498
+ @request.env['devise.mapping'] = Devise.mappings[:lockable_user]
499
+ end
500
+
501
+ teardown do
502
+ @request.env['devise.mapping'] = Devise.mappings[:user]
503
+ end
504
+
505
+ before do
506
+ @original_lock_strategy = Devise.lock_strategy
507
+ @original_unlock_strategy = Devise.unlock_strategy
508
+ @original_maximum_attempts = Devise.maximum_attempts
509
+ Devise.lock_strategy = :failed_attempts
510
+ Devise.unlock_strategy = :email
511
+ Devise.maximum_attempts = 5
512
+ end
513
+
514
+ after do
515
+ Devise.lock_strategy = @original_lock_strategy
516
+ Devise.maximum_attempts = @original_maximum_attempts
517
+ Devise.unlock_strategy = @original_unlock_strategy
518
+ end
519
+
520
+ describe 'locked user' do
521
+ describe 'Without paranoid mode' do
522
+ before do
523
+ @locked_user = create(:lockable_user, :locked)
524
+ post :create,
525
+ params: { email: @locked_user.email,
526
+ password: @locked_user.password }
527
+ @data = JSON.parse(response.body)
528
+ end
529
+
530
+ test 'request should fail' do
531
+ assert_equal 401, response.status
532
+ end
533
+
534
+ test 'response should contain errors' do
535
+ assert @data['errors']
536
+ assert_equal @data['errors'], [I18n.t('devise.mailer.unlock_instructions.account_lock_msg')]
537
+ end
538
+ end
539
+
540
+ describe 'With paranoid mode' do
541
+ before do
542
+ @locked_user = create(:lockable_user, :locked)
543
+ swap Devise, paranoid: true do
544
+ post :create,
545
+ params: { email: @locked_user.email,
546
+ password: @locked_user.password }
547
+ end
548
+ @data = JSON.parse(response.body)
549
+ end
550
+
551
+ test 'request should fail' do
552
+ assert_equal 401, response.status
553
+ end
554
+
555
+ test 'response should contain errors that do not leak the existence of the account' do
556
+ assert @data['errors']
557
+ assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
558
+ end
559
+ end
560
+ end
561
+
562
+ describe 'unlocked user with bad password' do
563
+ before do
564
+ @unlocked_user = create(:lockable_user)
565
+ post :create,
566
+ params: { email: @unlocked_user.email,
567
+ password: 'bad-password' }
568
+ @data = JSON.parse(response.body)
569
+ end
570
+
571
+ test 'request should fail' do
572
+ assert_equal 401, response.status
573
+ end
574
+
575
+ test 'should increase failed_attempts' do
576
+ assert_equal 1, @unlocked_user.reload.failed_attempts
577
+ end
578
+
579
+ test 'response should contain errors' do
580
+ assert @data['errors']
581
+ assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
582
+ end
583
+
584
+ describe 'after maximum_attempts should block the user' do
585
+ before do
586
+ 4.times do
587
+ post :create,
588
+ params: { email: @unlocked_user.email,
589
+ password: 'bad-password' }
590
+ end
591
+ @data = JSON.parse(response.body)
592
+ end
593
+
594
+ test 'should increase failed_attempts' do
595
+ assert_equal 5, @unlocked_user.reload.failed_attempts
596
+ end
597
+
598
+ test 'should block the user' do
599
+ assert_equal true, @unlocked_user.reload.access_locked?
600
+ end
601
+ end
602
+ end
603
+ end
604
+ end
605
+ end