af-devise 2.1.2

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 (207) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +885 -0
  4. data/CONTRIBUTING.md +14 -0
  5. data/Gemfile +29 -0
  6. data/Gemfile.lock +155 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +394 -0
  9. data/Rakefile +34 -0
  10. data/app/controllers/devise/confirmations_controller.rb +43 -0
  11. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  12. data/app/controllers/devise/passwords_controller.rb +65 -0
  13. data/app/controllers/devise/registrations_controller.rb +119 -0
  14. data/app/controllers/devise/sessions_controller.rb +50 -0
  15. data/app/controllers/devise/unlocks_controller.rb +44 -0
  16. data/app/controllers/devise_controller.rb +184 -0
  17. data/app/helpers/devise_helper.rb +25 -0
  18. data/app/mailers/devise/mailer.rb +15 -0
  19. data/app/views/devise/_links.erb +3 -0
  20. data/app/views/devise/confirmations/new.html.erb +12 -0
  21. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  22. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  23. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  24. data/app/views/devise/passwords/edit.html.erb +16 -0
  25. data/app/views/devise/passwords/new.html.erb +12 -0
  26. data/app/views/devise/registrations/edit.html.erb +25 -0
  27. data/app/views/devise/registrations/new.html.erb +18 -0
  28. data/app/views/devise/sessions/new.html.erb +17 -0
  29. data/app/views/devise/shared/_links.erb +25 -0
  30. data/app/views/devise/unlocks/new.html.erb +12 -0
  31. data/config/locales/en.yml +59 -0
  32. data/devise.gemspec +25 -0
  33. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  34. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  35. data/lib/devise.rb +444 -0
  36. data/lib/devise/controllers/helpers.rb +285 -0
  37. data/lib/devise/controllers/rememberable.rb +52 -0
  38. data/lib/devise/controllers/scoped_views.rb +17 -0
  39. data/lib/devise/controllers/url_helpers.rb +67 -0
  40. data/lib/devise/delegator.rb +16 -0
  41. data/lib/devise/failure_app.rb +187 -0
  42. data/lib/devise/hooks/activatable.rb +11 -0
  43. data/lib/devise/hooks/forgetable.rb +9 -0
  44. data/lib/devise/hooks/lockable.rb +7 -0
  45. data/lib/devise/hooks/rememberable.rb +6 -0
  46. data/lib/devise/hooks/timeoutable.rb +25 -0
  47. data/lib/devise/hooks/trackable.rb +9 -0
  48. data/lib/devise/mailers/helpers.rb +91 -0
  49. data/lib/devise/mapping.rb +172 -0
  50. data/lib/devise/models.rb +128 -0
  51. data/lib/devise/models/authenticatable.rb +268 -0
  52. data/lib/devise/models/confirmable.rb +270 -0
  53. data/lib/devise/models/database_authenticatable.rb +127 -0
  54. data/lib/devise/models/lockable.rb +193 -0
  55. data/lib/devise/models/omniauthable.rb +27 -0
  56. data/lib/devise/models/recoverable.rb +140 -0
  57. data/lib/devise/models/registerable.rb +25 -0
  58. data/lib/devise/models/rememberable.rb +125 -0
  59. data/lib/devise/models/timeoutable.rb +49 -0
  60. data/lib/devise/models/token_authenticatable.rb +89 -0
  61. data/lib/devise/models/trackable.rb +35 -0
  62. data/lib/devise/models/validatable.rb +66 -0
  63. data/lib/devise/modules.rb +29 -0
  64. data/lib/devise/omniauth.rb +28 -0
  65. data/lib/devise/omniauth/config.rb +45 -0
  66. data/lib/devise/omniauth/url_helpers.rb +18 -0
  67. data/lib/devise/orm/active_record.rb +3 -0
  68. data/lib/devise/orm/mongoid.rb +3 -0
  69. data/lib/devise/param_filter.rb +41 -0
  70. data/lib/devise/rails.rb +54 -0
  71. data/lib/devise/rails/routes.rb +446 -0
  72. data/lib/devise/rails/warden_compat.rb +43 -0
  73. data/lib/devise/strategies/authenticatable.rb +176 -0
  74. data/lib/devise/strategies/base.rb +20 -0
  75. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  76. data/lib/devise/strategies/rememberable.rb +55 -0
  77. data/lib/devise/strategies/token_authenticatable.rb +56 -0
  78. data/lib/devise/test_helpers.rb +131 -0
  79. data/lib/devise/time_inflector.rb +14 -0
  80. data/lib/devise/version.rb +3 -0
  81. data/lib/generators/active_record/devise_generator.rb +79 -0
  82. data/lib/generators/active_record/templates/migration.rb +19 -0
  83. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  84. data/lib/generators/devise/devise_generator.rb +24 -0
  85. data/lib/generators/devise/install_generator.rb +24 -0
  86. data/lib/generators/devise/orm_helpers.rb +32 -0
  87. data/lib/generators/devise/views_generator.rb +116 -0
  88. data/lib/generators/mongoid/devise_generator.rb +57 -0
  89. data/lib/generators/templates/README +35 -0
  90. data/lib/generators/templates/devise.rb +240 -0
  91. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  92. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  93. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  94. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  95. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  96. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  97. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  98. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  99. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  100. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  101. data/test/controllers/custom_strategy_test.rb +62 -0
  102. data/test/controllers/helpers_test.rb +253 -0
  103. data/test/controllers/internal_helpers_test.rb +110 -0
  104. data/test/controllers/sessions_controller_test.rb +85 -0
  105. data/test/controllers/url_helpers_test.rb +59 -0
  106. data/test/delegator_test.rb +19 -0
  107. data/test/devise_test.rb +72 -0
  108. data/test/failure_app_test.rb +221 -0
  109. data/test/generators/active_record_generator_test.rb +75 -0
  110. data/test/generators/devise_generator_test.rb +39 -0
  111. data/test/generators/install_generator_test.rb +13 -0
  112. data/test/generators/mongoid_generator_test.rb +23 -0
  113. data/test/generators/views_generator_test.rb +52 -0
  114. data/test/helpers/devise_helper_test.rb +51 -0
  115. data/test/integration/authenticatable_test.rb +633 -0
  116. data/test/integration/confirmable_test.rb +298 -0
  117. data/test/integration/database_authenticatable_test.rb +82 -0
  118. data/test/integration/http_authenticatable_test.rb +97 -0
  119. data/test/integration/lockable_test.rb +242 -0
  120. data/test/integration/omniauthable_test.rb +133 -0
  121. data/test/integration/recoverable_test.rb +334 -0
  122. data/test/integration/registerable_test.rb +345 -0
  123. data/test/integration/rememberable_test.rb +158 -0
  124. data/test/integration/timeoutable_test.rb +140 -0
  125. data/test/integration/token_authenticatable_test.rb +161 -0
  126. data/test/integration/trackable_test.rb +92 -0
  127. data/test/mailers/confirmation_instructions_test.rb +102 -0
  128. data/test/mailers/reset_password_instructions_test.rb +83 -0
  129. data/test/mailers/unlock_instructions_test.rb +77 -0
  130. data/test/mapping_test.rb +127 -0
  131. data/test/models/authenticatable_test.rb +7 -0
  132. data/test/models/confirmable_test.rb +391 -0
  133. data/test/models/database_authenticatable_test.rb +196 -0
  134. data/test/models/lockable_test.rb +273 -0
  135. data/test/models/omniauthable_test.rb +7 -0
  136. data/test/models/recoverable_test.rb +205 -0
  137. data/test/models/registerable_test.rb +7 -0
  138. data/test/models/rememberable_test.rb +174 -0
  139. data/test/models/serializable_test.rb +49 -0
  140. data/test/models/timeoutable_test.rb +46 -0
  141. data/test/models/token_authenticatable_test.rb +55 -0
  142. data/test/models/trackable_test.rb +13 -0
  143. data/test/models/validatable_test.rb +117 -0
  144. data/test/models_test.rb +179 -0
  145. data/test/omniauth/config_test.rb +57 -0
  146. data/test/omniauth/url_helpers_test.rb +51 -0
  147. data/test/orm/active_record.rb +9 -0
  148. data/test/orm/mongoid.rb +13 -0
  149. data/test/rails_app/Rakefile +10 -0
  150. data/test/rails_app/app/active_record/admin.rb +6 -0
  151. data/test/rails_app/app/active_record/shim.rb +2 -0
  152. data/test/rails_app/app/active_record/user.rb +6 -0
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  154. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  155. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  156. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  160. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  161. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  162. data/test/rails_app/app/mailers/users/mailer.rb +8 -0
  163. data/test/rails_app/app/mongoid/admin.rb +29 -0
  164. data/test/rails_app/app/mongoid/shim.rb +24 -0
  165. data/test/rails_app/app/mongoid/user.rb +42 -0
  166. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  167. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  168. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  169. data/test/rails_app/app/views/home/index.html.erb +1 -0
  170. data/test/rails_app/app/views/home/join.html.erb +1 -0
  171. data/test/rails_app/app/views/home/private.html.erb +1 -0
  172. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  173. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  174. data/test/rails_app/app/views/users/index.html.erb +1 -0
  175. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  176. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  177. data/test/rails_app/config.ru +4 -0
  178. data/test/rails_app/config/application.rb +41 -0
  179. data/test/rails_app/config/boot.rb +8 -0
  180. data/test/rails_app/config/database.yml +18 -0
  181. data/test/rails_app/config/environment.rb +5 -0
  182. data/test/rails_app/config/environments/development.rb +18 -0
  183. data/test/rails_app/config/environments/production.rb +33 -0
  184. data/test/rails_app/config/environments/test.rb +33 -0
  185. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  186. data/test/rails_app/config/initializers/devise.rb +178 -0
  187. data/test/rails_app/config/initializers/inflections.rb +2 -0
  188. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  189. data/test/rails_app/config/routes.rb +100 -0
  190. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  191. data/test/rails_app/db/schema.rb +52 -0
  192. data/test/rails_app/lib/shared_admin.rb +14 -0
  193. data/test/rails_app/lib/shared_user.rb +26 -0
  194. data/test/rails_app/public/404.html +26 -0
  195. data/test/rails_app/public/422.html +26 -0
  196. data/test/rails_app/public/500.html +26 -0
  197. data/test/rails_app/public/favicon.ico +0 -0
  198. data/test/rails_app/script/rails +10 -0
  199. data/test/routes_test.rb +248 -0
  200. data/test/support/assertions.rb +40 -0
  201. data/test/support/helpers.rb +91 -0
  202. data/test/support/integration.rb +92 -0
  203. data/test/support/locale/en.yml +4 -0
  204. data/test/support/webrat/integrations/rails.rb +24 -0
  205. data/test/test_helper.rb +27 -0
  206. data/test/test_helpers_test.rb +151 -0
  207. metadata +421 -0
@@ -0,0 +1,196 @@
1
+ require 'test_helper'
2
+ require 'digest/sha1'
3
+
4
+ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
5
+ test 'should downcase case insensitive keys when saving' do
6
+ # case_insensitive_keys is set to :email by default.
7
+ email = 'Foo@Bar.com'
8
+ user = new_user(:email => email)
9
+
10
+ assert_equal email, user.email
11
+ user.save!
12
+ assert_equal email.downcase, user.email
13
+ end
14
+
15
+ test 'should remove whitespace from strip whitespace keys when saving' do
16
+ # strip_whitespace_keys is set to :email by default.
17
+ email = ' foo@bar.com '
18
+ user = new_user(:email => email)
19
+
20
+ assert_equal email, user.email
21
+ user.save!
22
+ assert_equal email.strip, user.email
23
+ end
24
+
25
+ test "param filter should not convert booleans and integer to strings" do
26
+ conditions = { 'login' => 'foo@bar.com', "bool1" => true, "bool2" => false, "fixnum" => 123, "will_be_converted" => (1..10) }
27
+ conditions = Devise::ParamFilter.new([], []).filter(conditions)
28
+ assert_equal( { 'login' => 'foo@bar.com', "bool1" => true, "bool2" => false, "fixnum" => 123, "will_be_converted" => "1..10" }, conditions)
29
+ end
30
+
31
+ test "param filter should not convert regular expressions to strings" do
32
+ conditions = { "regexp" => /expression/ }
33
+ conditions = Devise::ParamFilter.new([], []).filter(conditions)
34
+ assert_equal( { "regexp" => /expression/ }, conditions)
35
+ end
36
+
37
+ test 'should respond to password and password confirmation' do
38
+ user = new_user
39
+ assert user.respond_to?(:password)
40
+ assert user.respond_to?(:password_confirmation)
41
+ end
42
+
43
+ test 'should generate encrypted password while setting password' do
44
+ user = new_user
45
+ assert_present user.encrypted_password
46
+ end
47
+
48
+ test 'allow authenticatable_salt to work even with nil encrypted password' do
49
+ user = User.new
50
+ user.encrypted_password = nil
51
+ assert_nil user.authenticatable_salt
52
+ end
53
+
54
+ test 'should not generate encrypted password if password is blank' do
55
+ assert_blank new_user(:password => nil).encrypted_password
56
+ assert_blank new_user(:password => '').encrypted_password
57
+ end
58
+
59
+ test 'should encrypt password again if password has changed' do
60
+ user = create_user
61
+ encrypted_password = user.encrypted_password
62
+ user.password = user.password_confirmation = 'new_password'
63
+ user.save!
64
+ assert_not_equal encrypted_password, user.encrypted_password
65
+ end
66
+
67
+ test 'should test for a valid password' do
68
+ user = create_user
69
+ assert user.valid_password?('12345678')
70
+ assert_not user.valid_password?('654321')
71
+ end
72
+
73
+ test 'should not raise error with an empty password' do
74
+ user = create_user
75
+ user.encrypted_password = ''
76
+ assert_nothing_raised { user.valid_password?('12345678') }
77
+ end
78
+
79
+ test 'should be an invalid password if the user has an empty password' do
80
+ user = create_user
81
+ user.encrypted_password = ''
82
+ assert_not user.valid_password?('654321')
83
+ end
84
+
85
+ test 'should respond to current password' do
86
+ assert new_user.respond_to?(:current_password)
87
+ end
88
+
89
+ test 'should update password with valid current password' do
90
+ user = create_user
91
+ assert user.update_with_password(:current_password => '12345678',
92
+ :password => 'pass4321', :password_confirmation => 'pass4321')
93
+ assert user.reload.valid_password?('pass4321')
94
+ end
95
+
96
+ test 'should update password with valid current password and :as option' do
97
+ user = create_user
98
+ assert user.update_with_password(:current_password => '12345678',
99
+ :password => 'pass4321', :password_confirmation => 'pass4321', :as => :admin)
100
+ assert user.reload.valid_password?('pass4321')
101
+ end
102
+
103
+ test 'should add an error to current password when it is invalid' do
104
+ user = create_user
105
+ assert_not user.update_with_password(:current_password => 'other',
106
+ :password => 'pass4321', :password_confirmation => 'pass4321')
107
+ assert user.reload.valid_password?('12345678')
108
+ assert_match "is invalid", user.errors[:current_password].join
109
+ end
110
+
111
+ test 'should not change encrypted password when it is invalid' do
112
+ user = create_user
113
+ assert_not user.update_with_password(:current_password => 'other',
114
+ :password => 'pass4321', :password_confirmation => 'pass4321')
115
+ assert_not user.encrypted_password_changed?
116
+ end
117
+
118
+ test 'should add an error to current password when it is blank' do
119
+ user = create_user
120
+ assert_not user.update_with_password(:password => 'pass4321',
121
+ :password_confirmation => 'pass4321')
122
+ assert user.reload.valid_password?('12345678')
123
+ assert_match "can't be blank", user.errors[:current_password].join
124
+ end
125
+
126
+ test 'should run validations even when current password is invalid or blank' do
127
+ user = UserWithValidation.create!(valid_attributes)
128
+ user.save
129
+ assert user.persisted?
130
+ assert_not user.update_with_password(:username => "")
131
+ assert_match "usertest", user.reload.username
132
+ assert_match "can't be blank", user.errors[:username].join
133
+ end
134
+
135
+ test 'should ignore password and its confirmation if they are blank' do
136
+ user = create_user
137
+ assert user.update_with_password(:current_password => '12345678', :email => "new@example.com")
138
+ assert_equal "new@example.com", user.email
139
+ end
140
+
141
+ test 'should not update password with invalid confirmation' do
142
+ user = create_user
143
+ assert_not user.update_with_password(:current_password => '12345678',
144
+ :password => 'pass4321', :password_confirmation => 'other')
145
+ assert user.reload.valid_password?('12345678')
146
+ end
147
+
148
+ test 'should clean up password fields on failure' do
149
+ user = create_user
150
+ assert_not user.update_with_password(:current_password => '12345678',
151
+ :password => 'pass4321', :password_confirmation => 'other')
152
+ assert user.password.blank?
153
+ assert user.password_confirmation.blank?
154
+ end
155
+
156
+ test 'should update the user without password' do
157
+ user = create_user
158
+ user.update_without_password(:email => 'new@example.com')
159
+ assert_equal 'new@example.com', user.email
160
+ end
161
+
162
+ test 'should update the user without password with :as option' do
163
+ user = create_user
164
+ user.update_without_password(:email => 'new@example.com', :as => :admin)
165
+ assert_equal 'new@example.com', user.email
166
+ end
167
+
168
+ test 'should not update password without password' do
169
+ user = create_user
170
+ user.update_without_password(:password => 'pass4321', :password_confirmation => 'pass4321')
171
+ assert !user.reload.valid_password?('pass4321')
172
+ assert user.valid_password?('12345678')
173
+ end
174
+
175
+ test 'downcase_keys with validation' do
176
+ user = User.create(:email => "HEllO@example.com", :password => "123456")
177
+ user = User.create(:email => "HEllO@example.com", :password => "123456")
178
+ assert !user.valid?
179
+ end
180
+
181
+ test 'required_fiels should be encryptable_password and the email field by default' do
182
+ assert_same_content Devise::Models::DatabaseAuthenticatable.required_fields(User), [
183
+ :email,
184
+ :encrypted_password
185
+ ]
186
+ end
187
+
188
+ test 'required_fields should be encryptable_password and the login when the login is on authentication_keys' do
189
+ swap Devise, :authentication_keys => [:login] do
190
+ assert_same_content Devise::Models::DatabaseAuthenticatable.required_fields(User), [
191
+ :encrypted_password,
192
+ :login
193
+ ]
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,273 @@
1
+ require 'test_helper'
2
+
3
+ class LockableTest < ActiveSupport::TestCase
4
+ def setup
5
+ setup_mailer
6
+ end
7
+
8
+ test "should respect maximum attempts configuration" do
9
+ user = create_user
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
15
+ end
16
+
17
+ test "should increment failed_attempts on successfull validation if the user is already locked" do
18
+ user = create_user
19
+ user.confirm!
20
+
21
+ swap Devise, :maximum_attempts => 2 do
22
+ 3.times { user.valid_for_authentication?{ false } }
23
+ assert user.reload.access_locked?
24
+ end
25
+
26
+ user.valid_for_authentication?{ true }
27
+ assert_equal 4, user.reload.failed_attempts
28
+ end
29
+
30
+ test "should not touch failed_attempts if lock_strategy is none" do
31
+ user = create_user
32
+ user.confirm!
33
+ swap Devise, :lock_strategy => :none, :maximum_attempts => 2 do
34
+ 3.times { user.valid_for_authentication?{ false } }
35
+ assert !user.access_locked?
36
+ assert_equal 0, user.failed_attempts
37
+ end
38
+ end
39
+
40
+ test 'should be valid for authentication with a unlocked user' do
41
+ user = create_user
42
+ user.lock_access!
43
+ user.unlock_access!
44
+ assert user.valid_for_authentication?{ true }
45
+ end
46
+
47
+ test "should verify whether a user is locked or not" do
48
+ user = create_user
49
+ assert_not user.access_locked?
50
+ user.lock_access!
51
+ assert user.access_locked?
52
+ end
53
+
54
+ test "active_for_authentication? should be the opposite of locked?" do
55
+ user = create_user
56
+ user.confirm!
57
+ assert user.active_for_authentication?
58
+ user.lock_access!
59
+ assert_not user.active_for_authentication?
60
+ end
61
+
62
+ test "should unlock a user by cleaning locked_at, falied_attempts and unlock_token" do
63
+ user = create_user
64
+ user.lock_access!
65
+ assert_not_nil user.reload.locked_at
66
+ assert_not_nil user.reload.unlock_token
67
+
68
+ user.unlock_access!
69
+ assert_nil user.reload.locked_at
70
+ assert_nil user.reload.unlock_token
71
+ assert_equal 0, user.reload.failed_attempts
72
+ end
73
+
74
+ test "new user should not be locked and should have zero failed_attempts" do
75
+ assert_not new_user.access_locked?
76
+ assert_equal 0, create_user.failed_attempts
77
+ end
78
+
79
+ test "should unlock user after unlock_in period" do
80
+ swap Devise, :unlock_in => 3.hours do
81
+ user = new_user
82
+ user.locked_at = 2.hours.ago
83
+ assert user.access_locked?
84
+
85
+ Devise.unlock_in = 1.hour
86
+ assert_not user.access_locked?
87
+ end
88
+ end
89
+
90
+ test "should not unlock in 'unlock_in' if :time unlock strategy is not set" do
91
+ swap Devise, :unlock_strategy => :email do
92
+ user = new_user
93
+ user.locked_at = 2.hours.ago
94
+ assert user.access_locked?
95
+ end
96
+ end
97
+
98
+ test "should set unlock_token when locking" do
99
+ user = create_user
100
+ assert_nil user.unlock_token
101
+ user.lock_access!
102
+ assert_not_nil user.unlock_token
103
+ end
104
+
105
+ test "should never generate the same unlock token for different users" do
106
+ unlock_tokens = []
107
+ 3.times do
108
+ user = create_user
109
+ user.lock_access!
110
+ token = user.unlock_token
111
+ assert !unlock_tokens.include?(token)
112
+ unlock_tokens << token
113
+ end
114
+ end
115
+
116
+ test "should not generate unlock_token when :email is not an unlock strategy" do
117
+ swap Devise, :unlock_strategy => :time do
118
+ user = create_user
119
+ user.lock_access!
120
+ assert_nil user.unlock_token
121
+ end
122
+ end
123
+
124
+ test "should send email with unlock instructions when :email is an unlock strategy" do
125
+ swap Devise, :unlock_strategy => :email do
126
+ user = create_user
127
+ assert_email_sent do
128
+ user.lock_access!
129
+ end
130
+ end
131
+ end
132
+
133
+ test "should not send email with unlock instructions when :email is not an unlock strategy" do
134
+ swap Devise, :unlock_strategy => :time do
135
+ user = create_user
136
+ assert_email_not_sent do
137
+ user.lock_access!
138
+ end
139
+ end
140
+ end
141
+
142
+ test 'should find and unlock a user automatically' do
143
+ user = create_user
144
+ user.lock_access!
145
+ locked_user = User.unlock_access_by_token(user.unlock_token)
146
+ assert_equal locked_user, user
147
+ assert_not user.reload.access_locked?
148
+ end
149
+
150
+ test 'should return a new record with errors when a invalid token is given' do
151
+ locked_user = User.unlock_access_by_token('invalid_token')
152
+ assert_not locked_user.persisted?
153
+ assert_equal "is invalid", locked_user.errors[:unlock_token].join
154
+ end
155
+
156
+ test 'should return a new record with errors when a blank token is given' do
157
+ locked_user = User.unlock_access_by_token('')
158
+ assert_not locked_user.persisted?
159
+ assert_equal "can't be blank", locked_user.errors[:unlock_token].join
160
+ end
161
+
162
+ test 'should find a user to send unlock instructions' do
163
+ user = create_user
164
+ user.lock_access!
165
+ unlock_user = User.send_unlock_instructions(:email => user.email)
166
+ assert_equal unlock_user, user
167
+ end
168
+
169
+ test 'should return a new user if no email was found' do
170
+ unlock_user = User.send_unlock_instructions(:email => "invalid@example.com")
171
+ assert_not unlock_user.persisted?
172
+ end
173
+
174
+ test 'should add error to new user email if no email was found' do
175
+ unlock_user = User.send_unlock_instructions(:email => "invalid@example.com")
176
+ assert_equal 'not found', unlock_user.errors[:email].join
177
+ end
178
+
179
+ test 'should find a user to send unlock instructions by authentication_keys' do
180
+ swap Devise, :authentication_keys => [:username, :email] do
181
+ user = create_user
182
+ unlock_user = User.send_unlock_instructions(:email => user.email, :username => user.username)
183
+ assert_equal unlock_user, user
184
+ end
185
+ end
186
+
187
+ test 'should require all unlock_keys' do
188
+ swap Devise, :unlock_keys => [:username, :email] do
189
+ user = create_user
190
+ unlock_user = User.send_unlock_instructions(:email => user.email)
191
+ assert_not unlock_user.persisted?
192
+ assert_equal "can't be blank", unlock_user.errors[:username].join
193
+ end
194
+ end
195
+
196
+ test 'should not be able to send instructions if the user is not locked' do
197
+ user = create_user
198
+ assert_not user.resend_unlock_token
199
+ assert_not user.access_locked?
200
+ assert_equal 'was not locked', user.errors[:email].join
201
+ end
202
+
203
+ test 'should unlock account if lock has expired and increase attempts on failure' do
204
+ swap Devise, :unlock_in => 1.minute do
205
+ user = create_user
206
+ user.confirm!
207
+
208
+ user.failed_attempts = 2
209
+ user.locked_at = 2.minutes.ago
210
+
211
+ user.valid_for_authentication? { false }
212
+ assert_equal 1, user.failed_attempts
213
+ end
214
+ end
215
+
216
+ test 'should unlock account if lock has expired on success' do
217
+ swap Devise, :unlock_in => 1.minute do
218
+ user = create_user
219
+ user.confirm!
220
+
221
+ user.failed_attempts = 2
222
+ user.locked_at = 2.minutes.ago
223
+
224
+ user.valid_for_authentication? { true }
225
+ assert_equal 0, user.failed_attempts
226
+ assert_nil user.locked_at
227
+ end
228
+ end
229
+
230
+ test 'required_fields should contain the all the fields when all the strategies are enabled' do
231
+ swap Devise, :unlock_strategy => :both do
232
+ swap Devise, :lock_strategy => :failed_attempts do
233
+ assert_same_content Devise::Models::Lockable.required_fields(User), [
234
+ :failed_attempts,
235
+ :locked_at,
236
+ :unlock_token
237
+ ]
238
+ end
239
+ end
240
+ end
241
+
242
+ test 'required_fields should contain only failed_attempts and locked_at when the strategies are time and failed_attempts are enabled' do
243
+ swap Devise, :unlock_strategy => :time do
244
+ swap Devise, :lock_strategy => :failed_attempts do
245
+ assert_same_content Devise::Models::Lockable.required_fields(User), [
246
+ :failed_attempts,
247
+ :locked_at
248
+ ]
249
+ end
250
+ end
251
+ end
252
+
253
+ test 'required_fields should contain only failed_attempts and unlock_token when the strategies are token and failed_attempts are enabled' do
254
+ swap Devise, :unlock_strategy => :email do
255
+ swap Devise, :lock_strategy => :failed_attempts do
256
+ assert_same_content Devise::Models::Lockable.required_fields(User), [
257
+ :failed_attempts,
258
+ :unlock_token
259
+ ]
260
+ end
261
+ end
262
+ end
263
+
264
+ test 'should not return a locked unauthenticated message if in paranoid mode' do
265
+ swap Devise, :paranoid => :true do
266
+ user = create_user
267
+ user.failed_attempts = Devise.maximum_attempts + 1
268
+ user.lock_access!
269
+
270
+ assert_equal :invalid, user.unauthenticated_message
271
+ end
272
+ end
273
+ end