devise 3.2.0 → 3.3.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.

Potentially problematic release.


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

Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +18 -3
  3. data/CHANGELOG.md +82 -9
  4. data/CONTRIBUTING.md +2 -2
  5. data/Gemfile +7 -9
  6. data/Gemfile.lock +102 -96
  7. data/MIT-LICENSE +1 -1
  8. data/README.md +94 -42
  9. data/Rakefile +1 -1
  10. data/app/controllers/devise/confirmations_controller.rb +5 -3
  11. data/app/controllers/devise/omniauth_callbacks_controller.rb +2 -2
  12. data/app/controllers/devise/passwords_controller.rb +5 -3
  13. data/app/controllers/devise/registrations_controller.rb +26 -10
  14. data/app/controllers/devise/sessions_controller.rb +39 -14
  15. data/app/controllers/devise/unlocks_controller.rb +4 -2
  16. data/app/controllers/devise_controller.rb +6 -6
  17. data/app/helpers/devise_helper.rb +2 -2
  18. data/app/views/devise/confirmations/new.html.erb +2 -2
  19. data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
  20. data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
  21. data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
  22. data/app/views/devise/passwords/edit.html.erb +3 -3
  23. data/app/views/devise/passwords/new.html.erb +2 -2
  24. data/app/views/devise/registrations/edit.html.erb +6 -6
  25. data/app/views/devise/registrations/new.html.erb +5 -5
  26. data/app/views/devise/sessions/new.html.erb +5 -5
  27. data/app/views/devise/shared/_links.erb +1 -1
  28. data/app/views/devise/unlocks/new.html.erb +2 -2
  29. data/config/locales/en.yml +17 -16
  30. data/devise.gemspec +2 -2
  31. data/gemfiles/{Gemfile.rails-3.2.x → Gemfile.rails-3.2-stable} +8 -10
  32. data/gemfiles/Gemfile.rails-3.2-stable.lock +166 -0
  33. data/gemfiles/Gemfile.rails-4.0-stable +29 -0
  34. data/gemfiles/Gemfile.rails-4.0-stable.lock +162 -0
  35. data/gemfiles/Gemfile.rails-head +32 -0
  36. data/gemfiles/Gemfile.rails-head.lock +190 -0
  37. data/lib/devise/controllers/helpers.rb +84 -29
  38. data/lib/devise/controllers/rememberable.rb +3 -3
  39. data/lib/devise/controllers/scoped_views.rb +1 -1
  40. data/lib/devise/controllers/sign_in_out.rb +9 -10
  41. data/lib/devise/controllers/store_location.rb +56 -0
  42. data/lib/devise/controllers/url_helpers.rb +3 -1
  43. data/lib/devise/failure_app.rb +12 -10
  44. data/lib/devise/hooks/activatable.rb +5 -6
  45. data/lib/devise/hooks/csrf_cleaner.rb +3 -1
  46. data/lib/devise/hooks/lockable.rb +1 -1
  47. data/lib/devise/hooks/proxy.rb +2 -2
  48. data/lib/devise/hooks/rememberable.rb +2 -2
  49. data/lib/devise/hooks/timeoutable.rb +10 -3
  50. data/lib/devise/hooks/trackable.rb +1 -1
  51. data/lib/devise/mailers/helpers.rb +8 -8
  52. data/lib/devise/mapping.rb +4 -1
  53. data/lib/devise/models/authenticatable.rb +5 -5
  54. data/lib/devise/models/confirmable.rb +14 -14
  55. data/lib/devise/models/database_authenticatable.rb +18 -5
  56. data/lib/devise/models/lockable.rb +14 -11
  57. data/lib/devise/models/omniauthable.rb +1 -1
  58. data/lib/devise/models/recoverable.rb +23 -7
  59. data/lib/devise/models/rememberable.rb +6 -6
  60. data/lib/devise/models/timeoutable.rb +2 -2
  61. data/lib/devise/models/trackable.rb +5 -2
  62. data/lib/devise/models/validatable.rb +6 -6
  63. data/lib/devise/modules.rb +10 -10
  64. data/lib/devise/omniauth/url_helpers.rb +2 -2
  65. data/lib/devise/orm/active_record.rb +1 -1
  66. data/lib/devise/orm/mongoid.rb +1 -1
  67. data/lib/devise/rails/routes.rb +107 -78
  68. data/lib/devise/rails.rb +7 -1
  69. data/lib/devise/strategies/authenticatable.rb +11 -4
  70. data/lib/devise/strategies/base.rb +1 -1
  71. data/lib/devise/strategies/database_authenticatable.rb +7 -4
  72. data/lib/devise/test_helpers.rb +2 -2
  73. data/lib/devise/time_inflector.rb +2 -2
  74. data/lib/devise/version.rb +1 -1
  75. data/lib/devise.rb +15 -10
  76. data/lib/generators/active_record/devise_generator.rb +27 -10
  77. data/lib/generators/active_record/templates/migration.rb +4 -4
  78. data/lib/generators/active_record/templates/migration_existing.rb +4 -4
  79. data/lib/generators/devise/devise_generator.rb +5 -3
  80. data/lib/generators/devise/install_generator.rb +5 -0
  81. data/lib/generators/devise/views_generator.rb +31 -18
  82. data/lib/generators/mongoid/devise_generator.rb +20 -19
  83. data/lib/generators/templates/README +4 -4
  84. data/lib/generators/templates/devise.rb +20 -11
  85. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  86. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  87. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  88. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +2 -2
  89. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -4
  90. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +2 -2
  91. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +6 -6
  92. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +4 -4
  93. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +4 -4
  94. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +2 -2
  95. data/script/cached-bundle +49 -0
  96. data/script/s3-put +71 -0
  97. data/test/controllers/custom_registrations_controller_test.rb +35 -0
  98. data/test/controllers/helpers_test.rb +89 -31
  99. data/test/controllers/internal_helpers_test.rb +11 -8
  100. data/test/controllers/passwords_controller_test.rb +1 -1
  101. data/test/controllers/sessions_controller_test.rb +29 -25
  102. data/test/controllers/url_helpers_test.rb +4 -4
  103. data/test/delegator_test.rb +1 -1
  104. data/test/devise_test.rb +21 -8
  105. data/test/failure_app_test.rb +61 -25
  106. data/test/generators/active_record_generator_test.rb +10 -4
  107. data/test/generators/devise_generator_test.rb +2 -2
  108. data/test/generators/mongoid_generator_test.rb +3 -3
  109. data/test/generators/views_generator_test.rb +30 -1
  110. data/test/helpers/devise_helper_test.rb +14 -13
  111. data/test/integration/authenticatable_test.rb +61 -45
  112. data/test/integration/confirmable_test.rb +95 -55
  113. data/test/integration/database_authenticatable_test.rb +16 -16
  114. data/test/integration/http_authenticatable_test.rb +12 -12
  115. data/test/integration/lockable_test.rb +43 -43
  116. data/test/integration/omniauthable_test.rb +3 -3
  117. data/test/integration/recoverable_test.rb +53 -53
  118. data/test/integration/registerable_test.rb +90 -80
  119. data/test/integration/rememberable_test.rb +15 -15
  120. data/test/integration/timeoutable_test.rb +27 -16
  121. data/test/integration/trackable_test.rb +4 -4
  122. data/test/mailers/confirmation_instructions_test.rb +7 -7
  123. data/test/mailers/reset_password_instructions_test.rb +6 -6
  124. data/test/mailers/unlock_instructions_test.rb +5 -5
  125. data/test/mapping_test.rb +3 -3
  126. data/test/models/authenticatable_test.rb +3 -3
  127. data/test/models/confirmable_test.rb +32 -32
  128. data/test/models/database_authenticatable_test.rb +32 -27
  129. data/test/models/lockable_test.rb +57 -33
  130. data/test/models/recoverable_test.rb +34 -22
  131. data/test/models/rememberable_test.rb +29 -14
  132. data/test/models/serializable_test.rb +8 -8
  133. data/test/models/timeoutable_test.rb +1 -1
  134. data/test/models/trackable_test.rb +28 -0
  135. data/test/models/validatable_test.rb +13 -13
  136. data/test/omniauth/config_test.rb +4 -4
  137. data/test/omniauth/url_helpers_test.rb +3 -3
  138. data/test/orm/mongoid.rb +1 -1
  139. data/test/parameter_sanitizer_test.rb +1 -1
  140. data/test/rails_app/app/active_record/shim.rb +1 -1
  141. data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
  142. data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
  143. data/test/rails_app/app/controllers/admins/sessions_controller.rb +1 -1
  144. data/test/rails_app/app/controllers/admins_controller.rb +1 -1
  145. data/test/rails_app/app/controllers/application_controller.rb +5 -2
  146. data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
  147. data/test/rails_app/app/controllers/custom/registrations_controller.rb +21 -0
  148. data/test/rails_app/app/controllers/home_controller.rb +1 -1
  149. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +1 -1
  150. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +1 -1
  151. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +4 -4
  152. data/test/rails_app/app/controllers/users_controller.rb +6 -6
  153. data/test/rails_app/app/mailers/users/mailer.rb +4 -4
  154. data/test/rails_app/app/mongoid/admin.rb +11 -11
  155. data/test/rails_app/app/mongoid/shim.rb +2 -2
  156. data/test/rails_app/app/mongoid/user.rb +19 -19
  157. data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
  158. data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
  159. data/test/rails_app/app/views/admins/sessions/new.html.erb +1 -1
  160. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -1
  161. data/test/rails_app/app/views/home/index.html.erb +1 -1
  162. data/test/rails_app/app/views/home/join.html.erb +1 -1
  163. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -1
  164. data/test/rails_app/app/views/layouts/application.html.erb +1 -1
  165. data/test/rails_app/config/application.rb +2 -2
  166. data/test/rails_app/config/boot.rb +7 -1
  167. data/test/rails_app/config/environments/development.rb +0 -4
  168. data/test/rails_app/config/environments/production.rb +0 -4
  169. data/test/rails_app/config/initializers/devise.rb +7 -5
  170. data/test/rails_app/config/initializers/secret_token.rb +1 -1
  171. data/test/rails_app/config/routes.rb +60 -42
  172. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +7 -7
  173. data/test/rails_app/db/schema.rb +21 -17
  174. data/test/rails_app/lib/shared_admin.rb +4 -4
  175. data/test/rails_app/lib/shared_user.rb +1 -1
  176. data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
  177. data/test/routes_test.rb +72 -58
  178. data/test/support/action_controller/record_identifier.rb +10 -0
  179. data/test/support/assertions.rb +2 -3
  180. data/test/support/helpers.rb +4 -4
  181. data/test/support/integration.rb +14 -14
  182. data/test/support/mongoid.yml +6 -0
  183. data/test/test_helper.rb +2 -7
  184. data/test/test_helpers_test.rb +25 -35
  185. data/test/test_models.rb +12 -5
  186. metadata +53 -38
  187. data/gemfiles/Gemfile.rails-3.2.x.lock +0 -159
@@ -8,8 +8,8 @@ class LockableTest < ActiveSupport::TestCase
8
8
  test "should respect maximum attempts configuration" do
9
9
  user = create_user
10
10
  user.confirm!
11
- swap Devise, :maximum_attempts => 2 do
12
- 3.times { user.valid_for_authentication?{ false } }
11
+ swap Devise, maximum_attempts: 2 do
12
+ 2.times { user.valid_for_authentication?{ false } }
13
13
  assert user.reload.access_locked?
14
14
  end
15
15
  end
@@ -18,19 +18,19 @@ class LockableTest < ActiveSupport::TestCase
18
18
  user = create_user
19
19
  user.confirm!
20
20
 
21
- swap Devise, :maximum_attempts => 2 do
22
- 3.times { user.valid_for_authentication?{ false } }
21
+ swap Devise, maximum_attempts: 2 do
22
+ 2.times { user.valid_for_authentication?{ false } }
23
23
  assert user.reload.access_locked?
24
24
  end
25
25
 
26
26
  user.valid_for_authentication?{ true }
27
- assert_equal 4, user.reload.failed_attempts
27
+ assert_equal 3, user.reload.failed_attempts
28
28
  end
29
29
 
30
30
  test "should not touch failed_attempts if lock_strategy is none" do
31
31
  user = create_user
32
32
  user.confirm!
33
- swap Devise, :lock_strategy => :none, :maximum_attempts => 2 do
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?
36
36
  assert_equal 0, user.failed_attempts
@@ -77,7 +77,7 @@ class LockableTest < ActiveSupport::TestCase
77
77
  end
78
78
 
79
79
  test "should unlock user after unlock_in period" do
80
- swap Devise, :unlock_in => 3.hours do
80
+ swap Devise, unlock_in: 3.hours do
81
81
  user = new_user
82
82
  user.locked_at = 2.hours.ago
83
83
  assert user.access_locked?
@@ -88,7 +88,7 @@ class LockableTest < ActiveSupport::TestCase
88
88
  end
89
89
 
90
90
  test "should not unlock in 'unlock_in' if :time unlock strategy is not set" do
91
- swap Devise, :unlock_strategy => :email do
91
+ swap Devise, unlock_strategy: :email do
92
92
  user = new_user
93
93
  user.locked_at = 2.hours.ago
94
94
  assert user.access_locked?
@@ -114,7 +114,7 @@ class LockableTest < ActiveSupport::TestCase
114
114
  end
115
115
 
116
116
  test "should not generate unlock_token when :email is not an unlock strategy" do
117
- swap Devise, :unlock_strategy => :time do
117
+ swap Devise, unlock_strategy: :time do
118
118
  user = create_user
119
119
  user.lock_access!
120
120
  assert_nil user.unlock_token
@@ -122,7 +122,7 @@ class LockableTest < ActiveSupport::TestCase
122
122
  end
123
123
 
124
124
  test "should send email with unlock instructions when :email is an unlock strategy" do
125
- swap Devise, :unlock_strategy => :email do
125
+ swap Devise, unlock_strategy: :email do
126
126
  user = create_user
127
127
  assert_email_sent do
128
128
  user.lock_access!
@@ -130,8 +130,26 @@ class LockableTest < ActiveSupport::TestCase
130
130
  end
131
131
  end
132
132
 
133
+ test "doesn't send email when you pass option send_instructions to false" do
134
+ swap Devise, unlock_strategy: :email do
135
+ user = create_user
136
+ assert_email_not_sent do
137
+ user.lock_access! send_instructions: false
138
+ end
139
+ end
140
+ end
141
+
142
+ test "sends email when you pass options other than send_instructions" do
143
+ swap Devise, unlock_strategy: :email do
144
+ user = create_user
145
+ assert_email_sent do
146
+ user.lock_access! foo: :bar, bar: :foo
147
+ end
148
+ end
149
+ end
150
+
133
151
  test "should not send email with unlock instructions when :email is not an unlock strategy" do
134
- swap Devise, :unlock_strategy => :time do
152
+ swap Devise, unlock_strategy: :time do
135
153
  user = create_user
136
154
  assert_email_not_sent do
137
155
  user.lock_access!
@@ -162,32 +180,32 @@ class LockableTest < ActiveSupport::TestCase
162
180
  test 'should find a user to send unlock instructions' do
163
181
  user = create_user
164
182
  user.lock_access!
165
- unlock_user = User.send_unlock_instructions(:email => user.email)
183
+ unlock_user = User.send_unlock_instructions(email: user.email)
166
184
  assert_equal unlock_user, user
167
185
  end
168
186
 
169
187
  test 'should return a new user if no email was found' do
170
- unlock_user = User.send_unlock_instructions(:email => "invalid@example.com")
188
+ unlock_user = User.send_unlock_instructions(email: "invalid@example.com")
171
189
  assert_not unlock_user.persisted?
172
190
  end
173
191
 
174
192
  test 'should add error to new user email if no email was found' do
175
- unlock_user = User.send_unlock_instructions(:email => "invalid@example.com")
193
+ unlock_user = User.send_unlock_instructions(email: "invalid@example.com")
176
194
  assert_equal 'not found', unlock_user.errors[:email].join
177
195
  end
178
196
 
179
197
  test 'should find a user to send unlock instructions by authentication_keys' do
180
- swap Devise, :authentication_keys => [:username, :email] do
198
+ swap Devise, authentication_keys: [:username, :email] do
181
199
  user = create_user
182
- unlock_user = User.send_unlock_instructions(:email => user.email, :username => user.username)
200
+ unlock_user = User.send_unlock_instructions(email: user.email, username: user.username)
183
201
  assert_equal unlock_user, user
184
202
  end
185
203
  end
186
204
 
187
205
  test 'should require all unlock_keys' do
188
- swap Devise, :unlock_keys => [:username, :email] do
206
+ swap Devise, unlock_keys: [:username, :email] do
189
207
  user = create_user
190
- unlock_user = User.send_unlock_instructions(:email => user.email)
208
+ unlock_user = User.send_unlock_instructions(email: user.email)
191
209
  assert_not unlock_user.persisted?
192
210
  assert_equal "can't be blank", unlock_user.errors[:username].join
193
211
  end
@@ -201,7 +219,7 @@ class LockableTest < ActiveSupport::TestCase
201
219
  end
202
220
 
203
221
  test 'should not be able to send instructions if the user if not locked and have username as unlock key' do
204
- swap Devise, :unlock_keys => [:username] do
222
+ swap Devise, unlock_keys: [:username] do
205
223
  user = create_user
206
224
  assert_not user.resend_unlock_instructions
207
225
  assert_not user.access_locked?
@@ -210,7 +228,7 @@ class LockableTest < ActiveSupport::TestCase
210
228
  end
211
229
 
212
230
  test 'should unlock account if lock has expired and increase attempts on failure' do
213
- swap Devise, :unlock_in => 1.minute do
231
+ swap Devise, unlock_in: 1.minute do
214
232
  user = create_user
215
233
  user.confirm!
216
234
 
@@ -223,7 +241,7 @@ class LockableTest < ActiveSupport::TestCase
223
241
  end
224
242
 
225
243
  test 'should unlock account if lock has expired on success' do
226
- swap Devise, :unlock_in => 1.minute do
244
+ swap Devise, unlock_in: 1.minute do
227
245
  user = create_user
228
246
  user.confirm!
229
247
 
@@ -237,8 +255,8 @@ class LockableTest < ActiveSupport::TestCase
237
255
  end
238
256
 
239
257
  test 'required_fields should contain the all the fields when all the strategies are enabled' do
240
- swap Devise, :unlock_strategy => :both do
241
- swap Devise, :lock_strategy => :failed_attempts do
258
+ swap Devise, unlock_strategy: :both do
259
+ swap Devise, lock_strategy: :failed_attempts do
242
260
  assert_same_content Devise::Models::Lockable.required_fields(User), [
243
261
  :failed_attempts,
244
262
  :locked_at,
@@ -249,8 +267,8 @@ class LockableTest < ActiveSupport::TestCase
249
267
  end
250
268
 
251
269
  test 'required_fields should contain only failed_attempts and locked_at when the strategies are time and failed_attempts are enabled' do
252
- swap Devise, :unlock_strategy => :time do
253
- swap Devise, :lock_strategy => :failed_attempts do
270
+ swap Devise, unlock_strategy: :time do
271
+ swap Devise, lock_strategy: :failed_attempts do
254
272
  assert_same_content Devise::Models::Lockable.required_fields(User), [
255
273
  :failed_attempts,
256
274
  :locked_at
@@ -260,8 +278,8 @@ class LockableTest < ActiveSupport::TestCase
260
278
  end
261
279
 
262
280
  test 'required_fields should contain only failed_attempts and unlock_token when the strategies are token and failed_attempts are enabled' do
263
- swap Devise, :unlock_strategy => :email do
264
- swap Devise, :lock_strategy => :failed_attempts do
281
+ swap Devise, unlock_strategy: :email do
282
+ swap Devise, lock_strategy: :failed_attempts do
265
283
  assert_same_content Devise::Models::Lockable.required_fields(User), [
266
284
  :failed_attempts,
267
285
  :unlock_token
@@ -271,7 +289,7 @@ class LockableTest < ActiveSupport::TestCase
271
289
  end
272
290
 
273
291
  test 'should not return a locked unauthenticated message if in paranoid mode' do
274
- swap Devise, :paranoid => :true do
292
+ swap Devise, paranoid: :true do
275
293
  user = create_user
276
294
  user.failed_attempts = Devise.maximum_attempts + 1
277
295
  user.lock_access!
@@ -281,18 +299,24 @@ class LockableTest < ActiveSupport::TestCase
281
299
  end
282
300
 
283
301
  test 'should return last attempt message if user made next-to-last attempt of password entering' do
284
- swap Devise, :last_attempt_warning => :true do
285
- swap Devise, :lock_strategy => :failed_attempts do
302
+ swap Devise, last_attempt_warning: :true do
303
+ swap Devise, lock_strategy: :failed_attempts do
286
304
  user = create_user
287
- user.failed_attempts = Devise.maximum_attempts - 1
305
+ user.failed_attempts = Devise.maximum_attempts - 2
288
306
  assert_equal :invalid, user.unauthenticated_message
289
307
 
290
- user.failed_attempts = Devise.maximum_attempts
308
+ user.failed_attempts = Devise.maximum_attempts - 1
291
309
  assert_equal :last_attempt, user.unauthenticated_message
292
310
 
293
- user.failed_attempts = Devise.maximum_attempts + 1
311
+ user.failed_attempts = Devise.maximum_attempts
294
312
  assert_equal :locked, user.unauthenticated_message
295
313
  end
296
314
  end
297
315
  end
316
+
317
+ test 'should return locked message if user was programatically locked' do
318
+ user = create_user
319
+ user.lock_access!
320
+ assert_equal :locked, user.unauthenticated_message
321
+ end
298
322
  end
@@ -67,28 +67,28 @@ class RecoverableTest < ActiveSupport::TestCase
67
67
 
68
68
  test 'should find a user to send instructions by email' do
69
69
  user = create_user
70
- reset_password_user = User.send_reset_password_instructions(:email => user.email)
70
+ reset_password_user = User.send_reset_password_instructions(email: user.email)
71
71
  assert_equal reset_password_user, user
72
72
  end
73
73
 
74
74
  test 'should return a new record with errors if user was not found by e-mail' do
75
- reset_password_user = User.send_reset_password_instructions(:email => "invalid@example.com")
75
+ reset_password_user = User.send_reset_password_instructions(email: "invalid@example.com")
76
76
  assert_not reset_password_user.persisted?
77
77
  assert_equal "not found", reset_password_user.errors[:email].join
78
78
  end
79
79
 
80
80
  test 'should find a user to send instructions by authentication_keys' do
81
- swap Devise, :authentication_keys => [:username, :email] do
81
+ swap Devise, authentication_keys: [:username, :email] do
82
82
  user = create_user
83
- reset_password_user = User.send_reset_password_instructions(:email => user.email, :username => user.username)
83
+ reset_password_user = User.send_reset_password_instructions(email: user.email, username: user.username)
84
84
  assert_equal reset_password_user, user
85
85
  end
86
86
  end
87
87
 
88
88
  test 'should require all reset_password_keys' do
89
- swap Devise, :reset_password_keys => [:username, :email] do
89
+ swap Devise, reset_password_keys: [:username, :email] do
90
90
  user = create_user
91
- reset_password_user = User.send_reset_password_instructions(:email => user.email)
91
+ reset_password_user = User.send_reset_password_instructions(email: user.email)
92
92
  assert_not reset_password_user.persisted?
93
93
  assert_equal "can't be blank", reset_password_user.errors[:username].join
94
94
  end
@@ -97,33 +97,33 @@ class RecoverableTest < ActiveSupport::TestCase
97
97
  test 'should reset reset_password_token before send the reset instructions email' do
98
98
  user = create_user
99
99
  token = user.reset_password_token
100
- User.send_reset_password_instructions(:email => user.email)
100
+ User.send_reset_password_instructions(email: user.email)
101
101
  assert_not_equal token, user.reload.reset_password_token
102
102
  end
103
103
 
104
- test 'should send email instructions to the user reset his password' do
104
+ test 'should send email instructions to the user reset their password' do
105
105
  user = create_user
106
106
  assert_email_sent do
107
- User.send_reset_password_instructions(:email => user.email)
107
+ User.send_reset_password_instructions(email: user.email)
108
108
  end
109
109
  end
110
110
 
111
- test 'should find a user to reset his password based on the raw token' do
111
+ test 'should find a user to reset their password based on the raw token' do
112
112
  user = create_user
113
113
  raw = user.send_reset_password_instructions
114
114
 
115
- reset_password_user = User.reset_password_by_token(:reset_password_token => raw)
115
+ reset_password_user = User.reset_password_by_token(reset_password_token: raw)
116
116
  assert_equal reset_password_user, user
117
117
  end
118
118
 
119
119
  test 'should return a new record with errors if no reset_password_token is found' do
120
- reset_password_user = User.reset_password_by_token(:reset_password_token => 'invalid_token')
120
+ reset_password_user = User.reset_password_by_token(reset_password_token: 'invalid_token')
121
121
  assert_not reset_password_user.persisted?
122
122
  assert_equal "is invalid", reset_password_user.errors[:reset_password_token].join
123
123
  end
124
124
 
125
125
  test 'should return a new record with errors if reset_password_token is blank' do
126
- reset_password_user = User.reset_password_by_token(:reset_password_token => '')
126
+ reset_password_user = User.reset_password_by_token(reset_password_token: '')
127
127
  assert_not reset_password_user.persisted?
128
128
  assert_match "can't be blank", reset_password_user.errors[:reset_password_token].join
129
129
  end
@@ -132,7 +132,7 @@ class RecoverableTest < ActiveSupport::TestCase
132
132
  user = create_user
133
133
  raw = user.send_reset_password_instructions
134
134
 
135
- reset_password_user = User.reset_password_by_token(:reset_password_token => raw, :password => '')
135
+ reset_password_user = User.reset_password_by_token(reset_password_token: raw, password: '')
136
136
  assert_not reset_password_user.errors.empty?
137
137
  assert_match "can't be blank", reset_password_user.errors[:password].join
138
138
  end
@@ -143,9 +143,9 @@ class RecoverableTest < ActiveSupport::TestCase
143
143
  raw = user.send_reset_password_instructions
144
144
 
145
145
  User.reset_password_by_token(
146
- :reset_password_token => raw,
147
- :password => 'new_password',
148
- :password_confirmation => 'new_password'
146
+ reset_password_token: raw,
147
+ password: 'new_password',
148
+ password_confirmation: 'new_password'
149
149
  )
150
150
  user.reload
151
151
 
@@ -154,7 +154,7 @@ class RecoverableTest < ActiveSupport::TestCase
154
154
  end
155
155
 
156
156
  test 'should not reset password after reset_password_within time' do
157
- swap Devise, :reset_password_within => 1.hour do
157
+ swap Devise, reset_password_within: 1.hour do
158
158
  user = create_user
159
159
  raw = user.send_reset_password_instructions
160
160
 
@@ -163,9 +163,9 @@ class RecoverableTest < ActiveSupport::TestCase
163
163
  user.save!
164
164
 
165
165
  reset_password_user = User.reset_password_by_token(
166
- :reset_password_token => raw,
167
- :password => 'new_password',
168
- :password_confirmation => 'new_password'
166
+ reset_password_token: raw,
167
+ password: 'new_password',
168
+ password_confirmation: 'new_password'
169
169
  )
170
170
  user.reload
171
171
 
@@ -180,5 +180,17 @@ class RecoverableTest < ActiveSupport::TestCase
180
180
  :reset_password_sent_at,
181
181
  :reset_password_token
182
182
  ]
183
- end
183
+ end
184
+
185
+ test 'should return a user based on the raw token' do
186
+ user = create_user
187
+ raw = user.send_reset_password_instructions
188
+
189
+ assert_equal User.with_reset_password_token(raw), user
190
+ end
191
+
192
+ test 'should return nil if a user based on the raw token is not found' do
193
+ assert_equal User.with_reset_password_token('random-token'), nil
194
+ end
195
+
184
196
  end
@@ -55,12 +55,27 @@ class RememberableTest < ActiveSupport::TestCase
55
55
  assert resource_class.new.respond_to?(:remember_me=)
56
56
  end
57
57
 
58
- test 'forget_me should clear remember_created_at' do
59
- resource = create_resource
60
- resource.remember_me!
61
- assert_not resource.remember_created_at.nil?
62
- resource.forget_me!
63
- assert resource.remember_created_at.nil?
58
+ test 'forget_me should clear remember_created_at if expire_all_remember_me_on_sign_out is true' do
59
+ swap Devise, expire_all_remember_me_on_sign_out: true do
60
+ resource = create_resource
61
+ resource.remember_me!
62
+ assert_not_nil resource.remember_created_at
63
+
64
+ resource.forget_me!
65
+ assert_nil resource.remember_created_at
66
+ end
67
+ end
68
+
69
+ test 'forget_me should not clear remember_created_at if expire_all_remember_me_on_sign_out is false' do
70
+ swap Devise, expire_all_remember_me_on_sign_out: false do
71
+ resource = create_resource
72
+ resource.remember_me!
73
+
74
+ assert_not_nil resource.remember_created_at
75
+
76
+ resource.forget_me!
77
+ assert_not_nil resource.remember_created_at
78
+ end
64
79
  end
65
80
 
66
81
  test 'forget_me should not try to update resource if it has been destroyed' do
@@ -86,7 +101,7 @@ class RememberableTest < ActiveSupport::TestCase
86
101
  end
87
102
 
88
103
  test 'remember for should fallback to devise remember for default configuration' do
89
- swap Devise, :remember_for => 1.day do
104
+ swap Devise, remember_for: 1.day do
90
105
  resource = create_resource
91
106
  resource.remember_me!
92
107
  assert_not resource.remember_expired?
@@ -94,7 +109,7 @@ class RememberableTest < ActiveSupport::TestCase
94
109
  end
95
110
 
96
111
  test 'remember expires at should sum date of creation with remember for configuration' do
97
- swap Devise, :remember_for => 3.days do
112
+ swap Devise, remember_for: 3.days do
98
113
  resource = create_resource
99
114
  resource.remember_me!
100
115
  assert_equal 3.days.from_now.to_date, resource.remember_expires_at.to_date
@@ -105,7 +120,7 @@ class RememberableTest < ActiveSupport::TestCase
105
120
  end
106
121
 
107
122
  test 'remember should be expired if remember_for is zero' do
108
- swap Devise, :remember_for => 0.days do
123
+ swap Devise, remember_for: 0.days do
109
124
  Devise.remember_for = 0.days
110
125
  resource = create_resource
111
126
  resource.remember_me!
@@ -114,7 +129,7 @@ class RememberableTest < ActiveSupport::TestCase
114
129
  end
115
130
 
116
131
  test 'remember should be expired if it was created before limit time' do
117
- swap Devise, :remember_for => 1.day do
132
+ swap Devise, remember_for: 1.day do
118
133
  resource = create_resource
119
134
  resource.remember_me!
120
135
  resource.remember_created_at = 2.days.ago
@@ -124,7 +139,7 @@ class RememberableTest < ActiveSupport::TestCase
124
139
  end
125
140
 
126
141
  test 'remember should not be expired if it was created within the limit time' do
127
- swap Devise, :remember_for => 30.days do
142
+ swap Devise, remember_for: 30.days do
128
143
  resource = create_resource
129
144
  resource.remember_me!
130
145
  resource.remember_created_at = (30.days.ago + 2.minutes)
@@ -134,7 +149,7 @@ class RememberableTest < ActiveSupport::TestCase
134
149
  end
135
150
 
136
151
  test 'if extend_remember_period is false, remember_me! should generate a new timestamp if expired' do
137
- swap Devise, :remember_for => 5.minutes do
152
+ swap Devise, remember_for: 5.minutes do
138
153
  resource = create_resource
139
154
  resource.remember_me!(false)
140
155
  assert resource.remember_created_at
@@ -148,7 +163,7 @@ class RememberableTest < ActiveSupport::TestCase
148
163
  end
149
164
 
150
165
  test 'if extend_remember_period is false, remember_me! should not generate a new timestamp' do
151
- swap Devise, :remember_for => 1.year do
166
+ swap Devise, remember_for: 1.year do
152
167
  resource = create_resource
153
168
  resource.remember_me!(false)
154
169
  assert resource.remember_created_at
@@ -162,7 +177,7 @@ class RememberableTest < ActiveSupport::TestCase
162
177
  end
163
178
 
164
179
  test 'if extend_remember_period is true, remember_me! should always generate a new timestamp' do
165
- swap Devise, :remember_for => 1.year do
180
+ swap Devise, remember_for: 1.year do
166
181
  resource = create_resource
167
182
  resource.remember_me!(true)
168
183
  assert resource.remember_created_at
@@ -11,13 +11,13 @@ class SerializableTest < ActiveSupport::TestCase
11
11
  end
12
12
 
13
13
  test 'should not include unsafe keys on XML even if a new except is provided' do
14
- assert_no_match(/email/, @user.to_xml(:except => :email))
15
- assert_no_match(/confirmation-token/, @user.to_xml(:except => :email))
14
+ assert_no_match(/email/, @user.to_xml(except: :email))
15
+ assert_no_match(/confirmation-token/, @user.to_xml(except: :email))
16
16
  end
17
17
 
18
18
  test 'should include unsafe keys on XML if a force_except is provided' do
19
- assert_no_match(/<email/, @user.to_xml(:force_except => :email))
20
- assert_match(/confirmation-token/, @user.to_xml(:force_except => :email))
19
+ assert_no_match(/<email/, @user.to_xml(force_except: :email))
20
+ assert_match(/confirmation-token/, @user.to_xml(force_except: :email))
21
21
  end
22
22
 
23
23
  test 'should not include unsafe keys on JSON' do
@@ -26,13 +26,13 @@ class SerializableTest < ActiveSupport::TestCase
26
26
  end
27
27
 
28
28
  test 'should not include unsafe keys on JSON even if a new except is provided' do
29
- assert_no_key "email", from_json(:except => :email)
30
- assert_no_key "confirmation_token", from_json(:except => :email)
29
+ assert_no_key "email", from_json(except: :email)
30
+ assert_no_key "confirmation_token", from_json(except: :email)
31
31
  end
32
32
 
33
33
  test 'should include unsafe keys on JSON if a force_except is provided' do
34
- assert_no_key "email", from_json(:force_except => :email)
35
- assert_key "confirmation_token", from_json(:force_except => :email)
34
+ assert_no_key "email", from_json(force_except: :email)
35
+ assert_key "confirmation_token", from_json(force_except: :email)
36
36
  end
37
37
 
38
38
  def assert_key(key, subject)
@@ -29,7 +29,7 @@ class TimeoutableTest < ActiveSupport::TestCase
29
29
  end
30
30
 
31
31
  test 'fallback to Devise config option' do
32
- swap Devise, :timeout_in => 1.minute do
32
+ swap Devise, timeout_in: 1.minute do
33
33
  user = new_user
34
34
  assert user.timedout?(2.minutes.ago)
35
35
  assert_not user.timedout?(30.seconds.ago)
@@ -10,4 +10,32 @@ class TrackableTest < ActiveSupport::TestCase
10
10
  :sign_in_count
11
11
  ]
12
12
  end
13
+
14
+ test 'update_tracked_fields should only set attributes but not save the record' do
15
+ user = create_user
16
+ request = mock
17
+ request.stubs(:remote_ip).returns("127.0.0.1")
18
+
19
+ assert_nil user.current_sign_in_ip
20
+ assert_nil user.last_sign_in_ip
21
+ assert_nil user.current_sign_in_at
22
+ assert_nil user.last_sign_in_at
23
+ assert_equal 0, user.sign_in_count
24
+
25
+ user.update_tracked_fields(request)
26
+
27
+ assert_equal "127.0.0.1", user.current_sign_in_ip
28
+ assert_equal "127.0.0.1", user.last_sign_in_ip
29
+ assert_not_nil user.current_sign_in_at
30
+ assert_not_nil user.last_sign_in_at
31
+ assert_equal 1, user.sign_in_count
32
+
33
+ user.reload
34
+
35
+ assert_nil user.current_sign_in_ip
36
+ assert_nil user.last_sign_in_ip
37
+ assert_nil user.current_sign_in_at
38
+ assert_nil user.last_sign_in_at
39
+ assert_equal 0, user.sign_in_count
40
+ end
13
41
  end
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
 
4
4
  class ValidatableTest < ActiveSupport::TestCase
5
5
  test 'should require email to be set' do
6
- user = new_user(:email => nil)
6
+ user = new_user(email: nil)
7
7
  assert user.invalid?
8
8
  assert user.errors[:email]
9
9
  assert_equal 'can\'t be blank', user.errors[:email].join
@@ -12,7 +12,7 @@ class ValidatableTest < ActiveSupport::TestCase
12
12
  test 'should require uniqueness of email if email has changed, allowing blank' do
13
13
  existing_user = create_user
14
14
 
15
- user = new_user(:email => '')
15
+ user = new_user(email: '')
16
16
  assert user.invalid?
17
17
  assert_no_match(/taken/, user.errors[:email].join)
18
18
 
@@ -20,12 +20,12 @@ class ValidatableTest < ActiveSupport::TestCase
20
20
  assert user.invalid?
21
21
  assert_match(/taken/, user.errors[:email].join)
22
22
 
23
- user.save(:validate => false)
23
+ user.save(validate: false)
24
24
  assert user.valid?
25
25
  end
26
26
 
27
27
  test 'should require correct email format if email has changed, allowing blank' do
28
- user = new_user(:email => '')
28
+ user = new_user(email: '')
29
29
  assert user.invalid?
30
30
  assert_not_equal 'is invalid', user.errors[:email].join
31
31
 
@@ -35,26 +35,26 @@ class ValidatableTest < ActiveSupport::TestCase
35
35
  assert_equal 'is invalid', user.errors[:email].join
36
36
  end
37
37
 
38
- user.save(:validate => false)
38
+ user.save(validate: false)
39
39
  assert user.valid?
40
40
  end
41
41
 
42
42
  test 'should accept valid emails' do
43
43
  %w(a.b.c@example.com test_mail@gmail.com any@any.net email@test.br 123@mail.test 1☃3@mail.test).each do |email|
44
- user = new_user(:email => email)
44
+ user = new_user(email: email)
45
45
  assert user.valid?, 'should be valid with email ' << email
46
46
  assert_blank user.errors[:email]
47
47
  end
48
48
  end
49
49
 
50
50
  test 'should require password to be set when creating a new record' do
51
- user = new_user(:password => '', :password_confirmation => '')
51
+ user = new_user(password: '', password_confirmation: '')
52
52
  assert user.invalid?
53
53
  assert_equal 'can\'t be blank', user.errors[:password].join
54
54
  end
55
55
 
56
56
  test 'should require confirmation to be set when creating a new record' do
57
- user = new_user(:password => 'new_password', :password_confirmation => 'blabla')
57
+ user = new_user(password: 'new_password', password_confirmation: 'blabla')
58
58
  assert user.invalid?
59
59
 
60
60
  if Devise.rails4?
@@ -86,14 +86,14 @@ class ValidatableTest < ActiveSupport::TestCase
86
86
  end
87
87
  end
88
88
 
89
- test 'should require a password with minimum of 6 characters' do
90
- user = new_user(:password => '12345', :password_confirmation => '12345')
89
+ test 'should require a password with minimum of 7 characters' do
90
+ user = new_user(password: '12345', password_confirmation: '12345')
91
91
  assert user.invalid?
92
- assert_equal 'is too short (minimum is 6 characters)', user.errors[:password].join
92
+ assert_equal 'is too short (minimum is 7 characters)', user.errors[:password].join
93
93
  end
94
94
 
95
95
  test 'should require a password with maximum of 128 characters long' do
96
- user = new_user(:password => 'x'*129, :password_confirmation => 'x'*129)
96
+ user = new_user(password: 'x'*129, password_confirmation: 'x'*129)
97
97
  assert user.invalid?
98
98
  assert_equal 'is too long (maximum is 128 characters)', user.errors[:password].join
99
99
  end
@@ -109,7 +109,7 @@ class ValidatableTest < ActiveSupport::TestCase
109
109
  end
110
110
 
111
111
  test 'should complain about length even if password is not required' do
112
- user = new_user(:password => 'x'*129, :password_confirmation => 'x'*129)
112
+ user = new_user(password: 'x'*129, password_confirmation: 'x'*129)
113
113
  user.stubs(:password_required?).returns(false)
114
114
  assert user.invalid?
115
115
  assert_equal 'is too long (maximum is 128 characters)', user.errors[:password].join
@@ -11,12 +11,12 @@ class OmniAuthConfigTest < ActiveSupport::TestCase
11
11
  end
12
12
 
13
13
  test 'strategy_name returns provider if no name option are given' do
14
- config = Devise::OmniAuth::Config.new :facebook, [{ :other => :option }]
14
+ config = Devise::OmniAuth::Config.new :facebook, [{ other: :option }]
15
15
  assert_equal :facebook, config.strategy_name
16
16
  end
17
17
 
18
18
  test 'returns name option when have a name' do
19
- config = Devise::OmniAuth::Config.new :facebook, [{ :name => :github }]
19
+ config = Devise::OmniAuth::Config.new :facebook, [{ name: :github }]
20
20
  assert_equal :github, config.strategy_name
21
21
  end
22
22
 
@@ -50,8 +50,8 @@ class OmniAuthConfigTest < ActiveSupport::TestCase
50
50
  end
51
51
 
52
52
  test 'allows the user to define a custom require path' do
53
- config = Devise::OmniAuth::Config.new :my_strategy, [{:strategy_class => MyStrategy}]
53
+ config = Devise::OmniAuth::Config.new :my_strategy, [{strategy_class: MyStrategy}]
54
54
  config_class = config.strategy_class
55
55
  assert_equal MyStrategy, config_class
56
56
  end
57
- end
57
+ end