devise_jwt_auth 0.1.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 (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