devise 3.4.1 → 3.5.10

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.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +28 -19
  3. data/CHANGELOG.md +193 -104
  4. data/CODE_OF_CONDUCT.md +22 -0
  5. data/CONTRIBUTING.md +2 -0
  6. data/Gemfile +3 -2
  7. data/Gemfile.lock +90 -95
  8. data/MIT-LICENSE +1 -1
  9. data/README.md +55 -34
  10. data/Rakefile +2 -1
  11. data/app/controllers/devise/confirmations_controller.rb +4 -0
  12. data/app/controllers/devise/omniauth_callbacks_controller.rb +4 -0
  13. data/app/controllers/devise/passwords_controller.rb +14 -4
  14. data/app/controllers/devise/registrations_controller.rb +10 -11
  15. data/app/controllers/devise/sessions_controller.rb +7 -2
  16. data/app/controllers/devise/unlocks_controller.rb +3 -0
  17. data/app/controllers/devise_controller.rb +34 -18
  18. data/app/mailers/devise/mailer.rb +4 -0
  19. data/app/views/devise/confirmations/new.html.erb +1 -1
  20. data/app/views/devise/mailer/password_change.html.erb +3 -0
  21. data/app/views/devise/passwords/edit.html.erb +3 -0
  22. data/app/views/devise/registrations/new.html.erb +1 -1
  23. data/app/views/devise/shared/_links.html.erb +1 -1
  24. data/config/locales/en.yml +2 -0
  25. data/devise.gemspec +0 -2
  26. data/gemfiles/Gemfile.rails-3.2-stable.lock +52 -49
  27. data/gemfiles/Gemfile.rails-4.0-stable +1 -0
  28. data/gemfiles/Gemfile.rails-4.0-stable.lock +61 -60
  29. data/gemfiles/Gemfile.rails-4.1-stable +1 -0
  30. data/gemfiles/Gemfile.rails-4.1-stable.lock +66 -65
  31. data/gemfiles/Gemfile.rails-4.2-stable +30 -0
  32. data/gemfiles/Gemfile.rails-4.2-stable.lock +193 -0
  33. data/lib/devise/controllers/helpers.rb +12 -6
  34. data/lib/devise/controllers/rememberable.rb +9 -2
  35. data/lib/devise/controllers/sign_in_out.rb +2 -8
  36. data/lib/devise/controllers/store_location.rb +3 -1
  37. data/lib/devise/controllers/url_helpers.rb +7 -9
  38. data/lib/devise/encryptor.rb +22 -0
  39. data/lib/devise/failure_app.rb +48 -13
  40. data/lib/devise/hooks/timeoutable.rb +5 -7
  41. data/lib/devise/mapping.rb +1 -0
  42. data/lib/devise/models/authenticatable.rb +20 -26
  43. data/lib/devise/models/confirmable.rb +51 -17
  44. data/lib/devise/models/database_authenticatable.rb +17 -11
  45. data/lib/devise/models/lockable.rb +5 -1
  46. data/lib/devise/models/recoverable.rb +23 -15
  47. data/lib/devise/models/rememberable.rb +56 -22
  48. data/lib/devise/models/timeoutable.rb +0 -6
  49. data/lib/devise/models/trackable.rb +1 -2
  50. data/lib/devise/models/validatable.rb +3 -3
  51. data/lib/devise/models.rb +1 -1
  52. data/lib/devise/rails/routes.rb +27 -18
  53. data/lib/devise/rails.rb +1 -1
  54. data/lib/devise/strategies/authenticatable.rb +7 -4
  55. data/lib/devise/strategies/database_authenticatable.rb +1 -1
  56. data/lib/devise/strategies/rememberable.rb +13 -6
  57. data/lib/devise/test_helpers.rb +2 -2
  58. data/lib/devise/version.rb +1 -1
  59. data/lib/devise.rb +37 -36
  60. data/lib/generators/active_record/templates/migration.rb +1 -1
  61. data/lib/generators/active_record/templates/migration_existing.rb +1 -1
  62. data/lib/generators/devise/views_generator.rb +14 -3
  63. data/lib/generators/templates/controllers/README +2 -2
  64. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +1 -1
  65. data/lib/generators/templates/controllers/registrations_controller.rb +2 -2
  66. data/lib/generators/templates/controllers/sessions_controller.rb +1 -1
  67. data/lib/generators/templates/devise.rb +17 -11
  68. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  69. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  70. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  71. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  72. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +1 -1
  73. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +1 -1
  74. data/test/controllers/custom_registrations_controller_test.rb +6 -1
  75. data/test/controllers/helper_methods_test.rb +21 -0
  76. data/test/controllers/helpers_test.rb +5 -0
  77. data/test/controllers/inherited_controller_i18n_messages_test.rb +51 -0
  78. data/test/controllers/internal_helpers_test.rb +4 -4
  79. data/test/controllers/load_hooks_controller_test.rb +19 -0
  80. data/test/controllers/passwords_controller_test.rb +1 -1
  81. data/test/controllers/sessions_controller_test.rb +3 -3
  82. data/test/devise_test.rb +3 -3
  83. data/test/failure_app_test.rb +40 -0
  84. data/test/generators/views_generator_test.rb +7 -0
  85. data/test/integration/database_authenticatable_test.rb +11 -0
  86. data/test/integration/omniauthable_test.rb +12 -10
  87. data/test/integration/recoverable_test.rb +13 -0
  88. data/test/integration/rememberable_test.rb +50 -3
  89. data/test/integration/timeoutable_test.rb +13 -18
  90. data/test/mailers/confirmation_instructions_test.rb +1 -1
  91. data/test/mapping_test.rb +6 -0
  92. data/test/models/confirmable_test.rb +93 -37
  93. data/test/models/database_authenticatable_test.rb +20 -0
  94. data/test/models/lockable_test.rb +29 -7
  95. data/test/models/recoverable_test.rb +62 -7
  96. data/test/models/rememberable_test.rb +68 -97
  97. data/test/models/validatable_test.rb +5 -5
  98. data/test/models_test.rb +15 -6
  99. data/test/rails_app/app/active_record/user_without_email.rb +8 -0
  100. data/test/rails_app/app/controllers/admins_controller.rb +0 -5
  101. data/test/rails_app/app/controllers/custom/registrations_controller.rb +10 -0
  102. data/test/rails_app/app/mongoid/user_without_email.rb +33 -0
  103. data/test/rails_app/config/application.rb +1 -1
  104. data/test/rails_app/config/environments/production.rb +6 -2
  105. data/test/rails_app/config/environments/test.rb +7 -2
  106. data/test/rails_app/config/initializers/devise.rb +12 -15
  107. data/test/rails_app/config/routes.rb +6 -3
  108. data/test/rails_app/lib/shared_user.rb +1 -1
  109. data/test/rails_app/lib/shared_user_without_email.rb +26 -0
  110. data/test/rails_test.rb +9 -0
  111. data/test/support/helpers.rb +4 -0
  112. data/test/support/integration.rb +2 -2
  113. data/test/test_helpers_test.rb +22 -7
  114. data/test/test_models.rb +2 -2
  115. data/test/time_helpers.rb +137 -0
  116. metadata +26 -4
@@ -197,6 +197,19 @@ class PasswordTest < ActionDispatch::IntegrationTest
197
197
  assert warden.authenticated?(:user)
198
198
  end
199
199
 
200
+ test 'does not sign in user automatically after changing its password if config.sign_in_after_reset_password is false' do
201
+ swap Devise, sign_in_after_reset_password: false do
202
+ create_user
203
+ request_forgot_password
204
+ reset_password
205
+
206
+ assert_contain 'Your password has been changed successfully.'
207
+ assert_not_contain 'You are now signed in.'
208
+ assert_equal new_user_session_path, @request.path
209
+ assert !warden.authenticated?(:user)
210
+ end
211
+ end
212
+
200
213
  test 'does not sign in user automatically after changing its password if it\'s locked and unlock strategy is :none or :time' do
201
214
  [:none, :time].each do |strategy|
202
215
  swap Devise, unlock_strategy: strategy do
@@ -1,10 +1,15 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class RememberMeTest < ActionDispatch::IntegrationTest
4
+ if (Rails::VERSION::MAJOR < 4) || (Rails::VERSION::MAJOR >= 4 && Rails::VERSION::MINOR < 1)
5
+ require 'time_helpers'
6
+ include ActiveSupport::Testing::TimeHelpers
7
+ end
8
+
4
9
  def create_user_and_remember(add_to_token='')
5
10
  user = create_user
6
11
  user.remember_me!
7
- raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
12
+ raw_cookie = User.serialize_into_cookie(user).tap { |a| a[1] << add_to_token }
8
13
  cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
9
14
  user
10
15
  end
@@ -92,7 +97,6 @@ class RememberMeTest < ActionDispatch::IntegrationTest
92
97
  assert_response :success
93
98
  assert warden.authenticated?(:user)
94
99
  assert warden.user(:user) == user
95
- assert_match /remember_user_token[^\n]*HttpOnly/, response.headers["Set-Cookie"], "Expected Set-Cookie header in response to set HttpOnly flag on remember_user_token cookie."
96
100
  end
97
101
 
98
102
  test 'remember the user before sign up and redirect them to their home' do
@@ -118,6 +122,40 @@ class RememberMeTest < ActionDispatch::IntegrationTest
118
122
  end
119
123
  end
120
124
 
125
+ test 'extends remember period when extend remember period config is true' do
126
+ swap Devise, extend_remember_period: true, remember_for: 1.year do
127
+ user = create_user_and_remember
128
+ old_remember_token = nil
129
+
130
+ travel_to 1.day.ago do
131
+ get root_path
132
+ old_remember_token = request.cookies['remember_user_token']
133
+ end
134
+
135
+ get root_path
136
+ current_remember_token = request.cookies['remember_user_token']
137
+
138
+ refute_equal old_remember_token, current_remember_token
139
+ end
140
+ end
141
+
142
+ test 'does not extend remember period when extend period config is false' do
143
+ swap Devise, extend_remember_period: false, remember_for: 1.year do
144
+ user = create_user_and_remember
145
+ old_remember_token = nil
146
+
147
+ travel_to 1.day.ago do
148
+ get root_path
149
+ old_remember_token = request.cookies['remember_user_token']
150
+ end
151
+
152
+ get root_path
153
+ current_remember_token = request.cookies['remember_user_token']
154
+
155
+ assert_equal old_remember_token, current_remember_token
156
+ end
157
+ end
158
+
121
159
  test 'do not remember other scopes' do
122
160
  create_user_and_remember
123
161
  get root_path
@@ -135,7 +173,7 @@ class RememberMeTest < ActionDispatch::IntegrationTest
135
173
 
136
174
  test 'do not remember with expired token' do
137
175
  create_user_and_remember
138
- swap Devise, remember_for: 0 do
176
+ swap Devise, remember_for: 0.days do
139
177
  get users_path
140
178
  assert_not warden.authenticated?(:user)
141
179
  assert_redirected_to new_user_session_path
@@ -164,4 +202,13 @@ class RememberMeTest < ActionDispatch::IntegrationTest
164
202
  get users_path
165
203
  assert_not warden.authenticated?(:user)
166
204
  end
205
+
206
+ test 'valid sign in calls after_remembered callback' do
207
+ user = create_user_and_remember
208
+
209
+ User.expects(:serialize_from_cookie).returns user
210
+ user.expects :after_remembered
211
+
212
+ get new_user_registration_path
213
+ end
167
214
  end
@@ -24,6 +24,18 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
24
24
  assert_equal old_last_request, last_request_at
25
25
  end
26
26
 
27
+ test 'does not set last request at in user session after each request if timeoutable is disabled' do
28
+ sign_in_as_user
29
+ old_last_request = last_request_at
30
+ assert_not_nil last_request_at
31
+
32
+ new_time = 2.seconds.from_now
33
+ Time.stubs(:now).returns(new_time)
34
+
35
+ get users_path, {}, 'devise.skip_timeoutable' => true
36
+ assert_equal old_last_request, last_request_at
37
+ end
38
+
27
39
  test 'does not time out user session before default limit time' do
28
40
  sign_in_as_user
29
41
  assert_response :success
@@ -110,23 +122,6 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
110
122
  assert_contain 'You are signed in'
111
123
  end
112
124
 
113
- test 'admin does not explode on time out' do
114
- admin = sign_in_as_admin
115
- get expire_admin_path(admin)
116
-
117
- Admin.send :define_method, :reset_authentication_token! do
118
- nil
119
- end
120
-
121
- begin
122
- get admins_path
123
- assert_redirected_to admins_path
124
- assert_not warden.authenticated?(:admin)
125
- ensure
126
- Admin.send(:remove_method, :reset_authentication_token!)
127
- end
128
- end
129
-
130
125
  test 'user configured timeout limit' do
131
126
  swap Devise, timeout_in: 8.minutes do
132
127
  user = sign_in_as_user
@@ -180,7 +175,7 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
180
175
  assert warden.authenticated?(:user)
181
176
  end
182
177
 
183
- test 'does not crashes when the last_request_at is a String' do
178
+ test 'does not crash when the last_request_at is a String' do
184
179
  user = sign_in_as_user
185
180
 
186
181
  get edit_form_user_path(user, last_request_at: Time.now.utc.to_s)
@@ -86,7 +86,7 @@ class ConfirmationInstructionsTest < ActionMailer::TestCase
86
86
  host, port = ActionMailer::Base.default_url_options.values_at :host, :port
87
87
 
88
88
  if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/confirmation\?confirmation_token=([^"]+)">}
89
- assert_equal Devise.token_generator.digest(user.class, :confirmation_token, $1), user.confirmation_token
89
+ assert_equal $1, user.confirmation_token
90
90
  else
91
91
  flunk "expected confirmation url regex to match"
92
92
  end
data/test/mapping_test.rb CHANGED
@@ -71,6 +71,12 @@ class MappingTest < ActiveSupport::TestCase
71
71
  assert_equal :user, Devise::Mapping.find_scope!(Class.new(User).new)
72
72
  end
73
73
 
74
+ test 'find scope uses devise_scope' do
75
+ user = User.new
76
+ def user.devise_scope; :special_scope; end
77
+ assert_equal :special_scope, Devise::Mapping.find_scope!(user)
78
+ end
79
+
74
80
  test 'find scope raises an error if cannot be found' do
75
81
  assert_raise RuntimeError do
76
82
  Devise::Mapping.find_scope!(String)
@@ -23,31 +23,24 @@ class ConfirmableTest < ActiveSupport::TestCase
23
23
  test 'should confirm a user by updating confirmed at' do
24
24
  user = create_user
25
25
  assert_nil user.confirmed_at
26
- assert user.confirm!
26
+ assert user.confirm
27
27
  assert_not_nil user.confirmed_at
28
28
  end
29
29
 
30
- test 'should clear confirmation token while confirming a user' do
31
- user = create_user
32
- assert_present user.confirmation_token
33
- user.confirm!
34
- assert_nil user.confirmation_token
35
- end
36
-
37
30
  test 'should verify whether a user is confirmed or not' do
38
31
  assert_not new_user.confirmed?
39
32
  user = create_user
40
33
  assert_not user.confirmed?
41
- user.confirm!
34
+ user.confirm
42
35
  assert user.confirmed?
43
36
  end
44
37
 
45
38
  test 'should not confirm a user already confirmed' do
46
39
  user = create_user
47
- assert user.confirm!
40
+ assert user.confirm
48
41
  assert_blank user.errors[:email]
49
42
 
50
- assert_not user.confirm!
43
+ assert_not user.confirm
51
44
  assert_equal "was already confirmed, please try signing in", user.errors[:email].join
52
45
  end
53
46
 
@@ -80,6 +73,16 @@ class ConfirmableTest < ActiveSupport::TestCase
80
73
  assert_equal "was already confirmed, please try signing in", confirmed_user.errors[:email].join
81
74
  end
82
75
 
76
+ test 'should show error when a token has already been used' do
77
+ user = create_user
78
+ raw = user.raw_confirmation_token
79
+ User.confirm_by_token(raw)
80
+ assert user.reload.confirmed?
81
+
82
+ confirmed_user = User.confirm_by_token(raw)
83
+ assert_equal "was already confirmed, please try signing in", confirmed_user.errors[:email].join
84
+ end
85
+
83
86
  test 'should send confirmation instructions by email' do
84
87
  assert_email_sent "mynewuser@example.com" do
85
88
  create_user email: "mynewuser@example.com"
@@ -111,7 +114,7 @@ class ConfirmableTest < ActiveSupport::TestCase
111
114
 
112
115
  assert_email_not_sent do
113
116
  user.save!
114
- assert !user.confirmed?
117
+ assert_not user.confirmed?
115
118
  end
116
119
  end
117
120
 
@@ -165,18 +168,19 @@ class ConfirmableTest < ActiveSupport::TestCase
165
168
 
166
169
  test 'should not reset confirmation status or token when updating email' do
167
170
  user = create_user
168
- user.confirm!
171
+ original_token = user.confirmation_token
172
+ user.confirm
169
173
  user.email = 'new_test@example.com'
170
174
  user.save!
171
175
 
172
176
  user.reload
173
177
  assert user.confirmed?
174
- assert_nil user.confirmation_token
178
+ assert_equal original_token, user.confirmation_token
175
179
  end
176
180
 
177
181
  test 'should not be able to send instructions if the user is already confirmed' do
178
182
  user = create_user
179
- user.confirm!
183
+ user.confirm
180
184
  assert_not user.resend_confirmation_instructions
181
185
  assert user.confirmed?
182
186
  assert_equal 'was already confirmed, please try signing in', user.errors[:email].join
@@ -211,7 +215,7 @@ class ConfirmableTest < ActiveSupport::TestCase
211
215
  assert_not user.confirmed?
212
216
  assert_not user.active_for_authentication?
213
217
 
214
- user.confirm!
218
+ user.confirm
215
219
  assert user.confirmed?
216
220
  assert user.active_for_authentication?
217
221
  end
@@ -246,6 +250,16 @@ class ConfirmableTest < ActiveSupport::TestCase
246
250
  assert user.reload.active_for_authentication?
247
251
  end
248
252
 
253
+ test 'should not break when a user tries to reset their password in the case where confirmation is not required and confirm_within is set' do
254
+ swap Devise, confirm_within: 3.days do
255
+ user = create_user
256
+ user.instance_eval { def confirmation_required?; false end }
257
+ user.confirmation_sent_at = nil
258
+ user.save
259
+ assert user.reload.confirm!
260
+ end
261
+ end
262
+
249
263
  test 'should find a user to send email instructions for the user confirm its email by authentication_keys' do
250
264
  swap Devise, authentication_keys: [:username, :email] do
251
265
  user = create_user
@@ -287,12 +301,23 @@ class ConfirmableTest < ActiveSupport::TestCase
287
301
  end
288
302
  end
289
303
 
290
- test 'always generate a new token on resend' do
304
+ test 'do not generate a new token on resend' do
291
305
  user = create_user
292
306
  old = user.confirmation_token
293
307
  user = User.find(user.id)
294
308
  user.resend_confirmation_instructions
295
- assert_not_equal user.confirmation_token, old
309
+ assert_equal user.confirmation_token, old
310
+ end
311
+
312
+ test 'generate a new token after first has expired' do
313
+ swap Devise, confirm_within: 3.days do
314
+ user = create_user
315
+ old = user.confirmation_token
316
+ user.update_attribute(:confirmation_sent_at, 4.days.ago)
317
+ user = User.find(user.id)
318
+ user.resend_confirmation_instructions
319
+ assert_not_equal user.confirmation_token, old
320
+ end
296
321
  end
297
322
 
298
323
  test 'should call after_confirmation if confirmed' do
@@ -301,43 +326,52 @@ class ConfirmableTest < ActiveSupport::TestCase
301
326
  self.username = self.username.to_s + 'updated'
302
327
  end
303
328
  old = user.username
304
- assert user.confirm!
329
+ assert user.confirm
305
330
  assert_not_equal user.username, old
306
331
  end
307
332
 
308
333
  test 'should not call after_confirmation if not confirmed' do
309
334
  user = create_user
310
- assert user.confirm!
335
+ assert user.confirm
311
336
  user.define_singleton_method :after_confirmation do
312
337
  self.username = self.username.to_s + 'updated'
313
338
  end
314
339
  old = user.username
315
- assert_not user.confirm!
340
+ assert_not user.confirm
316
341
  assert_equal user.username, old
317
342
  end
343
+
344
+ test 'should always perform validations upon confirm when ensure valid true' do
345
+ admin = create_admin
346
+ admin.stubs(:valid?).returns(false)
347
+ assert_not admin.confirm(ensure_valid: true)
348
+ end
318
349
  end
319
350
 
320
351
  class ReconfirmableTest < ActiveSupport::TestCase
321
352
  test 'should not worry about validations on confirm even with reconfirmable' do
322
353
  admin = create_admin
323
354
  admin.reset_password_token = "a"
324
- assert admin.confirm!
355
+ assert admin.confirm
325
356
  end
326
357
 
327
358
  test 'should generate confirmation token after changing email' do
328
359
  admin = create_admin
329
- assert admin.confirm!
330
- assert_nil admin.confirmation_token
360
+ assert admin.confirm
361
+ residual_token = admin.confirmation_token
331
362
  assert admin.update_attributes(email: 'new_test@example.com')
332
- assert_not_nil admin.confirmation_token
363
+ assert_not_equal residual_token, admin.confirmation_token
333
364
  end
334
365
 
335
- test 'should not generate confirmation token if skipping reconfirmation after changing email' do
366
+ test 'should not regenerate confirmation token or require reconfirmation if skipping reconfirmation after changing email' do
336
367
  admin = create_admin
337
- assert admin.confirm!
368
+ original_token = admin.confirmation_token
369
+ assert admin.confirm
338
370
  admin.skip_reconfirmation!
339
371
  assert admin.update_attributes(email: 'new_test@example.com')
340
- assert_nil admin.confirmation_token
372
+ assert admin.confirmed?
373
+ assert_not admin.pending_reconfirmation?
374
+ assert_equal original_token, admin.confirmation_token
341
375
  end
342
376
 
343
377
  test 'should skip sending reconfirmation email when email is changed and skip_confirmation_notification! is invoked' do
@@ -351,7 +385,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
351
385
 
352
386
  test 'should regenerate confirmation token after changing email' do
353
387
  admin = create_admin
354
- assert admin.confirm!
388
+ assert admin.confirm
355
389
  assert admin.update_attributes(email: 'old_test@example.com')
356
390
  token = admin.confirmation_token
357
391
  assert admin.update_attributes(email: 'new_test@example.com')
@@ -360,7 +394,15 @@ class ReconfirmableTest < ActiveSupport::TestCase
360
394
 
361
395
  test 'should send confirmation instructions by email after changing email' do
362
396
  admin = create_admin
363
- assert admin.confirm!
397
+ assert admin.confirm
398
+ assert_email_sent "new_test@example.com" do
399
+ assert admin.update_attributes(email: 'new_test@example.com')
400
+ end
401
+ assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
402
+ end
403
+
404
+ test 'should send confirmation instructions by email after changing email from nil' do
405
+ admin = create_admin(email: nil)
364
406
  assert_email_sent "new_test@example.com" do
365
407
  assert admin.update_attributes(email: 'new_test@example.com')
366
408
  end
@@ -369,7 +411,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
369
411
 
370
412
  test 'should not send confirmation by email after changing password' do
371
413
  admin = create_admin
372
- assert admin.confirm!
414
+ assert admin.confirm
373
415
  assert_email_not_sent do
374
416
  assert admin.update_attributes(password: 'newpass', password_confirmation: 'newpass')
375
417
  end
@@ -377,7 +419,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
377
419
 
378
420
  test 'should not send confirmation by email after changing to a blank email' do
379
421
  admin = create_admin
380
- assert admin.confirm!
422
+ assert admin.confirm
381
423
  assert_email_not_sent do
382
424
  admin.email = ''
383
425
  admin.save(validate: false)
@@ -386,23 +428,23 @@ class ReconfirmableTest < ActiveSupport::TestCase
386
428
 
387
429
  test 'should stay confirmed when email is changed' do
388
430
  admin = create_admin
389
- assert admin.confirm!
431
+ assert admin.confirm
390
432
  assert admin.update_attributes(email: 'new_test@example.com')
391
433
  assert admin.confirmed?
392
434
  end
393
435
 
394
436
  test 'should update email only when it is confirmed' do
395
437
  admin = create_admin
396
- assert admin.confirm!
438
+ assert admin.confirm
397
439
  assert admin.update_attributes(email: 'new_test@example.com')
398
440
  assert_not_equal 'new_test@example.com', admin.email
399
- assert admin.confirm!
441
+ assert admin.confirm
400
442
  assert_equal 'new_test@example.com', admin.email
401
443
  end
402
444
 
403
445
  test 'should not allow admin to get past confirmation email by resubmitting their new address' do
404
446
  admin = create_admin
405
- assert admin.confirm!
447
+ assert admin.confirm
406
448
  assert admin.update_attributes(email: 'new_test@example.com')
407
449
  assert_not_equal 'new_test@example.com', admin.email
408
450
  assert admin.update_attributes(email: 'new_test@example.com')
@@ -411,7 +453,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
411
453
 
412
454
  test 'should find a admin by send confirmation instructions with unconfirmed_email' do
413
455
  admin = create_admin
414
- assert admin.confirm!
456
+ assert admin.confirm
415
457
  assert admin.update_attributes(email: 'new_test@example.com')
416
458
  confirmation_admin = Admin.send_confirmation_instructions(email: admin.unconfirmed_email)
417
459
  assert_equal confirmation_admin, admin
@@ -452,4 +494,18 @@ class ReconfirmableTest < ActiveSupport::TestCase
452
494
  :unconfirmed_email
453
495
  ]
454
496
  end
497
+
498
+ test 'should not require reconfirmation after creating a record' do
499
+ admin = create_admin
500
+ assert !admin.pending_reconfirmation?
501
+ end
502
+
503
+ test 'should not require reconfirmation after creating a record with #save called in callback' do
504
+ class Admin::WithSaveInCallback < Admin
505
+ after_create :save
506
+ end
507
+
508
+ admin = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
509
+ assert !admin.pending_reconfirmation?
510
+ end
455
511
  end
@@ -3,6 +3,10 @@ require 'test_models'
3
3
  require 'digest/sha1'
4
4
 
5
5
  class DatabaseAuthenticatableTest < ActiveSupport::TestCase
6
+ def setup
7
+ setup_mailer
8
+ end
9
+
6
10
  test 'should downcase case insensitive keys when saving' do
7
11
  # case_insensitive_keys is set to :email by default.
8
12
  email = 'Foo@Bar.com'
@@ -225,6 +229,22 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
225
229
  assert_match "can't be blank", user.errors[:current_password].join
226
230
  end
227
231
 
232
+ test 'should not email on password change' do
233
+ user = create_user
234
+ assert_email_not_sent do
235
+ assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
236
+ end
237
+ end
238
+
239
+ test 'should email on password change when configured' do
240
+ swap Devise, send_password_change_notification: true do
241
+ user = create_user
242
+ assert_email_sent user.email do
243
+ assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
244
+ end
245
+ end
246
+ end
247
+
228
248
  test 'downcase_keys with validation' do
229
249
  User.create(email: "HEllO@example.com", password: "123456")
230
250
  user = User.create(email: "HEllO@example.com", password: "123456")
@@ -7,16 +7,16 @@ class LockableTest < ActiveSupport::TestCase
7
7
 
8
8
  test "should respect maximum attempts configuration" do
9
9
  user = create_user
10
- user.confirm!
10
+ user.confirm
11
11
  swap Devise, maximum_attempts: 2 do
12
12
  2.times { user.valid_for_authentication?{ false } }
13
13
  assert user.reload.access_locked?
14
14
  end
15
15
  end
16
16
 
17
- test "should increment failed_attempts on successfull validation if the user is already locked" do
17
+ test "should increment failed_attempts on successful validation if the user is already locked" do
18
18
  user = create_user
19
- user.confirm!
19
+ user.confirm
20
20
 
21
21
  swap Devise, maximum_attempts: 2 do
22
22
  2.times { user.valid_for_authentication?{ false } }
@@ -29,7 +29,7 @@ class LockableTest < ActiveSupport::TestCase
29
29
 
30
30
  test "should not touch failed_attempts if lock_strategy is none" do
31
31
  user = create_user
32
- user.confirm!
32
+ user.confirm
33
33
  swap Devise, lock_strategy: :none, maximum_attempts: 2 do
34
34
  3.times { user.valid_for_authentication?{ false } }
35
35
  assert !user.access_locked?
@@ -53,7 +53,7 @@ class LockableTest < ActiveSupport::TestCase
53
53
 
54
54
  test "active_for_authentication? should be the opposite of locked?" do
55
55
  user = create_user
56
- user.confirm!
56
+ user.confirm
57
57
  assert user.active_for_authentication?
58
58
  user.lock_access!
59
59
  assert_not user.active_for_authentication?
@@ -230,7 +230,7 @@ class LockableTest < ActiveSupport::TestCase
230
230
  test 'should unlock account if lock has expired and increase attempts on failure' do
231
231
  swap Devise, unlock_in: 1.minute do
232
232
  user = create_user
233
- user.confirm!
233
+ user.confirm
234
234
 
235
235
  user.failed_attempts = 2
236
236
  user.locked_at = 2.minutes.ago
@@ -243,7 +243,7 @@ class LockableTest < ActiveSupport::TestCase
243
243
  test 'should unlock account if lock has expired on success' do
244
244
  swap Devise, unlock_in: 1.minute do
245
245
  user = create_user
246
- user.confirm!
246
+ user.confirm
247
247
 
248
248
  user.failed_attempts = 2
249
249
  user.locked_at = 2.minutes.ago
@@ -325,4 +325,26 @@ class LockableTest < ActiveSupport::TestCase
325
325
  user.lock_access!
326
326
  assert_equal :locked, user.unauthenticated_message
327
327
  end
328
+
329
+ test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
330
+ swap Devise, unlock_strategy: :both do
331
+ user = create_user
332
+ assert_equal true, user.unlock_strategy_enabled?(:both)
333
+ assert_equal true, user.unlock_strategy_enabled?(:time)
334
+ assert_equal true, user.unlock_strategy_enabled?(:email)
335
+ assert_equal false, user.unlock_strategy_enabled?(:none)
336
+ assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
337
+ end
338
+ end
339
+
340
+ test 'unlock_strategy_enabled? should return true only for the configured strategy' do
341
+ swap Devise, unlock_strategy: :email do
342
+ user = create_user
343
+ assert_equal false, user.unlock_strategy_enabled?(:both)
344
+ assert_equal false, user.unlock_strategy_enabled?(:time)
345
+ assert_equal true, user.unlock_strategy_enabled?(:email)
346
+ assert_equal false, user.unlock_strategy_enabled?(:none)
347
+ assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
348
+ end
349
+ end
328
350
  end