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.
- checksums.yaml +7 -0
- data/.travis.yml +18 -3
- data/CHANGELOG.md +82 -9
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +7 -9
- data/Gemfile.lock +102 -96
- data/MIT-LICENSE +1 -1
- data/README.md +94 -42
- data/Rakefile +1 -1
- data/app/controllers/devise/confirmations_controller.rb +5 -3
- data/app/controllers/devise/omniauth_callbacks_controller.rb +2 -2
- data/app/controllers/devise/passwords_controller.rb +5 -3
- data/app/controllers/devise/registrations_controller.rb +26 -10
- data/app/controllers/devise/sessions_controller.rb +39 -14
- data/app/controllers/devise/unlocks_controller.rb +4 -2
- data/app/controllers/devise_controller.rb +6 -6
- data/app/helpers/devise_helper.rb +2 -2
- data/app/views/devise/confirmations/new.html.erb +2 -2
- data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
- data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
- data/app/views/devise/passwords/edit.html.erb +3 -3
- data/app/views/devise/passwords/new.html.erb +2 -2
- data/app/views/devise/registrations/edit.html.erb +6 -6
- data/app/views/devise/registrations/new.html.erb +5 -5
- data/app/views/devise/sessions/new.html.erb +5 -5
- data/app/views/devise/shared/_links.erb +1 -1
- data/app/views/devise/unlocks/new.html.erb +2 -2
- data/config/locales/en.yml +17 -16
- data/devise.gemspec +2 -2
- data/gemfiles/{Gemfile.rails-3.2.x → Gemfile.rails-3.2-stable} +8 -10
- data/gemfiles/Gemfile.rails-3.2-stable.lock +166 -0
- data/gemfiles/Gemfile.rails-4.0-stable +29 -0
- data/gemfiles/Gemfile.rails-4.0-stable.lock +162 -0
- data/gemfiles/Gemfile.rails-head +32 -0
- data/gemfiles/Gemfile.rails-head.lock +190 -0
- data/lib/devise/controllers/helpers.rb +84 -29
- data/lib/devise/controllers/rememberable.rb +3 -3
- data/lib/devise/controllers/scoped_views.rb +1 -1
- data/lib/devise/controllers/sign_in_out.rb +9 -10
- data/lib/devise/controllers/store_location.rb +56 -0
- data/lib/devise/controllers/url_helpers.rb +3 -1
- data/lib/devise/failure_app.rb +12 -10
- data/lib/devise/hooks/activatable.rb +5 -6
- data/lib/devise/hooks/csrf_cleaner.rb +3 -1
- data/lib/devise/hooks/lockable.rb +1 -1
- data/lib/devise/hooks/proxy.rb +2 -2
- data/lib/devise/hooks/rememberable.rb +2 -2
- data/lib/devise/hooks/timeoutable.rb +10 -3
- data/lib/devise/hooks/trackable.rb +1 -1
- data/lib/devise/mailers/helpers.rb +8 -8
- data/lib/devise/mapping.rb +4 -1
- data/lib/devise/models/authenticatable.rb +5 -5
- data/lib/devise/models/confirmable.rb +14 -14
- data/lib/devise/models/database_authenticatable.rb +18 -5
- data/lib/devise/models/lockable.rb +14 -11
- data/lib/devise/models/omniauthable.rb +1 -1
- data/lib/devise/models/recoverable.rb +23 -7
- data/lib/devise/models/rememberable.rb +6 -6
- data/lib/devise/models/timeoutable.rb +2 -2
- data/lib/devise/models/trackable.rb +5 -2
- data/lib/devise/models/validatable.rb +6 -6
- data/lib/devise/modules.rb +10 -10
- data/lib/devise/omniauth/url_helpers.rb +2 -2
- data/lib/devise/orm/active_record.rb +1 -1
- data/lib/devise/orm/mongoid.rb +1 -1
- data/lib/devise/rails/routes.rb +107 -78
- data/lib/devise/rails.rb +7 -1
- data/lib/devise/strategies/authenticatable.rb +11 -4
- data/lib/devise/strategies/base.rb +1 -1
- data/lib/devise/strategies/database_authenticatable.rb +7 -4
- data/lib/devise/test_helpers.rb +2 -2
- data/lib/devise/time_inflector.rb +2 -2
- data/lib/devise/version.rb +1 -1
- data/lib/devise.rb +15 -10
- data/lib/generators/active_record/devise_generator.rb +27 -10
- data/lib/generators/active_record/templates/migration.rb +4 -4
- data/lib/generators/active_record/templates/migration_existing.rb +4 -4
- data/lib/generators/devise/devise_generator.rb +5 -3
- data/lib/generators/devise/install_generator.rb +5 -0
- data/lib/generators/devise/views_generator.rb +31 -18
- data/lib/generators/mongoid/devise_generator.rb +20 -19
- data/lib/generators/templates/README +4 -4
- data/lib/generators/templates/devise.rb +20 -11
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +2 -2
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -4
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +2 -2
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +6 -6
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +4 -4
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +4 -4
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +2 -2
- data/script/cached-bundle +49 -0
- data/script/s3-put +71 -0
- data/test/controllers/custom_registrations_controller_test.rb +35 -0
- data/test/controllers/helpers_test.rb +89 -31
- data/test/controllers/internal_helpers_test.rb +11 -8
- data/test/controllers/passwords_controller_test.rb +1 -1
- data/test/controllers/sessions_controller_test.rb +29 -25
- data/test/controllers/url_helpers_test.rb +4 -4
- data/test/delegator_test.rb +1 -1
- data/test/devise_test.rb +21 -8
- data/test/failure_app_test.rb +61 -25
- data/test/generators/active_record_generator_test.rb +10 -4
- data/test/generators/devise_generator_test.rb +2 -2
- data/test/generators/mongoid_generator_test.rb +3 -3
- data/test/generators/views_generator_test.rb +30 -1
- data/test/helpers/devise_helper_test.rb +14 -13
- data/test/integration/authenticatable_test.rb +61 -45
- data/test/integration/confirmable_test.rb +95 -55
- data/test/integration/database_authenticatable_test.rb +16 -16
- data/test/integration/http_authenticatable_test.rb +12 -12
- data/test/integration/lockable_test.rb +43 -43
- data/test/integration/omniauthable_test.rb +3 -3
- data/test/integration/recoverable_test.rb +53 -53
- data/test/integration/registerable_test.rb +90 -80
- data/test/integration/rememberable_test.rb +15 -15
- data/test/integration/timeoutable_test.rb +27 -16
- data/test/integration/trackable_test.rb +4 -4
- data/test/mailers/confirmation_instructions_test.rb +7 -7
- data/test/mailers/reset_password_instructions_test.rb +6 -6
- data/test/mailers/unlock_instructions_test.rb +5 -5
- data/test/mapping_test.rb +3 -3
- data/test/models/authenticatable_test.rb +3 -3
- data/test/models/confirmable_test.rb +32 -32
- data/test/models/database_authenticatable_test.rb +32 -27
- data/test/models/lockable_test.rb +57 -33
- data/test/models/recoverable_test.rb +34 -22
- data/test/models/rememberable_test.rb +29 -14
- data/test/models/serializable_test.rb +8 -8
- data/test/models/timeoutable_test.rb +1 -1
- data/test/models/trackable_test.rb +28 -0
- data/test/models/validatable_test.rb +13 -13
- data/test/omniauth/config_test.rb +4 -4
- data/test/omniauth/url_helpers_test.rb +3 -3
- data/test/orm/mongoid.rb +1 -1
- data/test/parameter_sanitizer_test.rb +1 -1
- data/test/rails_app/app/active_record/shim.rb +1 -1
- data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
- data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +1 -1
- data/test/rails_app/app/controllers/admins_controller.rb +1 -1
- data/test/rails_app/app/controllers/application_controller.rb +5 -2
- data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +21 -0
- data/test/rails_app/app/controllers/home_controller.rb +1 -1
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +1 -1
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +1 -1
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +4 -4
- data/test/rails_app/app/controllers/users_controller.rb +6 -6
- data/test/rails_app/app/mailers/users/mailer.rb +4 -4
- data/test/rails_app/app/mongoid/admin.rb +11 -11
- data/test/rails_app/app/mongoid/shim.rb +2 -2
- data/test/rails_app/app/mongoid/user.rb +19 -19
- data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
- data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
- data/test/rails_app/app/views/admins/sessions/new.html.erb +1 -1
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -1
- data/test/rails_app/app/views/home/index.html.erb +1 -1
- data/test/rails_app/app/views/home/join.html.erb +1 -1
- data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -1
- data/test/rails_app/app/views/layouts/application.html.erb +1 -1
- data/test/rails_app/config/application.rb +2 -2
- data/test/rails_app/config/boot.rb +7 -1
- data/test/rails_app/config/environments/development.rb +0 -4
- data/test/rails_app/config/environments/production.rb +0 -4
- data/test/rails_app/config/initializers/devise.rb +7 -5
- data/test/rails_app/config/initializers/secret_token.rb +1 -1
- data/test/rails_app/config/routes.rb +60 -42
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +7 -7
- data/test/rails_app/db/schema.rb +21 -17
- data/test/rails_app/lib/shared_admin.rb +4 -4
- data/test/rails_app/lib/shared_user.rb +1 -1
- data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
- data/test/routes_test.rb +72 -58
- data/test/support/action_controller/record_identifier.rb +10 -0
- data/test/support/assertions.rb +2 -3
- data/test/support/helpers.rb +4 -4
- data/test/support/integration.rb +14 -14
- data/test/support/mongoid.yml +6 -0
- data/test/test_helper.rb +2 -7
- data/test/test_helpers_test.rb +25 -35
- data/test/test_models.rb +12 -5
- metadata +53 -38
- 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, :
|
12
|
-
|
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, :
|
22
|
-
|
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
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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(:
|
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(:
|
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(:
|
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, :
|
198
|
+
swap Devise, authentication_keys: [:username, :email] do
|
181
199
|
user = create_user
|
182
|
-
unlock_user = User.send_unlock_instructions(:
|
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, :
|
206
|
+
swap Devise, unlock_keys: [:username, :email] do
|
189
207
|
user = create_user
|
190
|
-
unlock_user = User.send_unlock_instructions(:
|
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, :
|
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, :
|
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, :
|
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, :
|
241
|
-
swap Devise, :
|
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, :
|
253
|
-
swap Devise, :
|
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, :
|
264
|
-
swap Devise, :
|
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, :
|
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, :
|
285
|
-
swap Devise, :
|
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 -
|
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
|
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(:
|
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(:
|
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, :
|
81
|
+
swap Devise, authentication_keys: [:username, :email] do
|
82
82
|
user = create_user
|
83
|
-
reset_password_user = User.send_reset_password_instructions(:
|
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, :
|
89
|
+
swap Devise, reset_password_keys: [:username, :email] do
|
90
90
|
user = create_user
|
91
|
-
reset_password_user = User.send_reset_password_instructions(:
|
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(:
|
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
|
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(:
|
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
|
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(:
|
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(:
|
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(:
|
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(:
|
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
|
-
:
|
147
|
-
:
|
148
|
-
:
|
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, :
|
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
|
-
:
|
167
|
-
:
|
168
|
-
:
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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, :
|
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(:
|
15
|
-
assert_no_match(/confirmation-token/, @user.to_xml(:
|
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(:
|
20
|
-
assert_match(/confirmation-token/, @user.to_xml(:
|
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(:
|
30
|
-
assert_no_key "confirmation_token", from_json(:
|
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(:
|
35
|
-
assert_key "confirmation_token", from_json(:
|
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, :
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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
|
90
|
-
user = new_user(:
|
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
|
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(:
|
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(:
|
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, [{ :
|
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, [{ :
|
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, [{:
|
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
|