authlogic 3.5.0 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +13 -0
- data/.rubocop_todo.yml +1 -37
- data/.travis.yml +11 -6
- data/CHANGELOG.md +19 -0
- data/CONTRIBUTING.md +13 -2
- data/README.md +2 -3
- data/authlogic.gemspec +5 -5
- data/lib/authlogic/acts_as_authentic/base.rb +4 -2
- data/lib/authlogic/acts_as_authentic/email.rb +8 -3
- data/lib/authlogic/acts_as_authentic/logged_in_status.rb +21 -3
- data/lib/authlogic/acts_as_authentic/login.rb +44 -25
- data/lib/authlogic/acts_as_authentic/password.rb +28 -12
- data/lib/authlogic/acts_as_authentic/perishable_token.rb +21 -12
- data/lib/authlogic/acts_as_authentic/restful_authentication.rb +16 -9
- data/lib/authlogic/acts_as_authentic/session_maintenance.rb +5 -3
- data/lib/authlogic/authenticates_many/association.rb +7 -4
- data/lib/authlogic/controller_adapters/rack_adapter.rb +6 -2
- data/lib/authlogic/controller_adapters/rails_adapter.rb +11 -8
- data/lib/authlogic/crypto_providers/bcrypt.rb +4 -1
- data/lib/authlogic/crypto_providers/sha512.rb +15 -10
- data/lib/authlogic/session/activation.rb +19 -10
- data/lib/authlogic/session/cookies.rb +3 -1
- data/lib/authlogic/session/id.rb +13 -7
- data/lib/authlogic/session/magic_columns.rb +19 -10
- data/lib/authlogic/session/magic_states.rb +7 -1
- data/lib/authlogic/session/password.rb +48 -34
- data/lib/authlogic/session/perishable_token.rb +7 -3
- data/lib/authlogic/session/validation.rb +13 -11
- data/lib/authlogic/test_case.rb +52 -32
- data/test/acts_as_authentic_test/email_test.rb +33 -29
- data/test/acts_as_authentic_test/logged_in_status_test.rb +2 -2
- data/test/acts_as_authentic_test/login_test.rb +50 -37
- data/test/acts_as_authentic_test/magic_columns_test.rb +8 -8
- data/test/acts_as_authentic_test/password_test.rb +14 -14
- data/test/acts_as_authentic_test/perishable_token_test.rb +5 -5
- data/test/acts_as_authentic_test/persistence_token_test.rb +4 -4
- data/test/acts_as_authentic_test/restful_authentication_test.rb +6 -6
- data/test/acts_as_authentic_test/session_maintenance_test.rb +15 -10
- data/test/acts_as_authentic_test/single_access_test.rb +6 -6
- data/test/authenticates_many_test.rb +1 -1
- data/test/gemfiles/Gemfile.rails-5.1.x +6 -0
- data/test/session_test/activation_test.rb +1 -1
- data/test/session_test/active_record_trickery_test.rb +3 -3
- data/test/session_test/brute_force_protection_test.rb +19 -14
- data/test/session_test/cookies_test.rb +21 -12
- data/test/session_test/existence_test.rb +15 -10
- data/test/session_test/http_auth_test.rb +2 -2
- data/test/session_test/magic_columns_test.rb +7 -4
- data/test/session_test/magic_states_test.rb +7 -9
- data/test/session_test/params_test.rb +6 -6
- data/test/session_test/password_test.rb +2 -2
- data/test/session_test/perishability_test.rb +1 -1
- data/test/session_test/persistence_test.rb +2 -2
- data/test/session_test/timeout_test.rb +7 -5
- data/test/session_test/validation_test.rb +1 -1
- data/test/test_helper.rb +10 -2
- metadata +10 -7
@@ -1,7 +1,9 @@
|
|
1
1
|
module Authlogic
|
2
2
|
module Session
|
3
|
-
# Maintains the perishable token, which is helpful for confirming records or
|
4
|
-
#
|
3
|
+
# Maintains the perishable token, which is helpful for confirming records or
|
4
|
+
# authorizing records to reset their password. All that this module does is
|
5
|
+
# reset it after a session have been saved, just keep it changing. The more
|
6
|
+
# it changes, the tighter the security.
|
5
7
|
#
|
6
8
|
# See Authlogic::ActsAsAuthentic::PerishableToken for more information.
|
7
9
|
module PerishableToken
|
@@ -12,7 +14,9 @@ module Authlogic
|
|
12
14
|
private
|
13
15
|
|
14
16
|
def reset_perishable_token!
|
15
|
-
|
17
|
+
if record.respond_to?(:reset_perishable_token) && !record.disable_perishable_token_maintenance?
|
18
|
+
record.reset_perishable_token
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
@@ -2,7 +2,8 @@ module Authlogic
|
|
2
2
|
module Session
|
3
3
|
# Responsible for session validation
|
4
4
|
module Validation
|
5
|
-
# The errors in Authlogic work JUST LIKE ActiveRecord. In fact, it uses
|
5
|
+
# The errors in Authlogic work JUST LIKE ActiveRecord. In fact, it uses
|
6
|
+
# the exact same ActiveRecord errors class. Use it the same way:
|
6
7
|
#
|
7
8
|
# class UserSession
|
8
9
|
# validate :check_if_awesome
|
@@ -22,9 +23,10 @@ module Authlogic
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
# You should use this as a place holder for any records that you find
|
26
|
-
#
|
27
|
-
# the
|
26
|
+
# You should use this as a place holder for any records that you find
|
27
|
+
# during validation. The main reason for this is to allow other modules to
|
28
|
+
# use it if needed. Take the failed_login_count feature, it needs this in
|
29
|
+
# order to increase the failed login count.
|
28
30
|
def attempted_record
|
29
31
|
@attempted_record
|
30
32
|
end
|
@@ -34,8 +36,8 @@ module Authlogic
|
|
34
36
|
@attempted_record = value
|
35
37
|
end
|
36
38
|
|
37
|
-
# The errors in Authlogic work JUST LIKE ActiveRecord. In fact, it uses
|
38
|
-
# Use it the same way:
|
39
|
+
# The errors in Authlogic work JUST LIKE ActiveRecord. In fact, it uses
|
40
|
+
# the exact same ActiveRecord errors class. Use it the same way:
|
39
41
|
#
|
40
42
|
# === Example
|
41
43
|
#
|
@@ -52,9 +54,9 @@ module Authlogic
|
|
52
54
|
@errors ||= Errors.new(self)
|
53
55
|
end
|
54
56
|
|
55
|
-
# Determines if the information you provided for authentication is valid
|
56
|
-
# a problem with the information provided errors will
|
57
|
-
# method will return false.
|
57
|
+
# Determines if the information you provided for authentication is valid
|
58
|
+
# or not. If there is a problem with the information provided errors will
|
59
|
+
# be added to the errors object and this method will return false.
|
58
60
|
def valid?
|
59
61
|
errors.clear
|
60
62
|
self.attempted_record = nil
|
@@ -64,13 +66,13 @@ module Authlogic
|
|
64
66
|
validate
|
65
67
|
ensure_authentication_attempted
|
66
68
|
|
67
|
-
if errors.
|
69
|
+
if errors.empty?
|
68
70
|
new_session? ? after_validation_on_create : after_validation_on_update
|
69
71
|
after_validation
|
70
72
|
end
|
71
73
|
|
72
74
|
save_record(attempted_record)
|
73
|
-
errors.
|
75
|
+
errors.empty?
|
74
76
|
end
|
75
77
|
|
76
78
|
private
|
data/lib/authlogic/test_case.rb
CHANGED
@@ -5,8 +5,9 @@ require File.dirname(__FILE__) + "/test_case/mock_logger"
|
|
5
5
|
require File.dirname(__FILE__) + "/test_case/mock_request"
|
6
6
|
|
7
7
|
module Authlogic
|
8
|
-
# This module is a collection of methods and classes that help you easily test
|
9
|
-
# I use these same tools to test the internals of
|
8
|
+
# This module is a collection of methods and classes that help you easily test
|
9
|
+
# Authlogic. In fact, I use these same tools to test the internals of
|
10
|
+
# Authlogic.
|
10
11
|
#
|
11
12
|
# === The quick and dirty
|
12
13
|
#
|
@@ -18,26 +19,33 @@ module Authlogic
|
|
18
19
|
#
|
19
20
|
# === Setting up
|
20
21
|
#
|
21
|
-
# Authlogic comes with some simple testing tools. To get these, you need to
|
22
|
-
# you are doing this in a rails app,
|
22
|
+
# Authlogic comes with some simple testing tools. To get these, you need to
|
23
|
+
# first require Authlogic's TestCase. If you are doing this in a rails app,
|
24
|
+
# you would require this file at the top of your test_helper.rb file:
|
23
25
|
#
|
24
26
|
# require "authlogic/test_case"
|
25
27
|
#
|
26
|
-
# If you are using Test::Unit::TestCase, the standard testing library that
|
27
|
-
#
|
28
|
+
# If you are using Test::Unit::TestCase, the standard testing library that
|
29
|
+
# comes with ruby, then you can skip this next part. If you are not, you need
|
30
|
+
# to include the Authlogic::TestCase into your testing suite as follows:
|
28
31
|
#
|
29
32
|
# include Authlogic::TestCase
|
30
33
|
#
|
31
|
-
# Now that everything is ready to go, let's move onto actually testing. Here
|
34
|
+
# Now that everything is ready to go, let's move onto actually testing. Here
|
35
|
+
# is the basic idea behind testing:
|
32
36
|
#
|
33
|
-
# Authlogic requires a "connection" to your controller to activate it. In the
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
+
# Authlogic requires a "connection" to your controller to activate it. In the
|
38
|
+
# same manner that ActiveRecord requires a connection to your database. It
|
39
|
+
# can't do anything until it gets connected. That being said, Authlogic will
|
40
|
+
# raise an Authlogic::Session::Activation::NotActivatedError any time you try
|
41
|
+
# to instantiate an object without a "connection". So before you do anything
|
42
|
+
# with Authlogic, you need to activate / connect Authlogic. Let's walk through
|
43
|
+
# how to do this in tests:
|
37
44
|
#
|
38
45
|
# === Fixtures / Factories
|
39
46
|
#
|
40
|
-
# Creating users via fixtures / factories is easy. Here's an example of a
|
47
|
+
# Creating users via fixtures / factories is easy. Here's an example of a
|
48
|
+
# fixture:
|
41
49
|
#
|
42
50
|
# ben:
|
43
51
|
# email: whatever@whatever.com
|
@@ -47,43 +55,52 @@ module Authlogic
|
|
47
55
|
# single_access_token: <%= Authlogic::Random.friendly_token %>
|
48
56
|
# perishable_token: <%= Authlogic::Random.friendly_token %>
|
49
57
|
#
|
50
|
-
# Notice the crypted_password value. Just supplement that with whatever crypto
|
58
|
+
# Notice the crypted_password value. Just supplement that with whatever crypto
|
59
|
+
# provider you are using, if you are not using the default.
|
51
60
|
#
|
52
61
|
# === Functional tests
|
53
62
|
#
|
54
|
-
# Activating Authlogic isn't a problem here, because making a request will
|
55
|
-
#
|
63
|
+
# Activating Authlogic isn't a problem here, because making a request will
|
64
|
+
# activate Authlogic for you. The problem is logging users in so they can
|
65
|
+
# access restricted areas. Solving this is simple, just do this:
|
56
66
|
#
|
57
67
|
# setup :activate_authlogic
|
58
68
|
#
|
59
|
-
# For those of you unfamiliar with TestUnit, the setup method basically just
|
60
|
-
# It is essentially "setting up"
|
69
|
+
# For those of you unfamiliar with TestUnit, the setup method basically just
|
70
|
+
# executes a method before any test is ran. It is essentially "setting up"
|
71
|
+
# your tests.
|
61
72
|
#
|
62
73
|
# Once you have done this, just log users in like usual:
|
63
74
|
#
|
64
75
|
# UserSession.create(users(:whomever))
|
65
76
|
# # access my restricted area here
|
66
77
|
#
|
67
|
-
# Do this before you make your request and it will act as if that user is
|
78
|
+
# Do this before you make your request and it will act as if that user is
|
79
|
+
# logged in.
|
68
80
|
#
|
69
81
|
# === Integration tests
|
70
82
|
#
|
71
|
-
# Again, just like functional tests, you don't have to do anything. As soon as
|
72
|
-
#
|
83
|
+
# Again, just like functional tests, you don't have to do anything. As soon as
|
84
|
+
# you make a request, Authlogic will be connected. If you want to activate
|
85
|
+
# Authlogic before making a request follow the same steps described in the
|
73
86
|
# "functional tests" section above. It works in the same manner.
|
74
87
|
#
|
75
88
|
# === Unit tests
|
76
89
|
#
|
77
|
-
# The only time you need to do any trickiness here is if you want to test
|
78
|
-
#
|
90
|
+
# The only time you need to do any trickiness here is if you want to test
|
91
|
+
# Authlogic models. Maybe you added some custom code or methods in your
|
92
|
+
# Authlogic models. Maybe you are writing a plugin or a library that extends
|
93
|
+
# Authlogic.
|
79
94
|
#
|
80
|
-
# That being said, in this environment there is no controller. So you need to
|
81
|
-
# that looks like a controller, acts like a
|
82
|
-
#
|
83
|
-
#
|
95
|
+
# That being said, in this environment there is no controller. So you need to
|
96
|
+
# use a "mock" controller. Something that looks like a controller, acts like a
|
97
|
+
# controller, but isn't a "real" controller. You are essentially connecting
|
98
|
+
# Authlogic to your "mock" controller, then you can test off of the mock
|
99
|
+
# controller to make sure everything is functioning properly.
|
84
100
|
#
|
85
|
-
# I use a mock controller to test Authlogic myself. It's part of the Authlogic
|
86
|
-
#
|
101
|
+
# I use a mock controller to test Authlogic myself. It's part of the Authlogic
|
102
|
+
# library that you can easily use. It's as simple as functional and
|
103
|
+
# integration tests. Just do the following:
|
87
104
|
#
|
88
105
|
# setup :activate_authlogic
|
89
106
|
#
|
@@ -94,9 +111,11 @@ module Authlogic
|
|
94
111
|
# assert UserSession.create(ben)
|
95
112
|
# assert_equal controller.session["user_credentials"], ben.persistence_token
|
96
113
|
#
|
97
|
-
# See how I am checking that Authlogic is interacting with the controller
|
114
|
+
# See how I am checking that Authlogic is interacting with the controller
|
115
|
+
# properly? That's the idea here.
|
98
116
|
module TestCase
|
99
|
-
# Activates authlogic so that you can use it in your tests. You should call
|
117
|
+
# Activates authlogic so that you can use it in your tests. You should call
|
118
|
+
# this method in your test's setup. Ex:
|
100
119
|
#
|
101
120
|
# setup :activate_authlogic
|
102
121
|
def activate_authlogic
|
@@ -109,8 +128,9 @@ module Authlogic
|
|
109
128
|
Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller
|
110
129
|
end
|
111
130
|
|
112
|
-
# The Authlogic::TestCase::MockController object passed to Authlogic to
|
113
|
-
# See the module description
|
131
|
+
# The Authlogic::TestCase::MockController object passed to Authlogic to
|
132
|
+
# activate it. You can access this in your test. See the module description
|
133
|
+
# for an example.
|
114
134
|
def controller
|
115
135
|
@controller ||= Authlogic::TestCase::MockController.new
|
116
136
|
end
|
@@ -8,7 +8,7 @@ module ActsAsAuthenticTest
|
|
8
8
|
"damien+test1...etc..@mydomain.com",
|
9
9
|
"dakota.dux+1@gmail.com",
|
10
10
|
"dakota.d'ux@gmail.com",
|
11
|
-
"a&b@c.com"
|
11
|
+
"a&b@c.com"
|
12
12
|
]
|
13
13
|
|
14
14
|
BAD_ASCII_EMAILS = [
|
@@ -16,7 +16,7 @@ module ActsAsAuthenticTest
|
|
16
16
|
"aaaaaaaaaaaaa",
|
17
17
|
"question?mark@gmail.com",
|
18
18
|
"backslash@g\\mail.com",
|
19
|
-
"<script>alert(123);</script>\nnobody@example.com"
|
19
|
+
"<script>alert(123);</script>\nnobody@example.com"
|
20
20
|
]
|
21
21
|
|
22
22
|
# http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout
|
@@ -58,7 +58,7 @@ module ActsAsAuthenticTest
|
|
58
58
|
"我>.香港", # greater than
|
59
59
|
"我?本@屋企.香港", # question mark
|
60
60
|
"чебурша@ьн\\ами.рф", # backslash
|
61
|
-
"user@domain.com%0A<script>alert('hello')</script>"
|
61
|
+
"user@domain.com%0A<script>alert('hello')</script>"
|
62
62
|
]
|
63
63
|
|
64
64
|
def test_email_field_config
|
@@ -76,7 +76,7 @@ module ActsAsAuthenticTest
|
|
76
76
|
assert Employee.validate_email_field
|
77
77
|
|
78
78
|
User.validate_email_field = false
|
79
|
-
|
79
|
+
refute User.validate_email_field
|
80
80
|
User.validate_email_field true
|
81
81
|
assert User.validate_email_field
|
82
82
|
end
|
@@ -94,25 +94,25 @@ module ActsAsAuthenticTest
|
|
94
94
|
def test_validates_format_of_email_field_options_config
|
95
95
|
default = {
|
96
96
|
:with => Authlogic::Regex.email,
|
97
|
-
:message =>
|
97
|
+
:message => proc do
|
98
98
|
I18n.t(
|
99
99
|
'error_messages.email_invalid',
|
100
100
|
:default => "should look like an email address."
|
101
101
|
)
|
102
102
|
end
|
103
103
|
}
|
104
|
-
|
104
|
+
default_message = default.delete(:message).call
|
105
105
|
|
106
106
|
options = User.validates_format_of_email_field_options
|
107
107
|
message = options.delete(:message)
|
108
|
-
assert message.
|
109
|
-
assert_equal
|
108
|
+
assert message.is_a?(Proc)
|
109
|
+
assert_equal default_message, message.call
|
110
110
|
assert_equal default, options
|
111
111
|
|
112
112
|
options = Employee.validates_format_of_email_field_options
|
113
113
|
message = options.delete(:message)
|
114
|
-
assert message.
|
115
|
-
assert_equal
|
114
|
+
assert message.is_a?(Proc)
|
115
|
+
assert_equal default_message, message.call
|
116
116
|
assert_equal default, options
|
117
117
|
|
118
118
|
User.validates_format_of_email_field_options = { :yes => "no" }
|
@@ -155,7 +155,11 @@ module ActsAsAuthenticTest
|
|
155
155
|
end
|
156
156
|
|
157
157
|
def test_validates_uniqueness_of_email_field_options_config
|
158
|
-
default = {
|
158
|
+
default = {
|
159
|
+
:case_sensitive => false,
|
160
|
+
:scope => Employee.validations_scope,
|
161
|
+
:if => "#{Employee.email_field}_changed?".to_sym
|
162
|
+
}
|
159
163
|
assert_equal default, Employee.validates_uniqueness_of_email_field_options
|
160
164
|
|
161
165
|
Employee.validates_uniqueness_of_email_field_options = { :yes => "no" }
|
@@ -167,43 +171,43 @@ module ActsAsAuthenticTest
|
|
167
171
|
def test_validates_length_of_email_field
|
168
172
|
u = User.new
|
169
173
|
u.email = "a@a.a"
|
170
|
-
|
171
|
-
|
174
|
+
refute u.valid?
|
175
|
+
refute u.errors[:email].empty?
|
172
176
|
|
173
177
|
u.email = "a@a.com"
|
174
|
-
|
175
|
-
assert u.errors[:email].
|
178
|
+
refute u.valid?
|
179
|
+
assert u.errors[:email].empty?
|
176
180
|
end
|
177
181
|
|
178
182
|
def test_validates_format_of_email_field
|
179
183
|
u = User.new
|
180
184
|
u.email = "aaaaaaaaaaaaa"
|
181
185
|
u.valid?
|
182
|
-
|
186
|
+
refute u.errors[:email].empty?
|
183
187
|
|
184
188
|
u.email = "a@a.com"
|
185
189
|
u.valid?
|
186
|
-
assert u.errors[:email].
|
190
|
+
assert u.errors[:email].empty?
|
187
191
|
|
188
192
|
u.email = "damien+test1...etc..@mydomain.com"
|
189
193
|
u.valid?
|
190
|
-
assert u.errors[:email].
|
194
|
+
assert u.errors[:email].empty?
|
191
195
|
|
192
196
|
u.email = "dakota.dux+1@gmail.com"
|
193
197
|
u.valid?
|
194
|
-
assert u.errors[:email].
|
198
|
+
assert u.errors[:email].empty?
|
195
199
|
|
196
200
|
u.email = "dakota.d'ux@gmail.com"
|
197
201
|
u.valid?
|
198
|
-
assert u.errors[:email].
|
202
|
+
assert u.errors[:email].empty?
|
199
203
|
|
200
204
|
u.email = "<script>alert(123);</script>\nnobody@example.com"
|
201
|
-
|
202
|
-
|
205
|
+
refute u.valid?
|
206
|
+
refute u.errors[:email].empty?
|
203
207
|
|
204
208
|
u.email = "a&b@c.com"
|
205
209
|
u.valid?
|
206
|
-
assert u.errors[:email].
|
210
|
+
assert u.errors[:email].empty?
|
207
211
|
end
|
208
212
|
|
209
213
|
def test_validates_format_of_nonascii_email_field
|
@@ -219,16 +223,16 @@ module ActsAsAuthenticTest
|
|
219
223
|
def test_validates_uniqueness_of_email_field
|
220
224
|
u = User.new
|
221
225
|
u.email = "bjohnson@binarylogic.com"
|
222
|
-
|
223
|
-
|
226
|
+
refute u.valid?
|
227
|
+
refute u.errors[:email].empty?
|
224
228
|
|
225
229
|
u.email = "BJOHNSON@binarylogic.com"
|
226
|
-
|
227
|
-
|
230
|
+
refute u.valid?
|
231
|
+
refute u.errors[:email].empty?
|
228
232
|
|
229
233
|
u.email = "a@a.com"
|
230
|
-
|
231
|
-
assert u.errors[:email].
|
234
|
+
refute u.valid?
|
235
|
+
assert u.errors[:email].empty?
|
232
236
|
end
|
233
237
|
end
|
234
238
|
end
|
@@ -52,11 +52,11 @@ module ActsAsAuthenticTest
|
|
52
52
|
|
53
53
|
def test_logged_in_logged_out
|
54
54
|
u = User.first
|
55
|
-
|
55
|
+
refute u.logged_in?
|
56
56
|
assert u.logged_out?
|
57
57
|
u.last_request_at = Time.now
|
58
58
|
assert u.logged_in?
|
59
|
-
|
59
|
+
refute u.logged_out?
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -17,7 +17,7 @@ module ActsAsAuthenticTest
|
|
17
17
|
assert Employee.validate_login_field
|
18
18
|
|
19
19
|
User.validate_login_field = false
|
20
|
-
|
20
|
+
refute User.validate_login_field
|
21
21
|
User.validate_login_field true
|
22
22
|
assert User.validate_login_field
|
23
23
|
end
|
@@ -35,13 +35,26 @@ module ActsAsAuthenticTest
|
|
35
35
|
def test_validates_format_of_login_field_options_config
|
36
36
|
default = {
|
37
37
|
:with => /\A[a-zA-Z0-9_][a-zA-Z0-9\.+\-_@ ]+\z/,
|
38
|
-
:message =>
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
:message => proc do
|
39
|
+
I18n.t(
|
40
|
+
'error_messages.login_invalid',
|
41
|
+
:default => "should use only letters, numbers, spaces, and .-_@+ please."
|
42
|
+
)
|
43
|
+
end
|
42
44
|
}
|
43
|
-
|
44
|
-
|
45
|
+
default_message = default.delete(:message).call
|
46
|
+
|
47
|
+
options = User.validates_format_of_login_field_options
|
48
|
+
message = options.delete(:message)
|
49
|
+
assert message.is_a?(Proc)
|
50
|
+
assert_equal default_message, message.call
|
51
|
+
assert_equal default, options
|
52
|
+
|
53
|
+
options = Employee.validates_format_of_login_field_options
|
54
|
+
message = options.delete(:message)
|
55
|
+
assert message.is_a?(Proc)
|
56
|
+
assert_equal default_message, message.call
|
57
|
+
assert_equal default, options
|
45
58
|
|
46
59
|
User.validates_format_of_login_field_options = { :yes => "no" }
|
47
60
|
assert_equal({ :yes => "no" }, User.validates_format_of_login_field_options)
|
@@ -62,70 +75,70 @@ module ActsAsAuthenticTest
|
|
62
75
|
def test_validates_length_of_login_field
|
63
76
|
u = User.new
|
64
77
|
u.login = "a"
|
65
|
-
|
66
|
-
|
78
|
+
refute u.valid?
|
79
|
+
refute u.errors[:login].empty?
|
67
80
|
|
68
81
|
u.login = "aaaaaaaaaa"
|
69
|
-
|
70
|
-
assert u.errors[:login].
|
82
|
+
refute u.valid?
|
83
|
+
assert u.errors[:login].empty?
|
71
84
|
end
|
72
85
|
|
73
86
|
def test_validates_format_of_login_field
|
74
87
|
u = User.new
|
75
88
|
u.login = "fdsf@^&*"
|
76
|
-
|
77
|
-
|
89
|
+
refute u.valid?
|
90
|
+
refute u.errors[:login].empty?
|
78
91
|
|
79
92
|
u.login = "fdsfdsfdsfdsfs"
|
80
|
-
|
81
|
-
assert u.errors[:login].
|
93
|
+
refute u.valid?
|
94
|
+
assert u.errors[:login].empty?
|
82
95
|
|
83
96
|
u.login = "dakota.dux+1@gmail.com"
|
84
|
-
|
85
|
-
assert u.errors[:login].
|
97
|
+
refute u.valid?
|
98
|
+
assert u.errors[:login].empty?
|
86
99
|
|
87
100
|
u.login = "marks .-_@+"
|
88
|
-
|
89
|
-
assert u.errors[:login].
|
101
|
+
refute u.valid?
|
102
|
+
assert u.errors[:login].empty?
|
90
103
|
|
91
104
|
u.login = " space"
|
92
|
-
|
93
|
-
|
105
|
+
refute u.valid?
|
106
|
+
refute u.errors[:login].empty?
|
94
107
|
|
95
108
|
u.login = ".dot"
|
96
|
-
|
97
|
-
|
109
|
+
refute u.valid?
|
110
|
+
refute u.errors[:login].empty?
|
98
111
|
|
99
112
|
u.login = "-hyphen"
|
100
|
-
|
101
|
-
|
113
|
+
refute u.valid?
|
114
|
+
refute u.errors[:login].empty?
|
102
115
|
|
103
116
|
u.login = "_underscore"
|
104
|
-
|
105
|
-
assert u.errors[:login].
|
117
|
+
refute u.valid?
|
118
|
+
assert u.errors[:login].empty?
|
106
119
|
|
107
120
|
u.login = "@atmark"
|
108
|
-
|
109
|
-
|
121
|
+
refute u.valid?
|
122
|
+
refute u.errors[:login].empty?
|
110
123
|
|
111
124
|
u.login = "+plus"
|
112
|
-
|
113
|
-
|
125
|
+
refute u.valid?
|
126
|
+
refute u.errors[:login].empty?
|
114
127
|
end
|
115
128
|
|
116
129
|
def test_validates_uniqueness_of_login_field
|
117
130
|
u = User.new
|
118
131
|
u.login = "bjohnson"
|
119
|
-
|
120
|
-
|
132
|
+
refute u.valid?
|
133
|
+
refute u.errors[:login].empty?
|
121
134
|
|
122
135
|
u.login = "BJOHNSON"
|
123
|
-
|
124
|
-
|
136
|
+
refute u.valid?
|
137
|
+
refute u.errors[:login].empty?
|
125
138
|
|
126
139
|
u.login = "fdsfdsf"
|
127
|
-
|
128
|
-
assert u.errors[:login].
|
140
|
+
refute u.valid?
|
141
|
+
assert u.errors[:login].empty?
|
129
142
|
end
|
130
143
|
|
131
144
|
def test_find_by_smart_case_login_field
|