devise_jwt_auth 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +99 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_jwt_auth/application_controller.rb +80 -0
  6. data/app/controllers/devise_jwt_auth/concerns/resource_finder.rb +44 -0
  7. data/app/controllers/devise_jwt_auth/concerns/set_user_by_jwt_token.rb +111 -0
  8. data/app/controllers/devise_jwt_auth/confirmations_controller.rb +88 -0
  9. data/app/controllers/devise_jwt_auth/omniauth_callbacks_controller.rb +291 -0
  10. data/app/controllers/devise_jwt_auth/passwords_controller.rb +217 -0
  11. data/app/controllers/devise_jwt_auth/refresh_token_controller.rb +41 -0
  12. data/app/controllers/devise_jwt_auth/registrations_controller.rb +203 -0
  13. data/app/controllers/devise_jwt_auth/sessions_controller.rb +131 -0
  14. data/app/controllers/devise_jwt_auth/unlocks_controller.rb +99 -0
  15. data/app/models/devise_jwt_auth/concerns/active_record_support.rb +16 -0
  16. data/app/models/devise_jwt_auth/concerns/confirmable_support.rb +27 -0
  17. data/app/models/devise_jwt_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_jwt_auth/concerns/tokens_serialization.rb +19 -0
  19. data/app/models/devise_jwt_auth/concerns/user.rb +117 -0
  20. data/app/models/devise_jwt_auth/concerns/user_omniauth_callbacks.rb +28 -0
  21. data/app/validators/devise_jwt_auth_email_validator.rb +23 -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_jwt_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 +57 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fr.yml +51 -0
  31. data/config/locales/he.yml +52 -0
  32. data/config/locales/it.yml +48 -0
  33. data/config/locales/ja.yml +48 -0
  34. data/config/locales/ko.yml +51 -0
  35. data/config/locales/nl.yml +32 -0
  36. data/config/locales/pl.yml +50 -0
  37. data/config/locales/pt-BR.yml +48 -0
  38. data/config/locales/pt.yml +50 -0
  39. data/config/locales/ro.yml +48 -0
  40. data/config/locales/ru.yml +52 -0
  41. data/config/locales/sq.yml +48 -0
  42. data/config/locales/sv.yml +52 -0
  43. data/config/locales/uk.yml +61 -0
  44. data/config/locales/vi.yml +52 -0
  45. data/config/locales/zh-CN.yml +48 -0
  46. data/config/locales/zh-HK.yml +50 -0
  47. data/config/locales/zh-TW.yml +50 -0
  48. data/lib/devise_jwt_auth.rb +14 -0
  49. data/lib/devise_jwt_auth/blacklist.rb +2 -0
  50. data/lib/devise_jwt_auth/controllers/helpers.rb +161 -0
  51. data/lib/devise_jwt_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_jwt_auth/engine.rb +96 -0
  53. data/lib/devise_jwt_auth/errors.rb +8 -0
  54. data/lib/devise_jwt_auth/rails/routes.rb +118 -0
  55. data/lib/devise_jwt_auth/token_factory.rb +51 -0
  56. data/lib/devise_jwt_auth/url.rb +44 -0
  57. data/lib/devise_jwt_auth/version.rb +5 -0
  58. data/lib/generators/devise_jwt_auth/USAGE +31 -0
  59. data/lib/generators/devise_jwt_auth/install_generator.rb +91 -0
  60. data/lib/generators/devise_jwt_auth/install_generator_helpers.rb +98 -0
  61. data/lib/generators/devise_jwt_auth/install_mongoid_generator.rb +46 -0
  62. data/lib/generators/devise_jwt_auth/install_views_generator.rb +18 -0
  63. data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth.rb +74 -0
  64. data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth_create_users.rb.erb +51 -0
  65. data/lib/generators/devise_jwt_auth/templates/user.rb.erb +9 -0
  66. data/lib/generators/devise_jwt_auth/templates/user_mongoid.rb.erb +56 -0
  67. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  68. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  69. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  70. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  71. data/test/controllers/custom/custom_refresh_token_controller_test.rb +36 -0
  72. data/test/controllers/custom/custom_registrations_controller_test.rb +59 -0
  73. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  74. data/test/controllers/demo_group_controller_test.rb +150 -0
  75. data/test/controllers/demo_mang_controller_test.rb +286 -0
  76. data/test/controllers/demo_user_controller_test.rb +650 -0
  77. data/test/controllers/devise_jwt_auth/confirmations_controller_test.rb +194 -0
  78. data/test/controllers/devise_jwt_auth/omniauth_callbacks_controller_test.rb +462 -0
  79. data/test/controllers/devise_jwt_auth/passwords_controller_test.rb +881 -0
  80. data/test/controllers/devise_jwt_auth/refresh_token_controller_test.rb +84 -0
  81. data/test/controllers/devise_jwt_auth/registrations_controller_test.rb +944 -0
  82. data/test/controllers/devise_jwt_auth/sessions_controller_test.rb +510 -0
  83. data/test/controllers/devise_jwt_auth/unlocks_controller_test.rb +197 -0
  84. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  85. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  86. data/test/controllers/overrides/passwords_controller_test.rb +65 -0
  87. data/test/controllers/overrides/refresh_token_controller_test.rb +37 -0
  88. data/test/controllers/overrides/registrations_controller_test.rb +47 -0
  89. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  90. data/test/dummy/README.rdoc +28 -0
  91. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  92. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  93. data/test/dummy/app/active_record/mang.rb +5 -0
  94. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  95. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  96. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  97. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  98. data/test/dummy/app/active_record/user.rb +6 -0
  99. data/test/dummy/app/controllers/application_controller.rb +18 -0
  100. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  101. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  102. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  104. data/test/dummy/app/controllers/custom/refresh_token_controller.rb +20 -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/demo_group_controller.rb +15 -0
  108. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  109. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  110. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +37 -0
  111. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  112. data/test/dummy/app/controllers/overrides/passwords_controller.rb +45 -0
  113. data/test/dummy/app/controllers/overrides/refresh_token_controller.rb +22 -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/helpers/application_helper.rb +1058 -0
  117. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  118. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  119. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  120. data/test/dummy/app/mongoid/mang.rb +46 -0
  121. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  122. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  123. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  124. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  125. data/test/dummy/app/mongoid/user.rb +49 -0
  126. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  127. data/test/dummy/config.ru +18 -0
  128. data/test/dummy/config/application.rb +48 -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 +46 -0
  133. data/test/dummy/config/environments/production.rb +84 -0
  134. data/test/dummy/config/environments/test.rb +50 -0
  135. data/test/dummy/config/initializers/assets.rb +10 -0
  136. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  137. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  138. data/test/dummy/config/initializers/devise.rb +290 -0
  139. data/test/dummy/config/initializers/devise_jwt_auth.rb +55 -0
  140. data/test/dummy/config/initializers/figaro.rb +3 -0
  141. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  142. data/test/dummy/config/initializers/inflections.rb +18 -0
  143. data/test/dummy/config/initializers/mime_types.rb +6 -0
  144. data/test/dummy/config/initializers/omniauth.rb +11 -0
  145. data/test/dummy/config/initializers/session_store.rb +5 -0
  146. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  147. data/test/dummy/config/routes.rb +57 -0
  148. data/test/dummy/config/spring.rb +3 -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/user.rb +9 -0
  162. data/test/dummy/tmp/generators/config/initializers/devise_jwt_auth.rb +74 -0
  163. data/test/dummy/tmp/generators/config/routes.rb +4 -0
  164. data/test/dummy/tmp/generators/db/migrate/20200206224309_devise_jwt_auth_create_users.rb +51 -0
  165. data/test/factories/users.rb +41 -0
  166. data/test/lib/devise_jwt_auth/blacklist_test.rb +11 -0
  167. data/test/lib/devise_jwt_auth/token_factory_test.rb +115 -0
  168. data/test/lib/devise_jwt_auth/url_test.rb +26 -0
  169. data/test/lib/generators/devise_jwt_auth/install_generator_test.rb +219 -0
  170. data/test/lib/generators/devise_jwt_auth/install_generator_with_namespace_test.rb +224 -0
  171. data/test/lib/generators/devise_jwt_auth/install_views_generator_test.rb +25 -0
  172. data/test/models/concerns/mongoid_support_test.rb +31 -0
  173. data/test/models/concerns/tokens_serialization_test.rb +72 -0
  174. data/test/models/confirmable_user_test.rb +35 -0
  175. data/test/models/only_email_user_test.rb +29 -0
  176. data/test/models/user_test.rb +110 -0
  177. data/test/support/controllers/routes.rb +43 -0
  178. data/test/test_helper.rb +91 -0
  179. metadata +503 -0
@@ -0,0 +1,510 @@
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 DeviseJwtAuth::SessionsControllerTest < ActionController::TestCase
12
+ describe DeviseJwtAuth::SessionsController do
13
+ describe 'Confirmed user' do
14
+ before do
15
+ @existing_user = create(:user, :with_nickname, :confirmed)
16
+ @access_token_name = DeviseJwtAuth.access_token_name
17
+ end
18
+
19
+ describe 'success' do
20
+ before do
21
+ post :create,
22
+ params: {
23
+ email: @existing_user.email,
24
+ password: @existing_user.password
25
+ }
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
+ =begin
39
+ describe "with multiple clients and headers don't change in each request" do
40
+ before do
41
+ # Set the max_number_of_devices to a lower number
42
+ # to expedite tests! (Default is 10)
43
+ DeviseJwtAuth.max_number_of_devices = 2
44
+ DeviseJwtAuth.change_headers_on_each_request = false
45
+
46
+ @user_session_params = {
47
+ email: @existing_user.email,
48
+ password: @existing_user.password
49
+ }
50
+ end
51
+
52
+ test 'should limit the maximum number of concurrent devices' do
53
+ # increment the number of devices until the maximum is exceeded
54
+ 1.upto(DeviseJwtAuth.max_number_of_devices + 1).each do |n|
55
+ initial_tokens = @existing_user.reload.tokens
56
+
57
+ assert_equal(
58
+ [n, DeviseJwtAuth.max_number_of_devices].min,
59
+ @existing_user.reload.tokens.length
60
+ )
61
+
62
+ # Already have the max number of devices
63
+ post :create, params: @user_session_params
64
+
65
+ # A session for a new device maintains the max number of concurrent devices
66
+ refute_equal initial_tokens, @existing_user.reload.tokens
67
+ end
68
+ end
69
+
70
+ test 'should drop old tokens when max number of devices is exceeded' do
71
+ 1.upto(DeviseJwtAuth.max_number_of_devices).each do |n|
72
+ post :create, params: @user_session_params
73
+ end
74
+
75
+ oldest_token, _ = @existing_user.reload.tokens \
76
+ .min_by { |cid, v| v[:expiry] || v['expiry'] }
77
+
78
+ post :create, params: @user_session_params
79
+
80
+ assert_not_includes @existing_user.reload.tokens.keys, oldest_token
81
+ end
82
+
83
+ after do
84
+ DeviseJwtAuth.max_number_of_devices = 10
85
+ DeviseJwtAuth.change_headers_on_each_request = true
86
+ end
87
+ end
88
+ =end
89
+ end
90
+
91
+ describe 'get sign_in is not supported' do
92
+ before do
93
+ get :new,
94
+ params: { nickname: @existing_user.nickname,
95
+ password: @existing_user.password }
96
+ @data = JSON.parse(response.body)
97
+ end
98
+
99
+ test 'user is notified that they should use post sign_in to authenticate' do
100
+ assert_equal 405, response.status
101
+ end
102
+ test 'response should contain errors' do
103
+ assert @data['errors']
104
+ assert_equal @data['errors'], [I18n.t('devise_jwt_auth.sessions.not_supported')]
105
+ end
106
+ end
107
+
108
+ describe 'header sign_in is supported' do
109
+ before do
110
+ request.headers.merge!(
111
+ 'email' => @existing_user.email,
112
+ 'password' => @existing_user.password
113
+ )
114
+
115
+ head :create
116
+ @data = JSON.parse(response.body)
117
+ end
118
+
119
+ test 'user can sign in using header request' do
120
+ assert_equal 200, response.status
121
+ end
122
+ end
123
+
124
+ describe 'alt auth keys' do
125
+ before do
126
+ post :create,
127
+ params: { nickname: @existing_user.nickname,
128
+ password: @existing_user.password }
129
+ @data = JSON.parse(response.body)
130
+ end
131
+
132
+ test 'user can sign in using nickname' do
133
+ assert_equal 200, response.status
134
+ assert_equal @existing_user.email, @data['data']['email']
135
+ end
136
+ end
137
+
138
+ describe 'authed user sign out' do
139
+ before do
140
+ def @controller.reset_session_called
141
+ @reset_session_called == true
142
+ end
143
+
144
+ def @controller.reset_session
145
+ @reset_session_called = true
146
+ end
147
+ @auth_headers = @existing_user.create_named_token_pair
148
+
149
+ request.headers.merge!(@auth_headers)
150
+ delete :destroy, format: :json
151
+ end
152
+
153
+ test 'user is successfully logged out' do
154
+ assert_equal 200, response.status
155
+ end
156
+ =begin
157
+ test 'token was destroyed' do
158
+ @existing_user.reload
159
+ refute @existing_user.tokens[@auth_headers['client']]
160
+ end
161
+ =end
162
+
163
+ test 'session was destroyed' do
164
+ assert_equal true, @controller.reset_session_called
165
+ end
166
+ end
167
+
168
+ describe 'unauthed user sign out' do
169
+ before do
170
+ @auth_headers = @existing_user.create_named_token_pair
171
+
172
+ delete :destroy, format: :json
173
+ @data = JSON.parse(response.body)
174
+ end
175
+
176
+ test 'unauthed request returns 404' do
177
+ assert_equal 404, response.status
178
+ end
179
+
180
+ test 'response should contain errors' do
181
+ assert @data['errors']
182
+ assert_equal @data['errors'],
183
+ [I18n.t('devise_jwt_auth.sessions.user_not_found')]
184
+ end
185
+ end
186
+
187
+ describe 'failure' do
188
+ before do
189
+ post :create,
190
+ params: { email: @existing_user.email,
191
+ password: 'bogus' }
192
+
193
+ @resource = assigns(:resource)
194
+ @data = JSON.parse(response.body)
195
+ end
196
+
197
+ test 'request should fail' do
198
+ assert_equal 401, response.status
199
+ end
200
+
201
+ test 'response should contain errors' do
202
+ assert @data['errors']
203
+ assert_equal @data['errors'],
204
+ [I18n.t('devise_jwt_auth.sessions.bad_credentials')]
205
+ end
206
+ end
207
+
208
+ =begin
209
+ describe 'failure with bad password when change_headers_on_each_request false' do
210
+ before do
211
+ DeviseJwtAuth.change_headers_on_each_request = false
212
+
213
+ # accessing current_user calls through set_user_by_token,
214
+ # which initializes client_id
215
+ @controller.current_user
216
+
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'], [I18n.t('devise_jwt_auth.sessions.bad_credentials')]
232
+ end
233
+
234
+ after do
235
+ DeviseJwtAuth.change_headers_on_each_request = true
236
+ end
237
+ end
238
+ =end
239
+
240
+ describe 'case-insensitive email' do
241
+ before do
242
+ @resource_class = User
243
+ @request_params = {
244
+ email: @existing_user.email.upcase,
245
+ password: @existing_user.password
246
+ }
247
+ end
248
+
249
+ test 'request should succeed if configured' do
250
+ @resource_class.case_insensitive_keys = [:email]
251
+ post :create, params: @request_params
252
+ assert_equal 200, response.status
253
+ end
254
+
255
+ test 'request should fail if not configured' do
256
+ @resource_class.case_insensitive_keys = []
257
+ post :create, params: @request_params
258
+ assert_equal 401, response.status
259
+ end
260
+ end
261
+
262
+ describe 'stripping whitespace on email' do
263
+ before do
264
+ @resource_class = User
265
+ @request_params = {
266
+ # adding whitespace before and after email
267
+ email: " #{@existing_user.email} ",
268
+ password: @existing_user.password
269
+ }
270
+ end
271
+
272
+ test 'request should succeed if configured' do
273
+ @resource_class.strip_whitespace_keys = [:email]
274
+ post :create, params: @request_params
275
+ assert_equal 200, response.status
276
+ end
277
+
278
+ test 'request should fail if not configured' do
279
+ @resource_class.strip_whitespace_keys = []
280
+ post :create, params: @request_params
281
+ assert_equal 401, response.status
282
+ end
283
+ end
284
+ end
285
+
286
+ describe 'Unconfirmed user' do
287
+ before do
288
+ @unconfirmed_user = create(:user)
289
+ post :create, params: { email: @unconfirmed_user.email,
290
+ password: @unconfirmed_user.password }
291
+ @resource = assigns(:resource)
292
+ @data = JSON.parse(response.body)
293
+ end
294
+
295
+ test 'request should fail' do
296
+ assert_equal 401, response.status
297
+ end
298
+
299
+ test 'response should contain errors' do
300
+ assert @data['errors']
301
+ assert_equal @data['errors'],
302
+ [I18n.t('devise_jwt_auth.sessions.not_confirmed',
303
+ email: @unconfirmed_user.email)]
304
+ end
305
+ end
306
+
307
+ describe 'Unconfirmed user with allowed unconfirmed access' do
308
+ before do
309
+ @original_duration = Devise.allow_unconfirmed_access_for
310
+ Devise.allow_unconfirmed_access_for = 3.days
311
+ @recent_unconfirmed_user = create(:user)
312
+ post :create,
313
+ params: { email: @recent_unconfirmed_user.email,
314
+ password: @recent_unconfirmed_user.password }
315
+ @resource = assigns(:resource)
316
+ @data = JSON.parse(response.body)
317
+ end
318
+
319
+ after do
320
+ Devise.allow_unconfirmed_access_for = @original_duration
321
+ end
322
+
323
+ test 'request should succeed' do
324
+ assert_equal 200, response.status
325
+ end
326
+
327
+ test 'request should return user data' do
328
+ assert_equal @recent_unconfirmed_user.email, @data['data']['email']
329
+ end
330
+ end
331
+
332
+ describe 'Unconfirmed user with expired unconfirmed access' do
333
+ before do
334
+ @unconfirmed_user = create(:user, :unconfirmed)
335
+ post :create,
336
+ params: { email: @unconfirmed_user.email,
337
+ password: @unconfirmed_user.password }
338
+ @resource = assigns(:resource)
339
+ @data = JSON.parse(response.body)
340
+ end
341
+
342
+ test 'request should fail' do
343
+ assert_equal 401, response.status
344
+ end
345
+
346
+ test 'response should contain errors' do
347
+ assert @data['errors']
348
+ end
349
+ end
350
+
351
+ describe 'Non-existing user' do
352
+ before do
353
+ post :create,
354
+ params: { email: -> { Faker::Internet.email },
355
+ password: -> { Faker::Number.number(10) } }
356
+ @resource = assigns(:resource)
357
+ @data = JSON.parse(response.body)
358
+ end
359
+
360
+ test 'request should fail' do
361
+ assert_equal 401, response.status
362
+ end
363
+
364
+ test 'response should contain errors' do
365
+ assert @data['errors']
366
+ end
367
+ end
368
+
369
+ describe 'Alternate user class' do
370
+ setup do
371
+ @request.env['devise.mapping'] = Devise.mappings[:mang]
372
+ end
373
+
374
+ teardown do
375
+ @request.env['devise.mapping'] = Devise.mappings[:user]
376
+ end
377
+
378
+ before do
379
+ @existing_user = create(:mang_user, :confirmed)
380
+
381
+ post :create,
382
+ params: { email: @existing_user.email,
383
+ password: @existing_user.password }
384
+
385
+ @resource = assigns(:resource)
386
+ @data = JSON.parse(response.body)
387
+ end
388
+
389
+ test 'request should succeed' do
390
+ assert_equal 200, response.status
391
+ end
392
+
393
+ test 'request should return user data' do
394
+ assert_equal @existing_user.email, @data['data']['email']
395
+ end
396
+ end
397
+
398
+ describe 'User with only :database_authenticatable and :registerable included' do
399
+ setup do
400
+ @request.env['devise.mapping'] = Devise.mappings[:only_email_user]
401
+ end
402
+
403
+ teardown do
404
+ @request.env['devise.mapping'] = Devise.mappings[:user]
405
+ end
406
+
407
+ before do
408
+ @existing_user = create(:only_email_user)
409
+
410
+ post :create,
411
+ params: { email: @existing_user.email,
412
+ password: @existing_user.password }
413
+
414
+ @resource = assigns(:resource)
415
+ @data = JSON.parse(response.body)
416
+ end
417
+
418
+ test 'user should be able to sign in without confirmation' do
419
+ assert 200, response.status
420
+ refute OnlyEmailUser.method_defined?(:confirmed_at)
421
+ end
422
+ end
423
+
424
+ describe 'Lockable User' do
425
+ setup do
426
+ @request.env['devise.mapping'] = Devise.mappings[:lockable_user]
427
+ end
428
+
429
+ teardown do
430
+ @request.env['devise.mapping'] = Devise.mappings[:user]
431
+ end
432
+
433
+ before do
434
+ @original_lock_strategy = Devise.lock_strategy
435
+ @original_unlock_strategy = Devise.unlock_strategy
436
+ @original_maximum_attempts = Devise.maximum_attempts
437
+ Devise.lock_strategy = :failed_attempts
438
+ Devise.unlock_strategy = :email
439
+ Devise.maximum_attempts = 5
440
+ end
441
+
442
+ after do
443
+ Devise.lock_strategy = @original_lock_strategy
444
+ Devise.maximum_attempts = @original_maximum_attempts
445
+ Devise.unlock_strategy = @original_unlock_strategy
446
+ end
447
+
448
+ describe 'locked user' do
449
+ before do
450
+ @locked_user = create(:lockable_user, :locked)
451
+ post :create,
452
+ params: { email: @locked_user.email,
453
+ password: @locked_user.password }
454
+ @data = JSON.parse(response.body)
455
+ end
456
+
457
+ test 'request should fail' do
458
+ assert_equal 401, response.status
459
+ end
460
+
461
+ test 'response should contain errors' do
462
+ assert @data['errors']
463
+ assert_equal @data['errors'], [I18n.t('devise.mailer.unlock_instructions.account_lock_msg')]
464
+ end
465
+ end
466
+
467
+ describe 'unlocked user with bad password' do
468
+ before do
469
+ @unlocked_user = create(:lockable_user)
470
+ post :create,
471
+ params: { email: @unlocked_user.email,
472
+ password: 'bad-password' }
473
+ @data = JSON.parse(response.body)
474
+ end
475
+
476
+ test 'request should fail' do
477
+ assert_equal 401, response.status
478
+ end
479
+
480
+ test 'should increase failed_attempts' do
481
+ assert_equal 1, @unlocked_user.reload.failed_attempts
482
+ end
483
+
484
+ test 'response should contain errors' do
485
+ assert @data['errors']
486
+ assert_equal @data['errors'], [I18n.t('devise_jwt_auth.sessions.bad_credentials')]
487
+ end
488
+
489
+ describe 'after maximum_attempts should block the user' do
490
+ before do
491
+ 4.times do
492
+ post :create,
493
+ params: { email: @unlocked_user.email,
494
+ password: 'bad-password' }
495
+ end
496
+ @data = JSON.parse(response.body)
497
+ end
498
+
499
+ test 'should increase failed_attempts' do
500
+ assert_equal 5, @unlocked_user.reload.failed_attempts
501
+ end
502
+
503
+ test 'should block the user' do
504
+ assert_equal true, @unlocked_user.reload.access_locked?
505
+ end
506
+ end
507
+ end
508
+ end
509
+ end
510
+ end