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.
Files changed (176) hide show
  1. data/CHANGELOG.rdoc +62 -10
  2. data/Gemfile +23 -0
  3. data/Gemfile.lock +118 -0
  4. data/README.rdoc +116 -77
  5. data/Rakefile +4 -2
  6. data/TODO +3 -2
  7. data/app/controllers/{confirmations_controller.rb → devise/confirmations_controller.rb} +1 -1
  8. data/app/controllers/{passwords_controller.rb → devise/passwords_controller.rb} +1 -1
  9. data/app/controllers/{registrations_controller.rb → devise/registrations_controller.rb} +12 -8
  10. data/app/controllers/devise/sessions_controller.rb +23 -0
  11. data/app/controllers/{unlocks_controller.rb → devise/unlocks_controller.rb} +1 -8
  12. data/app/helpers/devise_helper.rb +17 -0
  13. data/app/mailers/devise/mailer.rb +71 -0
  14. data/app/views/devise/confirmations/new.html.erb +12 -0
  15. data/app/views/devise/passwords/edit.html.erb +16 -0
  16. data/app/views/devise/passwords/new.html.erb +12 -0
  17. data/app/views/devise/registrations/edit.html.erb +25 -0
  18. data/app/views/devise/registrations/new.html.erb +18 -0
  19. data/app/views/devise/sessions/new.html.erb +17 -0
  20. data/app/views/devise/shared/_links.erb +19 -0
  21. data/app/views/devise/unlocks/new.html.erb +12 -0
  22. data/{lib/devise → config}/locales/en.yml +16 -12
  23. data/lib/devise/controllers/helpers.rb +57 -52
  24. data/lib/devise/controllers/internal_helpers.rb +19 -50
  25. data/lib/devise/controllers/scoped_views.rb +35 -0
  26. data/lib/devise/controllers/url_helpers.rb +1 -1
  27. data/lib/devise/encryptors/authlogic_sha512.rb +0 -2
  28. data/lib/devise/encryptors/base.rb +1 -1
  29. data/lib/devise/encryptors/bcrypt.rb +2 -4
  30. data/lib/devise/encryptors/clearance_sha1.rb +0 -2
  31. data/lib/devise/encryptors/sha1.rb +6 -8
  32. data/lib/devise/encryptors/sha512.rb +6 -8
  33. data/lib/devise/failure_app.rb +76 -39
  34. data/lib/devise/hooks/activatable.rb +6 -10
  35. data/lib/devise/hooks/forgetable.rb +11 -0
  36. data/lib/devise/hooks/rememberable.rb +40 -30
  37. data/lib/devise/hooks/timeoutable.rb +7 -3
  38. data/lib/devise/hooks/trackable.rb +5 -14
  39. data/lib/devise/mapping.rb +35 -62
  40. data/lib/devise/models/authenticatable.rb +126 -0
  41. data/lib/devise/models/confirmable.rb +19 -22
  42. data/lib/devise/models/database_authenticatable.rb +26 -60
  43. data/lib/devise/models/lockable.rb +43 -28
  44. data/lib/devise/models/recoverable.rb +11 -10
  45. data/lib/devise/models/rememberable.rb +56 -26
  46. data/lib/devise/models/timeoutable.rb +1 -3
  47. data/lib/devise/models/token_authenticatable.rb +14 -43
  48. data/lib/devise/models/trackable.rb +14 -0
  49. data/lib/devise/models/validatable.rb +16 -2
  50. data/lib/devise/models.rb +16 -53
  51. data/lib/devise/modules.rb +23 -0
  52. data/lib/devise/orm/active_record.rb +10 -15
  53. data/lib/devise/orm/mongoid.rb +29 -0
  54. data/lib/devise/path_checker.rb +18 -0
  55. data/lib/devise/rails/routes.rb +232 -117
  56. data/lib/devise/rails/warden_compat.rb +18 -39
  57. data/lib/devise/rails.rb +64 -9
  58. data/lib/devise/schema.rb +47 -23
  59. data/lib/devise/strategies/authenticatable.rb +123 -0
  60. data/lib/devise/strategies/base.rb +2 -3
  61. data/lib/devise/strategies/database_authenticatable.rb +7 -22
  62. data/lib/devise/strategies/rememberable.rb +21 -7
  63. data/lib/devise/strategies/token_authenticatable.rb +31 -19
  64. data/lib/devise/test_helpers.rb +6 -6
  65. data/lib/devise/version.rb +1 -1
  66. data/lib/devise.rb +174 -157
  67. data/lib/generators/active_record/devise_generator.rb +28 -0
  68. data/{generators/devise → lib/generators/active_record}/templates/migration.rb +9 -3
  69. data/lib/generators/devise/devise_generator.rb +17 -0
  70. data/lib/generators/devise/install_generator.rb +24 -0
  71. data/lib/generators/devise/orm_helpers.rb +23 -0
  72. data/{generators/devise_install → lib/generators/devise}/templates/README +9 -7
  73. data/lib/generators/devise/templates/devise.rb +142 -0
  74. data/lib/generators/devise/views_generator.rb +63 -0
  75. data/lib/generators/devise_install_generator.rb +4 -0
  76. data/lib/generators/devise_views_generator.rb +4 -0
  77. data/lib/generators/mongoid/devise_generator.rb +17 -0
  78. data/test/controllers/helpers_test.rb +48 -19
  79. data/test/controllers/internal_helpers_test.rb +12 -16
  80. data/test/controllers/url_helpers_test.rb +21 -10
  81. data/test/devise_test.rb +16 -25
  82. data/test/encryptors_test.rb +2 -3
  83. data/test/failure_app_test.rb +106 -27
  84. data/test/integration/authenticatable_test.rb +138 -126
  85. data/test/integration/confirmable_test.rb +22 -15
  86. data/test/integration/database_authenticatable_test.rb +38 -0
  87. data/test/integration/http_authenticatable_test.rb +9 -12
  88. data/test/integration/lockable_test.rb +22 -15
  89. data/test/integration/recoverable_test.rb +6 -6
  90. data/test/integration/registerable_test.rb +42 -33
  91. data/test/integration/rememberable_test.rb +84 -22
  92. data/test/integration/timeoutable_test.rb +16 -4
  93. data/test/integration/token_authenticatable_test.rb +45 -12
  94. data/test/integration/trackable_test.rb +1 -1
  95. data/test/mailers/confirmation_instructions_test.rb +11 -17
  96. data/test/mailers/reset_password_instructions_test.rb +7 -7
  97. data/test/mailers/unlock_instructions_test.rb +7 -7
  98. data/test/mapping_test.rb +22 -95
  99. data/test/models/confirmable_test.rb +12 -19
  100. data/test/models/{authenticatable_test.rb → database_authenticatable_test.rb} +24 -56
  101. data/test/models/lockable_test.rb +32 -46
  102. data/test/models/recoverable_test.rb +7 -7
  103. data/test/models/rememberable_test.rb +118 -35
  104. data/test/models/timeoutable_test.rb +1 -1
  105. data/test/models/token_authenticatable_test.rb +5 -19
  106. data/test/models/trackable_test.rb +1 -1
  107. data/test/models/validatable_test.rb +20 -27
  108. data/test/models_test.rb +12 -5
  109. data/test/orm/active_record.rb +1 -23
  110. data/test/orm/mongoid.rb +10 -0
  111. data/test/rails_app/app/active_record/admin.rb +1 -5
  112. data/test/rails_app/app/active_record/shim.rb +2 -0
  113. data/test/rails_app/app/active_record/user.rb +3 -3
  114. data/test/rails_app/app/controllers/application_controller.rb +2 -5
  115. data/test/rails_app/app/controllers/home_controller.rb +3 -0
  116. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  117. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  118. data/test/rails_app/app/controllers/sessions_controller.rb +6 -0
  119. data/test/rails_app/app/controllers/users_controller.rb +7 -5
  120. data/test/rails_app/app/mongoid/admin.rb +6 -0
  121. data/test/rails_app/app/mongoid/shim.rb +16 -0
  122. data/test/rails_app/app/mongoid/user.rb +10 -0
  123. data/test/rails_app/config/application.rb +35 -0
  124. data/test/rails_app/config/boot.rb +10 -107
  125. data/test/rails_app/config/environment.rb +4 -41
  126. data/test/rails_app/config/environments/development.rb +15 -13
  127. data/test/rails_app/config/environments/production.rb +25 -20
  128. data/test/rails_app/config/environments/test.rb +33 -28
  129. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  130. data/test/rails_app/config/initializers/devise.rb +95 -38
  131. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  132. data/test/rails_app/config/routes.rb +47 -25
  133. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +27 -0
  134. data/test/rails_app/db/schema.rb +86 -0
  135. data/test/routes_test.rb +62 -47
  136. data/test/support/{assertions_helper.rb → assertions.rb} +2 -15
  137. data/test/support/{tests_helper.rb → helpers.rb} +18 -3
  138. data/test/support/{integration_tests_helper.rb → integration.rb} +24 -7
  139. data/test/support/webrat/integrations/rails.rb +32 -0
  140. data/test/test_helper.rb +11 -11
  141. data/test/test_helpers_test.rb +30 -15
  142. metadata +105 -64
  143. data/app/controllers/sessions_controller.rb +0 -42
  144. data/app/models/devise_mailer.rb +0 -68
  145. data/app/views/confirmations/new.html.erb +0 -12
  146. data/app/views/passwords/edit.html.erb +0 -16
  147. data/app/views/passwords/new.html.erb +0 -12
  148. data/app/views/registrations/edit.html.erb +0 -25
  149. data/app/views/registrations/new.html.erb +0 -17
  150. data/app/views/sessions/new.html.erb +0 -17
  151. data/app/views/shared/_devise_links.erb +0 -19
  152. data/app/views/unlocks/new.html.erb +0 -12
  153. data/generators/devise/USAGE +0 -5
  154. data/generators/devise/devise_generator.rb +0 -15
  155. data/generators/devise/lib/route_devise.rb +0 -32
  156. data/generators/devise/templates/model.rb +0 -9
  157. data/generators/devise_install/USAGE +0 -3
  158. data/generators/devise_install/devise_install_generator.rb +0 -15
  159. data/generators/devise_install/templates/devise.rb +0 -105
  160. data/generators/devise_views/USAGE +0 -3
  161. data/generators/devise_views/devise_views_generator.rb +0 -21
  162. data/lib/devise/models/activatable.rb +0 -16
  163. data/lib/devise/models/http_authenticatable.rb +0 -23
  164. data/lib/devise/orm/data_mapper.rb +0 -83
  165. data/lib/devise/orm/mongo_mapper.rb +0 -52
  166. data/lib/devise/strategies/http_authenticatable.rb +0 -59
  167. data/rails/init.rb +0 -2
  168. data/test/integration/rack_middleware_test.rb +0 -47
  169. data/test/orm/mongo_mapper.rb +0 -20
  170. data/test/rails_app/app/mongo_mapper/admin.rb +0 -13
  171. data/test/rails_app/app/mongo_mapper/user.rb +0 -14
  172. data/test/rails_app/config/initializers/new_rails_defaults.rb +0 -24
  173. data/test/rails_app/config/initializers/session_store.rb +0 -15
  174. /data/app/views/{devise_mailer → devise/mailer}/confirmation_instructions.html.erb +0 -0
  175. /data/app/views/{devise_mailer → devise/mailer}/reset_password_instructions.html.erb +0 -0
  176. /data/app/views/{devise_mailer → devise/mailer}/unlock_instructions.html.erb +0 -0
@@ -1,39 +1,43 @@
1
- require 'test/test_helper'
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 increment failed attempts on unsuccessful authentication" do
8
+ test "should respect maximum attempts configuration" do
10
9
  user = create_user
11
- assert_equal 0, user.failed_attempts
12
- authenticated_user = User.authenticate(:email => user.email, :password => "anotherpassword")
13
- assert_equal 1, user.reload.failed_attempts
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 lock account base on maximum_attempts" do
17
+ test "should clear failed_attempts on successfull validation" do
17
18
  user = create_user
18
- attempts = Devise.maximum_attempts + 1
19
- attempts.times { authenticated_user = User.authenticate(:email => user.email, :password => "anotherpassword") }
20
- assert user.reload.access_locked?
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 respect maximum attempts configuration" do
26
+ test "should not touch failed_attempts if lock_strategy is none" do
24
27
  user = create_user
25
- swap Devise, :maximum_attempts => 2 do
26
- 3.times { authenticated_user = User.authenticate(:email => user.email, :password => "anotherpassword") }
27
- assert user.reload.access_locked?
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 "should clear failed_attempts on successfull sign in" do
36
+ test 'should be valid for authentication with a unlocked user' do
32
37
  user = create_user
33
- User.authenticate(:email => user.email, :password => "anotherpassword")
34
- assert_equal 1, user.reload.failed_attempts
35
- User.authenticate(:email => user.email, :password => "123456")
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
- assert 0, user.reload.failed_attempts
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 /not locked/, user.errors[:email]
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
- assert locked_user.new_record?
160
- assert_match /invalid/, locked_user.errors[:unlock_token]
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
- assert locked_user.new_record?
166
- assert_match /blank/, locked_user.errors[:unlock_token]
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
- assert unlock_user.new_record?
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
- assert unlock_user.errors[:email]
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 'test/test_helper'
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
- assert reset_password_user.new_record?
86
- assert_match /not found/, reset_password_user.errors[:email]
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
- assert reset_password_user.new_record?
114
- assert_match /invalid/, reset_password_user.errors[:reset_password_token]
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
- assert reset_password_user.new_record?
120
- assert_match /blank/, reset_password_user.errors[:reset_password_token]
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 'test/test_helper'
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
- assert user.remember_token?
21
+ assert_not user.remember_token.nil?
27
22
  user.expects(:valid?).never
28
23
  user.forget_me!
29
- assert_not user.remember_token?
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
- assert user.remember_created_at?
31
+ assert_not user.remember_created_at.nil?
37
32
  user.forget_me!
38
- assert_not user.remember_created_at?
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 "#{user.id}::#{user.remember_token}", User.serialize_into_cookie(user)
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("#{user.id}::#{user.remember_token}")
51
+ assert_equal user, User.serialize_from_cookie(user.id, user.remember_token)
74
52
  end
75
53
 
76
- # MongoMapper cries if an invalid ID is given, so this does not need to be tested
77
- unless DEVISE_ORM == :mongo_mapper
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("#{user.id}::#{user.remember_token}123")
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,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TimeoutableTest < ActiveSupport::TestCase
4
4
 
@@ -1,14 +1,7 @@
1
- require 'test/test_helper'
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.authenticate_with_token(:auth_token => user.authentication_token)
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.authenticate_with_token(:auth_token => user.authentication_token.reverse)
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,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TrackableTest < ActiveSupport::TestCase
4
4
 
@@ -1,37 +1,34 @@
1
- require 'test/test_helper'
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
- assert_not_equal 'has already been taken', user.errors[:email]
16
+ assert_no_match(/taken/, user.errors[:email].join)
17
+
18
18
  user.email = existing_user.email
19
19
  assert user.invalid?
20
- assert user.errors[:email]
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
- assert user.errors[:email]
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
- assert_nil user.errors[:email]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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
- assert user.errors[:password]
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 'test/test_helper'
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 'add modules cherry pick' do
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
 
@@ -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
- if table != :admin
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
@@ -0,0 +1,10 @@
1
+ Mongoid.configure do |config|
2
+ config.master = Mongo::Connection.new('127.0.0.1', 27017).db("devise-test-suite")
3
+ end
4
+
5
+ class ActiveSupport::TestCase
6
+ setup do
7
+ User.delete_all
8
+ Admin.delete_all
9
+ end
10
+ end
@@ -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
@@ -0,0 +1,2 @@
1
+ module Shim
2
+ end
@@ -1,7 +1,7 @@
1
1
  class User < ActiveRecord::Base
2
- devise :database_authenticatable, :http_authenticatable, :confirmable,
3
- :lockable, :recoverable, :registerable, :rememberable, :timeoutable,
4
- :token_authenticatable, :trackable, :validatable
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