devise 1.0.10 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +62 -10
- data/Gemfile +23 -0
- data/Gemfile.lock +118 -0
- data/README.rdoc +116 -77
- data/Rakefile +4 -2
- data/TODO +3 -2
- data/app/controllers/{confirmations_controller.rb → devise/confirmations_controller.rb} +1 -1
- data/app/controllers/{passwords_controller.rb → devise/passwords_controller.rb} +1 -1
- data/app/controllers/{registrations_controller.rb → devise/registrations_controller.rb} +12 -8
- data/app/controllers/devise/sessions_controller.rb +23 -0
- data/app/controllers/{unlocks_controller.rb → devise/unlocks_controller.rb} +1 -8
- data/app/helpers/devise_helper.rb +17 -0
- data/app/mailers/devise/mailer.rb +71 -0
- data/app/views/devise/confirmations/new.html.erb +12 -0
- data/app/views/devise/passwords/edit.html.erb +16 -0
- data/app/views/devise/passwords/new.html.erb +12 -0
- data/app/views/devise/registrations/edit.html.erb +25 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/sessions/new.html.erb +17 -0
- data/app/views/devise/shared/_links.erb +19 -0
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/{lib/devise → config}/locales/en.yml +16 -12
- data/lib/devise/controllers/helpers.rb +57 -52
- data/lib/devise/controllers/internal_helpers.rb +19 -50
- data/lib/devise/controllers/scoped_views.rb +35 -0
- data/lib/devise/controllers/url_helpers.rb +1 -1
- data/lib/devise/encryptors/authlogic_sha512.rb +0 -2
- data/lib/devise/encryptors/base.rb +1 -1
- data/lib/devise/encryptors/bcrypt.rb +2 -4
- data/lib/devise/encryptors/clearance_sha1.rb +0 -2
- data/lib/devise/encryptors/sha1.rb +6 -8
- data/lib/devise/encryptors/sha512.rb +6 -8
- data/lib/devise/failure_app.rb +76 -39
- data/lib/devise/hooks/activatable.rb +6 -10
- data/lib/devise/hooks/forgetable.rb +11 -0
- data/lib/devise/hooks/rememberable.rb +40 -30
- data/lib/devise/hooks/timeoutable.rb +7 -3
- data/lib/devise/hooks/trackable.rb +5 -14
- data/lib/devise/mapping.rb +35 -62
- data/lib/devise/models/authenticatable.rb +126 -0
- data/lib/devise/models/confirmable.rb +19 -22
- data/lib/devise/models/database_authenticatable.rb +26 -60
- data/lib/devise/models/lockable.rb +43 -28
- data/lib/devise/models/recoverable.rb +11 -10
- data/lib/devise/models/rememberable.rb +56 -26
- data/lib/devise/models/timeoutable.rb +1 -3
- data/lib/devise/models/token_authenticatable.rb +14 -43
- data/lib/devise/models/trackable.rb +14 -0
- data/lib/devise/models/validatable.rb +16 -2
- data/lib/devise/models.rb +16 -53
- data/lib/devise/modules.rb +23 -0
- data/lib/devise/orm/active_record.rb +10 -15
- data/lib/devise/orm/mongoid.rb +29 -0
- data/lib/devise/path_checker.rb +18 -0
- data/lib/devise/rails/routes.rb +232 -117
- data/lib/devise/rails/warden_compat.rb +18 -39
- data/lib/devise/rails.rb +64 -9
- data/lib/devise/schema.rb +47 -23
- data/lib/devise/strategies/authenticatable.rb +123 -0
- data/lib/devise/strategies/base.rb +2 -3
- data/lib/devise/strategies/database_authenticatable.rb +7 -22
- data/lib/devise/strategies/rememberable.rb +21 -7
- data/lib/devise/strategies/token_authenticatable.rb +31 -19
- data/lib/devise/test_helpers.rb +6 -6
- data/lib/devise/version.rb +1 -1
- data/lib/devise.rb +174 -157
- data/lib/generators/active_record/devise_generator.rb +28 -0
- data/{generators/devise → lib/generators/active_record}/templates/migration.rb +9 -3
- data/lib/generators/devise/devise_generator.rb +17 -0
- data/lib/generators/devise/install_generator.rb +24 -0
- data/lib/generators/devise/orm_helpers.rb +23 -0
- data/{generators/devise_install → lib/generators/devise}/templates/README +9 -7
- data/lib/generators/devise/templates/devise.rb +142 -0
- data/lib/generators/devise/views_generator.rb +63 -0
- data/lib/generators/devise_install_generator.rb +4 -0
- data/lib/generators/devise_views_generator.rb +4 -0
- data/lib/generators/mongoid/devise_generator.rb +17 -0
- data/test/controllers/helpers_test.rb +48 -19
- data/test/controllers/internal_helpers_test.rb +12 -16
- data/test/controllers/url_helpers_test.rb +21 -10
- data/test/devise_test.rb +16 -25
- data/test/encryptors_test.rb +2 -3
- data/test/failure_app_test.rb +106 -27
- data/test/integration/authenticatable_test.rb +138 -126
- data/test/integration/confirmable_test.rb +22 -15
- data/test/integration/database_authenticatable_test.rb +38 -0
- data/test/integration/http_authenticatable_test.rb +9 -12
- data/test/integration/lockable_test.rb +22 -15
- data/test/integration/recoverable_test.rb +6 -6
- data/test/integration/registerable_test.rb +42 -33
- data/test/integration/rememberable_test.rb +84 -22
- data/test/integration/timeoutable_test.rb +16 -4
- data/test/integration/token_authenticatable_test.rb +45 -12
- data/test/integration/trackable_test.rb +1 -1
- data/test/mailers/confirmation_instructions_test.rb +11 -17
- data/test/mailers/reset_password_instructions_test.rb +7 -7
- data/test/mailers/unlock_instructions_test.rb +7 -7
- data/test/mapping_test.rb +22 -95
- data/test/models/confirmable_test.rb +12 -19
- data/test/models/{authenticatable_test.rb → database_authenticatable_test.rb} +24 -56
- data/test/models/lockable_test.rb +32 -46
- data/test/models/recoverable_test.rb +7 -7
- data/test/models/rememberable_test.rb +118 -35
- data/test/models/timeoutable_test.rb +1 -1
- data/test/models/token_authenticatable_test.rb +5 -19
- data/test/models/trackable_test.rb +1 -1
- data/test/models/validatable_test.rb +20 -27
- data/test/models_test.rb +12 -5
- data/test/orm/active_record.rb +1 -23
- data/test/orm/mongoid.rb +10 -0
- data/test/rails_app/app/active_record/admin.rb +1 -5
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +3 -3
- data/test/rails_app/app/controllers/application_controller.rb +2 -5
- data/test/rails_app/app/controllers/home_controller.rb +3 -0
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/sessions_controller.rb +6 -0
- data/test/rails_app/app/controllers/users_controller.rb +7 -5
- data/test/rails_app/app/mongoid/admin.rb +6 -0
- data/test/rails_app/app/mongoid/shim.rb +16 -0
- data/test/rails_app/app/mongoid/user.rb +10 -0
- data/test/rails_app/config/application.rb +35 -0
- data/test/rails_app/config/boot.rb +10 -107
- data/test/rails_app/config/environment.rb +4 -41
- data/test/rails_app/config/environments/development.rb +15 -13
- data/test/rails_app/config/environments/production.rb +25 -20
- data/test/rails_app/config/environments/test.rb +33 -28
- data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_app/config/initializers/devise.rb +95 -38
- data/test/rails_app/config/initializers/secret_token.rb +2 -0
- data/test/rails_app/config/routes.rb +47 -25
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +27 -0
- data/test/rails_app/db/schema.rb +86 -0
- data/test/routes_test.rb +62 -47
- data/test/support/{assertions_helper.rb → assertions.rb} +2 -15
- data/test/support/{tests_helper.rb → helpers.rb} +18 -3
- data/test/support/{integration_tests_helper.rb → integration.rb} +24 -7
- data/test/support/webrat/integrations/rails.rb +32 -0
- data/test/test_helper.rb +11 -11
- data/test/test_helpers_test.rb +30 -15
- metadata +105 -64
- data/app/controllers/sessions_controller.rb +0 -42
- data/app/models/devise_mailer.rb +0 -68
- data/app/views/confirmations/new.html.erb +0 -12
- data/app/views/passwords/edit.html.erb +0 -16
- data/app/views/passwords/new.html.erb +0 -12
- data/app/views/registrations/edit.html.erb +0 -25
- data/app/views/registrations/new.html.erb +0 -17
- data/app/views/sessions/new.html.erb +0 -17
- data/app/views/shared/_devise_links.erb +0 -19
- data/app/views/unlocks/new.html.erb +0 -12
- data/generators/devise/USAGE +0 -5
- data/generators/devise/devise_generator.rb +0 -15
- data/generators/devise/lib/route_devise.rb +0 -32
- data/generators/devise/templates/model.rb +0 -9
- data/generators/devise_install/USAGE +0 -3
- data/generators/devise_install/devise_install_generator.rb +0 -15
- data/generators/devise_install/templates/devise.rb +0 -105
- data/generators/devise_views/USAGE +0 -3
- data/generators/devise_views/devise_views_generator.rb +0 -21
- data/lib/devise/models/activatable.rb +0 -16
- data/lib/devise/models/http_authenticatable.rb +0 -23
- data/lib/devise/orm/data_mapper.rb +0 -83
- data/lib/devise/orm/mongo_mapper.rb +0 -52
- data/lib/devise/strategies/http_authenticatable.rb +0 -59
- data/rails/init.rb +0 -2
- data/test/integration/rack_middleware_test.rb +0 -47
- data/test/orm/mongo_mapper.rb +0 -20
- data/test/rails_app/app/mongo_mapper/admin.rb +0 -13
- data/test/rails_app/app/mongo_mapper/user.rb +0 -14
- data/test/rails_app/config/initializers/new_rails_defaults.rb +0 -24
- data/test/rails_app/config/initializers/session_store.rb +0 -15
- /data/app/views/{devise_mailer → devise/mailer}/confirmation_instructions.html.erb +0 -0
- /data/app/views/{devise_mailer → devise/mailer}/reset_password_instructions.html.erb +0 -0
- /data/app/views/{devise_mailer → devise/mailer}/unlock_instructions.html.erb +0 -0
|
@@ -1,39 +1,43 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class LockableTest < ActiveSupport::TestCase
|
|
4
|
-
|
|
5
4
|
def setup
|
|
6
5
|
setup_mailer
|
|
7
6
|
end
|
|
8
7
|
|
|
9
|
-
test "should
|
|
8
|
+
test "should respect maximum attempts configuration" do
|
|
10
9
|
user = create_user
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
user.confirm!
|
|
11
|
+
swap Devise, :maximum_attempts => 2 do
|
|
12
|
+
3.times { user.valid_for_authentication?{ false } }
|
|
13
|
+
assert user.reload.access_locked?
|
|
14
|
+
end
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
test "should
|
|
17
|
+
test "should clear failed_attempts on successfull validation" do
|
|
17
18
|
user = create_user
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
user.confirm!
|
|
20
|
+
user.valid_for_authentication?{ false }
|
|
21
|
+
assert_equal 1, user.reload.failed_attempts
|
|
22
|
+
user.valid_for_authentication?{ true }
|
|
23
|
+
assert_equal 0, user.reload.failed_attempts
|
|
21
24
|
end
|
|
22
25
|
|
|
23
|
-
test "should
|
|
26
|
+
test "should not touch failed_attempts if lock_strategy is none" do
|
|
24
27
|
user = create_user
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
user.confirm!
|
|
29
|
+
swap Devise, :lock_strategy => :none, :maximum_attempts => 2 do
|
|
30
|
+
3.times { user.valid_for_authentication?{ false } }
|
|
31
|
+
assert !user.access_locked?
|
|
32
|
+
assert_equal 0, user.failed_attempts
|
|
28
33
|
end
|
|
29
34
|
end
|
|
30
35
|
|
|
31
|
-
test
|
|
36
|
+
test 'should be valid for authentication with a unlocked user' do
|
|
32
37
|
user = create_user
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
assert_equal 0, user.reload.failed_attempts
|
|
38
|
+
user.lock_access!
|
|
39
|
+
user.unlock_access!
|
|
40
|
+
assert user.valid_for_authentication?{ true }
|
|
37
41
|
end
|
|
38
42
|
|
|
39
43
|
test "should verify whether a user is locked or not" do
|
|
@@ -60,22 +64,13 @@ class LockableTest < ActiveSupport::TestCase
|
|
|
60
64
|
user.unlock_access!
|
|
61
65
|
assert_nil user.reload.locked_at
|
|
62
66
|
assert_nil user.reload.unlock_token
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
test "should not lock a locked account" do
|
|
67
|
-
user = create_user
|
|
68
|
-
user.lock_access!
|
|
69
|
-
assert_no_difference "ActionMailer::Base.deliveries.size" do
|
|
70
|
-
user.lock_access!
|
|
71
|
-
end
|
|
67
|
+
assert_equal 0, user.reload.failed_attempts
|
|
72
68
|
end
|
|
73
69
|
|
|
74
70
|
test 'should not unlock an unlocked user' do
|
|
75
71
|
user = create_user
|
|
76
|
-
|
|
77
72
|
assert_not user.unlock_access!
|
|
78
|
-
assert_match
|
|
73
|
+
assert_match "was not locked", user.errors[:email].join
|
|
79
74
|
end
|
|
80
75
|
|
|
81
76
|
test "new user should not be locked and should have zero failed_attempts" do
|
|
@@ -156,22 +151,14 @@ class LockableTest < ActiveSupport::TestCase
|
|
|
156
151
|
|
|
157
152
|
test 'should return a new record with errors when a invalid token is given' do
|
|
158
153
|
locked_user = User.unlock_access_by_token('invalid_token')
|
|
159
|
-
|
|
160
|
-
|
|
154
|
+
assert_not locked_user.persisted?
|
|
155
|
+
assert_equal "is invalid", locked_user.errors[:unlock_token].join
|
|
161
156
|
end
|
|
162
157
|
|
|
163
158
|
test 'should return a new record with errors when a blank token is given' do
|
|
164
159
|
locked_user = User.unlock_access_by_token('')
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
test 'should authenticate a unlocked user' do
|
|
170
|
-
user = create_user
|
|
171
|
-
user.lock_access!
|
|
172
|
-
user.unlock_access!
|
|
173
|
-
authenticated_user = User.authenticate(:email => user.email, :password => user.password)
|
|
174
|
-
assert_equal authenticated_user, user
|
|
160
|
+
assert_not locked_user.persisted?
|
|
161
|
+
assert_equal "can't be blank", locked_user.errors[:unlock_token].join
|
|
175
162
|
end
|
|
176
163
|
|
|
177
164
|
test 'should find a user to send unlock instructions' do
|
|
@@ -183,20 +170,19 @@ class LockableTest < ActiveSupport::TestCase
|
|
|
183
170
|
|
|
184
171
|
test 'should return a new user if no email was found' do
|
|
185
172
|
unlock_user = User.send_unlock_instructions(:email => "invalid@email.com")
|
|
186
|
-
|
|
173
|
+
assert_not unlock_user.persisted?
|
|
187
174
|
end
|
|
188
175
|
|
|
189
176
|
test 'should add error to new user email if no email was found' do
|
|
190
177
|
unlock_user = User.send_unlock_instructions(:email => "invalid@email.com")
|
|
191
|
-
|
|
192
|
-
assert_equal 'not found', unlock_user.errors[:email]
|
|
178
|
+
assert_equal 'not found', unlock_user.errors[:email].join
|
|
193
179
|
end
|
|
194
180
|
|
|
195
181
|
test 'should not be able to send instructions if the user is not locked' do
|
|
196
182
|
user = create_user
|
|
197
183
|
assert_not user.resend_unlock_token
|
|
198
184
|
assert_not user.access_locked?
|
|
199
|
-
assert_equal 'not locked', user.errors[:email]
|
|
185
|
+
assert_equal 'was not locked', user.errors[:email].join
|
|
200
186
|
end
|
|
201
187
|
|
|
202
188
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class RecoverableTest < ActiveSupport::TestCase
|
|
4
4
|
|
|
@@ -82,8 +82,8 @@ class RecoverableTest < ActiveSupport::TestCase
|
|
|
82
82
|
|
|
83
83
|
test 'should return a new record with errors if user was not found by e-mail' do
|
|
84
84
|
reset_password_user = User.send_reset_password_instructions(:email => "invalid@email.com")
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
assert_not reset_password_user.persisted?
|
|
86
|
+
assert_equal "not found", reset_password_user.errors[:email].join
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
test 'should reset reset_password_token before send the reset instructions email' do
|
|
@@ -110,14 +110,14 @@ class RecoverableTest < ActiveSupport::TestCase
|
|
|
110
110
|
|
|
111
111
|
test 'should a new record with errors if no reset_password_token is found' do
|
|
112
112
|
reset_password_user = User.reset_password_by_token(:reset_password_token => 'invalid_token')
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
assert_not reset_password_user.persisted?
|
|
114
|
+
assert_equal "is invalid", reset_password_user.errors[:reset_password_token].join
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
test 'should a new record with errors if reset_password_token is blank' do
|
|
118
118
|
reset_password_user = User.reset_password_by_token(:reset_password_token => '')
|
|
119
|
-
|
|
120
|
-
assert_match
|
|
119
|
+
assert_not reset_password_user.persisted?
|
|
120
|
+
assert_match "can't be blank", reset_password_user.errors[:reset_password_token].join
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
test 'should reset successfully user password given the new password and confirmation' do
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class RememberableTest < ActiveSupport::TestCase
|
|
4
|
-
|
|
5
|
-
def setup
|
|
6
|
-
Devise.remember_for = 1
|
|
7
|
-
end
|
|
8
|
-
|
|
9
4
|
test 'should respond to remember_me attribute' do
|
|
10
5
|
user = new_user
|
|
11
6
|
assert user.respond_to?(:remember_me)
|
|
@@ -23,19 +18,19 @@ class RememberableTest < ActiveSupport::TestCase
|
|
|
23
18
|
test 'forget_me should clear remember token and save the record without validating' do
|
|
24
19
|
user = create_user
|
|
25
20
|
user.remember_me!
|
|
26
|
-
|
|
21
|
+
assert_not user.remember_token.nil?
|
|
27
22
|
user.expects(:valid?).never
|
|
28
23
|
user.forget_me!
|
|
29
|
-
|
|
24
|
+
assert user.remember_token.nil?
|
|
30
25
|
assert_not user.changed?
|
|
31
26
|
end
|
|
32
27
|
|
|
33
28
|
test 'forget_me should clear remember_created_at' do
|
|
34
29
|
user = create_user
|
|
35
30
|
user.remember_me!
|
|
36
|
-
|
|
31
|
+
assert_not user.remember_created_at.nil?
|
|
37
32
|
user.forget_me!
|
|
38
|
-
|
|
33
|
+
assert user.remember_created_at.nil?
|
|
39
34
|
end
|
|
40
35
|
|
|
41
36
|
test 'forget should do nothing if no remember token exists' do
|
|
@@ -44,45 +39,25 @@ class RememberableTest < ActiveSupport::TestCase
|
|
|
44
39
|
user.forget_me!
|
|
45
40
|
end
|
|
46
41
|
|
|
47
|
-
test 'valid remember token' do
|
|
48
|
-
user = create_user
|
|
49
|
-
assert_not user.valid_remember_token?(user.remember_token)
|
|
50
|
-
user.remember_me!
|
|
51
|
-
assert user.valid_remember_token?(user.remember_token)
|
|
52
|
-
user.forget_me!
|
|
53
|
-
assert_not user.valid_remember_token?(user.remember_token)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
test 'valid remember token should also verify if remember is not expired' do
|
|
57
|
-
user = create_user
|
|
58
|
-
user.remember_me!
|
|
59
|
-
user.remember_created_at = 3.days.ago
|
|
60
|
-
user.save
|
|
61
|
-
assert_not user.valid_remember_token?(user.remember_token)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
42
|
test 'serialize into cookie' do
|
|
65
43
|
user = create_user
|
|
66
44
|
user.remember_me!
|
|
67
|
-
assert_equal
|
|
45
|
+
assert_equal [user.id, user.remember_token], User.serialize_into_cookie(user)
|
|
68
46
|
end
|
|
69
47
|
|
|
70
48
|
test 'serialize from cookie' do
|
|
71
49
|
user = create_user
|
|
72
50
|
user.remember_me!
|
|
73
|
-
assert_equal user, User.serialize_from_cookie(
|
|
51
|
+
assert_equal user, User.serialize_from_cookie(user.id, user.remember_token)
|
|
74
52
|
end
|
|
75
53
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
test 'serialize should return nil if no user is found' do
|
|
79
|
-
assert_nil User.serialize_from_cookie('0::123')
|
|
80
|
-
end
|
|
54
|
+
test 'serialize should return nil if no user is found' do
|
|
55
|
+
assert_nil User.serialize_from_cookie(0, "123")
|
|
81
56
|
end
|
|
82
57
|
|
|
83
58
|
test 'remember me return nil if is a valid user with invalid token' do
|
|
84
59
|
user = create_user
|
|
85
|
-
assert_nil User.serialize_from_cookie(
|
|
60
|
+
assert_nil User.serialize_from_cookie(user.id, "123")
|
|
86
61
|
end
|
|
87
62
|
|
|
88
63
|
test 'remember for should fallback to devise remember for default configuration' do
|
|
@@ -132,4 +107,112 @@ class RememberableTest < ActiveSupport::TestCase
|
|
|
132
107
|
assert_not user.remember_expired?
|
|
133
108
|
end
|
|
134
109
|
end
|
|
110
|
+
|
|
111
|
+
test 'if extend_remember_period is false, remember_me! should generate a new timestamp if expired' do
|
|
112
|
+
swap Devise, :remember_for => 5.minutes do
|
|
113
|
+
user = create_user
|
|
114
|
+
user.remember_me!(false)
|
|
115
|
+
assert user.remember_created_at
|
|
116
|
+
|
|
117
|
+
user.remember_created_at = old = 10.minutes.ago
|
|
118
|
+
user.save
|
|
119
|
+
|
|
120
|
+
user.remember_me!(false)
|
|
121
|
+
assert_not_equal old.to_i, user.remember_created_at.to_i
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
test 'if extend_remember_period is false, remember_me! should not generate a new timestamp' do
|
|
126
|
+
swap Devise, :remember_for => 1.year do
|
|
127
|
+
user = create_user
|
|
128
|
+
user.remember_me!(false)
|
|
129
|
+
assert user.remember_created_at
|
|
130
|
+
|
|
131
|
+
user.remember_created_at = old = 10.minutes.ago.utc
|
|
132
|
+
user.save
|
|
133
|
+
|
|
134
|
+
user.remember_me!(false)
|
|
135
|
+
assert_equal old.to_i, user.remember_created_at.to_i
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
test 'if extend_remember_period is true, remember_me! should always generate a new timestamp' do
|
|
140
|
+
swap Devise, :remember_for => 1.year do
|
|
141
|
+
user = create_user
|
|
142
|
+
user.remember_me!(true)
|
|
143
|
+
assert user.remember_created_at
|
|
144
|
+
|
|
145
|
+
user.remember_created_at = old = 10.minutes.ago
|
|
146
|
+
user.save
|
|
147
|
+
|
|
148
|
+
user.remember_me!(true)
|
|
149
|
+
assert_not_equal old, user.remember_created_at
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
test 'if remember_across_browsers is true, remember_me! should create a new token if no token exists' do
|
|
154
|
+
swap Devise, :remember_across_browsers => true, :remember_for => 1.year do
|
|
155
|
+
user = create_user
|
|
156
|
+
assert_equal nil, user.remember_token
|
|
157
|
+
user.remember_me!
|
|
158
|
+
assert_not_equal nil, user.remember_token
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
test 'if remember_across_browsers is true, remember_me! should create a new token if a token exists but has expired' do
|
|
163
|
+
swap Devise, :remember_across_browsers => true, :remember_for => 1.day do
|
|
164
|
+
user = create_user
|
|
165
|
+
user.remember_me!
|
|
166
|
+
user.remember_created_at = 2.days.ago
|
|
167
|
+
user.save
|
|
168
|
+
token = user.remember_token
|
|
169
|
+
user.remember_me!
|
|
170
|
+
assert_not_equal token, user.remember_token
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
test 'if remember_across_browsers is true, remember_me! should not create a new token if a token exists and has not expired' do
|
|
175
|
+
swap Devise, :remember_across_browsers => true, :remember_for => 2.days do
|
|
176
|
+
user = create_user
|
|
177
|
+
user.remember_me!
|
|
178
|
+
user.remember_created_at = 1.day.ago
|
|
179
|
+
user.save
|
|
180
|
+
token = user.remember_token
|
|
181
|
+
user.remember_me!
|
|
182
|
+
assert_equal token, user.remember_token
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
test 'if remember_across_browsers is false, remember_me! should create a new token if no token exists' do
|
|
187
|
+
swap Devise, :remember_across_browsers => false do
|
|
188
|
+
user = create_user
|
|
189
|
+
assert_equal nil, user.remember_token
|
|
190
|
+
user.remember_me!
|
|
191
|
+
assert_not_equal nil, user.remember_token
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
test 'if remember_across_browsers is false, remember_me! should create a new token if a token exists but has expired' do
|
|
196
|
+
swap Devise, :remember_across_browsers => false, :remember_for => 1.day do
|
|
197
|
+
user = create_user
|
|
198
|
+
user.remember_me!
|
|
199
|
+
user.remember_created_at = 2.days.ago
|
|
200
|
+
user.save
|
|
201
|
+
token = user.remember_token
|
|
202
|
+
user.remember_me!
|
|
203
|
+
assert_not_equal token, user.remember_token
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
test 'if remember_across_browsers is false, remember_me! should create a new token if a token exists and has not expired' do
|
|
208
|
+
swap Devise, :remember_across_browsers => false, :remember_for => 2.days do
|
|
209
|
+
user = create_user
|
|
210
|
+
user.remember_me!
|
|
211
|
+
user.remember_created_at = 1.day.ago
|
|
212
|
+
user.save
|
|
213
|
+
token = user.remember_token
|
|
214
|
+
user.remember_me!
|
|
215
|
+
assert_not_equal token, user.remember_token
|
|
216
|
+
end
|
|
217
|
+
end
|
|
135
218
|
end
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class TokenAuthenticatableTest < ActiveSupport::TestCase
|
|
4
4
|
|
|
5
|
-
test 'should generate friendly authentication token on create' do
|
|
6
|
-
User.expects(:authentication_token).returns(VALID_AUTHENTICATION_TOKEN)
|
|
7
|
-
user = create_user
|
|
8
|
-
assert_present user.authentication_token
|
|
9
|
-
assert_equal VALID_AUTHENTICATION_TOKEN, user.authentication_token
|
|
10
|
-
end
|
|
11
|
-
|
|
12
5
|
test 'should reset authentication token' do
|
|
13
6
|
user = new_user
|
|
14
7
|
user.reset_authentication_token
|
|
@@ -25,26 +18,19 @@ class TokenAuthenticatableTest < ActiveSupport::TestCase
|
|
|
25
18
|
assert_equal previous_token, user.authentication_token
|
|
26
19
|
end
|
|
27
20
|
|
|
28
|
-
test 'should test for a valid authentication token' do
|
|
29
|
-
User.expects(:authentication_token).returns(VALID_AUTHENTICATION_TOKEN)
|
|
30
|
-
user = create_user
|
|
31
|
-
assert user.valid_authentication_token?(VALID_AUTHENTICATION_TOKEN)
|
|
32
|
-
assert_not user.valid_authentication_token?(VALID_AUTHENTICATION_TOKEN.reverse)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
21
|
test 'should authenticate a valid user with authentication token and return it' do
|
|
36
|
-
User.expects(:authentication_token).returns(VALID_AUTHENTICATION_TOKEN)
|
|
37
22
|
user = create_user
|
|
23
|
+
user.ensure_authentication_token!
|
|
38
24
|
user.confirm!
|
|
39
|
-
authenticated_user = User.
|
|
25
|
+
authenticated_user = User.find_for_token_authentication(:auth_token => user.authentication_token)
|
|
40
26
|
assert_equal authenticated_user, user
|
|
41
27
|
end
|
|
42
28
|
|
|
43
29
|
test 'should return nil when authenticating an invalid user by authentication token' do
|
|
44
|
-
User.expects(:authentication_token).returns(VALID_AUTHENTICATION_TOKEN)
|
|
45
30
|
user = create_user
|
|
31
|
+
user.ensure_authentication_token!
|
|
46
32
|
user.confirm!
|
|
47
|
-
authenticated_user = User.
|
|
33
|
+
authenticated_user = User.find_for_token_authentication(:auth_token => user.authentication_token.reverse)
|
|
48
34
|
assert_nil authenticated_user
|
|
49
35
|
end
|
|
50
36
|
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class ValidatableTest < ActiveSupport::TestCase
|
|
4
|
-
extend Devise::TestSilencer if [:mongo_mapper, :data_mapper].include?(DEVISE_ORM)
|
|
5
|
-
|
|
6
4
|
test 'should require email to be set' do
|
|
7
5
|
user = new_user(:email => nil)
|
|
8
6
|
assert user.invalid?
|
|
9
7
|
assert user.errors[:email]
|
|
10
|
-
assert_equal 'can\'t be blank', user.errors[:email]
|
|
8
|
+
assert_equal 'can\'t be blank', user.errors[:email].join
|
|
11
9
|
end
|
|
12
10
|
|
|
13
11
|
test 'should require uniqueness of email, allowing blank' do
|
|
14
12
|
existing_user = create_user
|
|
13
|
+
|
|
15
14
|
user = new_user(:email => '')
|
|
16
15
|
assert user.invalid?
|
|
17
|
-
|
|
16
|
+
assert_no_match(/taken/, user.errors[:email].join)
|
|
17
|
+
|
|
18
18
|
user.email = existing_user.email
|
|
19
19
|
assert user.invalid?
|
|
20
|
-
|
|
21
|
-
assert_equal 1, [*user.errors[:email]].size
|
|
22
|
-
assert_equal 'has already been taken', user.errors[:email]
|
|
20
|
+
assert_match(/taken/, user.errors[:email].join)
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
test 'should require correct email format, allowing blank' do
|
|
26
24
|
user = new_user(:email => '')
|
|
27
25
|
assert user.invalid?
|
|
28
|
-
assert_not_equal 'is invalid', user.errors[:email]
|
|
26
|
+
assert_not_equal 'is invalid', user.errors[:email].join
|
|
27
|
+
|
|
29
28
|
%w(invalid_email_format email@invalid invalid$character@mail.com other@not 123).each do |email|
|
|
30
29
|
user.email = email
|
|
31
30
|
assert user.invalid?, 'should be invalid with email ' << email
|
|
32
|
-
|
|
33
|
-
assert_equal 1, [*user.errors[:email]].size
|
|
34
|
-
assert_equal 'is invalid', user.errors[:email]
|
|
31
|
+
assert_equal 'is invalid', user.errors[:email].join
|
|
35
32
|
end
|
|
36
33
|
end
|
|
37
34
|
|
|
@@ -39,63 +36,59 @@ class ValidatableTest < ActiveSupport::TestCase
|
|
|
39
36
|
%w(a.b.c@example.com test_mail@gmail.com any@any.net email@test.br 123@mail.test).each do |email|
|
|
40
37
|
user = new_user(:email => email)
|
|
41
38
|
assert user.valid?, 'should be valid with email ' << email
|
|
42
|
-
|
|
39
|
+
assert_blank user.errors[:email]
|
|
43
40
|
end
|
|
44
41
|
end
|
|
45
42
|
|
|
46
43
|
test 'should require password to be set when creating a new record' do
|
|
47
44
|
user = new_user(:password => '', :password_confirmation => '')
|
|
48
45
|
assert user.invalid?
|
|
49
|
-
|
|
50
|
-
assert_equal 'can\'t be blank', user.errors[:password]
|
|
46
|
+
assert_equal 'can\'t be blank', user.errors[:password].join
|
|
51
47
|
end
|
|
52
48
|
|
|
53
49
|
test 'should require confirmation to be set when creating a new record' do
|
|
54
50
|
user = new_user(:password => 'new_password', :password_confirmation => 'blabla')
|
|
55
51
|
assert user.invalid?
|
|
56
|
-
|
|
57
|
-
assert_equal 'doesn\'t match confirmation', user.errors[:password]
|
|
52
|
+
assert_equal 'doesn\'t match confirmation', user.errors[:password].join
|
|
58
53
|
end
|
|
59
54
|
|
|
60
55
|
test 'should require password when updating/reseting password' do
|
|
61
56
|
user = create_user
|
|
57
|
+
|
|
62
58
|
user.password = ''
|
|
63
59
|
user.password_confirmation = ''
|
|
60
|
+
|
|
64
61
|
assert user.invalid?
|
|
65
|
-
|
|
66
|
-
assert_equal 'can\'t be blank', user.errors[:password]
|
|
62
|
+
assert_equal 'can\'t be blank', user.errors[:password].join
|
|
67
63
|
end
|
|
68
64
|
|
|
69
65
|
test 'should require confirmation when updating/reseting password' do
|
|
70
66
|
user = create_user
|
|
71
67
|
user.password_confirmation = 'another_password'
|
|
72
68
|
assert user.invalid?
|
|
73
|
-
|
|
74
|
-
assert_equal 'doesn\'t match confirmation', user.errors[:password]
|
|
69
|
+
assert_equal 'doesn\'t match confirmation', user.errors[:password].join
|
|
75
70
|
end
|
|
76
71
|
|
|
77
72
|
test 'should require a password with minimum of 6 characters' do
|
|
78
73
|
user = new_user(:password => '12345', :password_confirmation => '12345')
|
|
79
74
|
assert user.invalid?
|
|
80
|
-
|
|
81
|
-
assert_equal 'is too short (minimum is 6 characters)', user.errors[:password]
|
|
75
|
+
assert_equal 'is too short (minimum is 6 characters)', user.errors[:password].join
|
|
82
76
|
end
|
|
83
77
|
|
|
84
78
|
test 'should require a password with maximum of 20 characters long' do
|
|
85
79
|
user = new_user(:password => 'x'*21, :password_confirmation => 'x'*21)
|
|
86
80
|
assert user.invalid?
|
|
87
|
-
|
|
88
|
-
assert_equal 'is too long (maximum is 20 characters)', user.errors[:password]
|
|
81
|
+
assert_equal 'is too long (maximum is 20 characters)', user.errors[:password].join
|
|
89
82
|
end
|
|
90
83
|
|
|
91
84
|
test 'should not require password length when it\'s not changed' do
|
|
92
85
|
user = create_user.reload
|
|
93
86
|
user.password = user.password_confirmation = nil
|
|
94
87
|
assert user.valid?
|
|
88
|
+
|
|
95
89
|
user.password_confirmation = 'confirmation'
|
|
96
90
|
assert user.invalid?
|
|
97
|
-
|
|
98
|
-
assert_not user.errors[:password].to_a.include?('is too short (minimum is 6 characters)')
|
|
91
|
+
assert_not (user.errors[:password].join =~ /is too long/)
|
|
99
92
|
end
|
|
100
93
|
|
|
101
94
|
test 'shuold not be included in objects with invalid API' do
|
data/test/models_test.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class Configurable < User
|
|
4
4
|
devise :database_authenticatable, :confirmable, :rememberable, :timeoutable, :lockable,
|
|
@@ -6,6 +6,9 @@ class Configurable < User
|
|
|
6
6
|
:remember_for => 7.days, :timeout_in => 15.minutes, :unlock_in => 10.days
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
class Inheritable < Admin
|
|
10
|
+
end
|
|
11
|
+
|
|
9
12
|
class ActiveRecordTest < ActiveSupport::TestCase
|
|
10
13
|
def include_module?(klass, mod)
|
|
11
14
|
klass.devise_modules.include?(mod) &&
|
|
@@ -22,13 +25,17 @@ class ActiveRecordTest < ActiveSupport::TestCase
|
|
|
22
25
|
end
|
|
23
26
|
end
|
|
24
27
|
|
|
25
|
-
test '
|
|
26
|
-
assert_include_modules Admin, :database_authenticatable, :registerable, :timeoutable
|
|
28
|
+
test 'can cherry pick modules' do
|
|
29
|
+
assert_include_modules Admin, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'chosen modules are inheritable' do
|
|
33
|
+
assert_include_modules Inheritable, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable
|
|
27
34
|
end
|
|
28
35
|
|
|
29
36
|
test 'order of module inclusion' do
|
|
30
|
-
correct_module_order = [:database_authenticatable, :registerable, :timeoutable]
|
|
31
|
-
incorrect_module_order = [:database_authenticatable, :timeoutable, :registerable]
|
|
37
|
+
correct_module_order = [:database_authenticatable, :recoverable, :registerable, :lockable, :timeoutable]
|
|
38
|
+
incorrect_module_order = [:database_authenticatable, :timeoutable, :registerable, :recoverable, :lockable]
|
|
32
39
|
|
|
33
40
|
assert_include_modules Admin, *incorrect_module_order
|
|
34
41
|
|
data/test/orm/active_record.rb
CHANGED
|
@@ -1,29 +1,7 @@
|
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', 'rails_app', 'config', 'environment')
|
|
2
|
-
require 'test_help'
|
|
3
|
-
|
|
4
1
|
ActiveRecord::Migration.verbose = false
|
|
5
2
|
ActiveRecord::Base.logger = Logger.new(nil)
|
|
6
|
-
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
|
7
|
-
|
|
8
|
-
ActiveRecord::Schema.define(:version => 1) do
|
|
9
|
-
[:users, :admins, :accounts].each do |table|
|
|
10
|
-
create_table table do |t|
|
|
11
|
-
t.database_authenticatable :null => table == :admins
|
|
12
3
|
|
|
13
|
-
|
|
14
|
-
t.string :username
|
|
15
|
-
t.confirmable
|
|
16
|
-
t.recoverable
|
|
17
|
-
t.rememberable
|
|
18
|
-
t.trackable
|
|
19
|
-
t.lockable
|
|
20
|
-
t.token_authenticatable
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
t.timestamps
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
4
|
+
ActiveRecord::Migrator.migrate(File.expand_path("../../rails_app/db/migrate/", __FILE__))
|
|
27
5
|
|
|
28
6
|
class ActiveSupport::TestCase
|
|
29
7
|
self.use_transactional_fixtures = true
|
data/test/orm/mongoid.rb
ADDED
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
class Admin < ActiveRecord::Base
|
|
2
|
-
devise :database_authenticatable, :registerable, :timeoutable
|
|
3
|
-
|
|
4
|
-
def self.find_for_authentication(conditions)
|
|
5
|
-
last(:conditions => conditions)
|
|
6
|
-
end
|
|
2
|
+
devise :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable, :unlock_strategy => :time
|
|
7
3
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class User < ActiveRecord::Base
|
|
2
|
-
devise :database_authenticatable, :
|
|
3
|
-
:
|
|
4
|
-
:
|
|
2
|
+
devise :database_authenticatable, :confirmable, :lockable, :recoverable,
|
|
3
|
+
:registerable, :rememberable, :timeoutable, :token_authenticatable,
|
|
4
|
+
:trackable, :validatable
|
|
5
5
|
|
|
6
6
|
attr_accessible :username, :email, :password, :password_confirmation
|
|
7
7
|
end
|