authlogic 3.4.6 → 3.5.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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +33 -0
  4. data/.rubocop_todo.yml +427 -0
  5. data/.travis.yml +24 -3
  6. data/CHANGELOG.md +9 -2
  7. data/CONTRIBUTING.md +40 -1
  8. data/Gemfile +1 -1
  9. data/README.md +295 -0
  10. data/Rakefile +10 -2
  11. data/authlogic.gemspec +6 -5
  12. data/lib/authlogic.rb +2 -2
  13. data/lib/authlogic/acts_as_authentic/base.rb +2 -2
  14. data/lib/authlogic/acts_as_authentic/email.rb +59 -14
  15. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +4 -3
  16. data/lib/authlogic/acts_as_authentic/login.rb +62 -12
  17. data/lib/authlogic/acts_as_authentic/magic_columns.rb +17 -6
  18. data/lib/authlogic/acts_as_authentic/password.rb +107 -53
  19. data/lib/authlogic/acts_as_authentic/persistence_token.rb +10 -9
  20. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +2 -0
  21. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +48 -35
  22. data/lib/authlogic/acts_as_authentic/single_access_token.rb +19 -15
  23. data/lib/authlogic/acts_as_authentic/validations_scope.rb +2 -2
  24. data/lib/authlogic/authenticates_many/association.rb +6 -5
  25. data/lib/authlogic/authenticates_many/base.rb +22 -12
  26. data/lib/authlogic/config.rb +2 -1
  27. data/lib/authlogic/controller_adapters/abstract_adapter.rb +2 -1
  28. data/lib/authlogic/controller_adapters/rack_adapter.rb +3 -4
  29. data/lib/authlogic/controller_adapters/rails_adapter.rb +26 -14
  30. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +1 -1
  31. data/lib/authlogic/crypto_providers/aes256.rb +16 -12
  32. data/lib/authlogic/crypto_providers/bcrypt.rb +10 -4
  33. data/lib/authlogic/crypto_providers/md5.rb +7 -7
  34. data/lib/authlogic/crypto_providers/scrypt.rb +10 -2
  35. data/lib/authlogic/crypto_providers/sha1.rb +3 -3
  36. data/lib/authlogic/crypto_providers/sha256.rb +3 -3
  37. data/lib/authlogic/crypto_providers/sha512.rb +4 -4
  38. data/lib/authlogic/crypto_providers/wordpress.rb +13 -13
  39. data/lib/authlogic/i18n.rb +22 -16
  40. data/lib/authlogic/i18n/translator.rb +1 -1
  41. data/lib/authlogic/random.rb +13 -12
  42. data/lib/authlogic/regex.rb +3 -3
  43. data/lib/authlogic/session/activation.rb +7 -6
  44. data/lib/authlogic/session/active_record_trickery.rb +1 -2
  45. data/lib/authlogic/session/base.rb +7 -6
  46. data/lib/authlogic/session/brute_force_protection.rb +58 -34
  47. data/lib/authlogic/session/callbacks.rb +16 -12
  48. data/lib/authlogic/session/cookies.rb +29 -14
  49. data/lib/authlogic/session/existence.rb +10 -10
  50. data/lib/authlogic/session/foundation.rb +11 -7
  51. data/lib/authlogic/session/http_auth.rb +6 -5
  52. data/lib/authlogic/session/id.rb +5 -4
  53. data/lib/authlogic/session/klass.rb +2 -1
  54. data/lib/authlogic/session/magic_columns.rb +21 -14
  55. data/lib/authlogic/session/magic_states.rb +25 -14
  56. data/lib/authlogic/session/params.rb +41 -26
  57. data/lib/authlogic/session/password.rb +62 -40
  58. data/lib/authlogic/session/perishable_token.rb +3 -2
  59. data/lib/authlogic/session/persistence.rb +3 -3
  60. data/lib/authlogic/session/priority_record.rb +5 -4
  61. data/lib/authlogic/session/scopes.rb +20 -9
  62. data/lib/authlogic/session/session.rb +9 -4
  63. data/lib/authlogic/session/timeout.rb +40 -23
  64. data/lib/authlogic/session/unauthorized_record.rb +6 -5
  65. data/lib/authlogic/session/validation.rb +18 -9
  66. data/lib/authlogic/test_case.rb +2 -2
  67. data/lib/authlogic/test_case/mock_controller.rb +9 -9
  68. data/lib/authlogic/test_case/mock_cookie_jar.rb +2 -2
  69. data/lib/authlogic/test_case/mock_logger.rb +1 -1
  70. data/lib/authlogic/test_case/mock_request.rb +2 -1
  71. data/lib/authlogic/test_case/rails_request_adapter.rb +5 -5
  72. data/test/acts_as_authentic_test/email_test.rb +29 -17
  73. data/test/acts_as_authentic_test/logged_in_status_test.rb +9 -3
  74. data/test/acts_as_authentic_test/login_test.rb +47 -13
  75. data/test/acts_as_authentic_test/magic_columns_test.rb +4 -4
  76. data/test/acts_as_authentic_test/password_test.rb +31 -21
  77. data/test/acts_as_authentic_test/perishable_token_test.rb +15 -15
  78. data/test/acts_as_authentic_test/session_maintenance_test.rb +20 -13
  79. data/test/acts_as_authentic_test/single_access_test.rb +8 -8
  80. data/test/authenticates_many_test.rb +4 -4
  81. data/test/crypto_provider_test/aes256_test.rb +2 -2
  82. data/test/crypto_provider_test/scrypt_test.rb +1 -1
  83. data/test/crypto_provider_test/sha1_test.rb +3 -3
  84. data/test/crypto_provider_test/sha256_test.rb +1 -1
  85. data/test/crypto_provider_test/sha512_test.rb +2 -2
  86. data/test/gemfiles/Gemfile.rails-3.2.x +2 -2
  87. data/test/gemfiles/Gemfile.rails-5.0.x +6 -0
  88. data/test/i18n_test.rb +5 -5
  89. data/test/libs/affiliate.rb +2 -2
  90. data/test/libs/company.rb +1 -1
  91. data/test/libs/employee.rb +2 -2
  92. data/test/libs/employee_session.rb +1 -1
  93. data/test/libs/ldaper.rb +1 -1
  94. data/test/libs/project.rb +1 -1
  95. data/test/random_test.rb +5 -4
  96. data/test/session_test/activation_test.rb +5 -5
  97. data/test/session_test/active_record_trickery_test.rb +7 -5
  98. data/test/session_test/cookies_test.rb +8 -6
  99. data/test/session_test/existence_test.rb +19 -13
  100. data/test/session_test/http_auth_test.rb +0 -3
  101. data/test/session_test/id_test.rb +2 -2
  102. data/test/session_test/klass_test.rb +1 -1
  103. data/test/session_test/magic_columns_test.rb +0 -3
  104. data/test/session_test/magic_states_test.rb +11 -11
  105. data/test/session_test/params_test.rb +10 -10
  106. data/test/session_test/password_test.rb +4 -5
  107. data/test/session_test/perishability_test.rb +3 -3
  108. data/test/session_test/scopes_test.rb +8 -8
  109. data/test/session_test/session_test.rb +5 -4
  110. data/test/session_test/timeout_test.rb +8 -8
  111. data/test/session_test/unauthorized_record_test.rb +2 -2
  112. data/test/session_test/validation_test.rb +3 -3
  113. data/test/test_helper.rb +9 -5
  114. metadata +54 -24
  115. data/README.rdoc +0 -232
@@ -18,7 +18,7 @@ module Authlogic
18
18
  validate :validate_by_unauthorized_record, :if => :authenticating_with_unauthorized_record?
19
19
  end
20
20
  end
21
-
21
+
22
22
  # Returning meaningful credentials
23
23
  def credentials
24
24
  if authenticating_with_unauthorized_record?
@@ -29,22 +29,23 @@ module Authlogic
29
29
  super
30
30
  end
31
31
  end
32
-
32
+
33
33
  # Setting the unauthorized record if it exists in the credentials passed.
34
34
  def credentials=(value)
35
35
  super
36
36
  values = value.is_a?(Array) ? value : [value]
37
37
  self.unauthorized_record = values.first if values.first.class < ::ActiveRecord::Base
38
38
  end
39
-
39
+
40
40
  private
41
+
41
42
  def authenticating_with_unauthorized_record?
42
43
  !unauthorized_record.nil?
43
44
  end
44
-
45
+
45
46
  def validate_by_unauthorized_record
46
47
  self.attempted_record = unauthorized_record
47
48
  end
48
49
  end
49
50
  end
50
- end
51
+ end
@@ -21,19 +21,19 @@ module Authlogic
21
21
  end
22
22
  end
23
23
  end
24
-
24
+
25
25
  # You should use this as a place holder for any records that you find during validation. The main reason for this is to
26
26
  # allow other modules to use it if needed. Take the failed_login_count feature, it needs this in order to increase
27
27
  # the failed login count.
28
28
  def attempted_record
29
29
  @attempted_record
30
30
  end
31
-
31
+
32
32
  # See attempted_record
33
33
  def attempted_record=(value)
34
34
  @attempted_record = value
35
35
  end
36
-
36
+
37
37
  # The errors in Authlogic work JUST LIKE ActiveRecord. In fact, it uses the exact same ActiveRecord errors class.
38
38
  # Use it the same way:
39
39
  #
@@ -51,31 +51,40 @@ module Authlogic
51
51
  def errors
52
52
  @errors ||= Errors.new(self)
53
53
  end
54
-
54
+
55
55
  # Determines if the information you provided for authentication is valid or not. If there is
56
56
  # a problem with the information provided errors will be added to the errors object and this
57
57
  # method will return false.
58
58
  def valid?
59
59
  errors.clear
60
60
  self.attempted_record = nil
61
-
61
+
62
62
  before_validation
63
63
  new_session? ? before_validation_on_create : before_validation_on_update
64
64
  validate
65
65
  ensure_authentication_attempted
66
-
66
+
67
67
  if errors.size == 0
68
68
  new_session? ? after_validation_on_create : after_validation_on_update
69
69
  after_validation
70
70
  end
71
-
71
+
72
72
  save_record(attempted_record)
73
73
  errors.size == 0
74
74
  end
75
-
75
+
76
76
  private
77
+
77
78
  def ensure_authentication_attempted
78
- errors.add(:base, I18n.t('error_messages.no_authentication_details', :default => "You did not provide any details for authentication.")) if errors.empty? && attempted_record.nil?
79
+ if errors.empty? && attempted_record.nil?
80
+ errors.add(
81
+ :base,
82
+ I18n.t(
83
+ 'error_messages.no_authentication_details',
84
+ :default => "You did not provide any details for authentication."
85
+ )
86
+ )
87
+ end
79
88
  end
80
89
  end
81
90
  end
@@ -31,7 +31,7 @@ module Authlogic
31
31
  # Now that everything is ready to go, let's move onto actually testing. Here is the basic idea behind testing:
32
32
  #
33
33
  # Authlogic requires a "connection" to your controller to activate it. In the same manner that ActiveRecord requires a connection to
34
- # your database. It can't do anything until it gets connnected. That being said, Authlogic will raise an
34
+ # your database. It can't do anything until it gets connected. That being said, Authlogic will raise an
35
35
  # Authlogic::Session::Activation::NotActivatedError any time you try to instantiate an object without a "connection".
36
36
  # So before you do anything with Authlogic, you need to activate / connect Authlogic. Let's walk through how to do this in tests:
37
37
  #
@@ -100,7 +100,7 @@ module Authlogic
100
100
  #
101
101
  # setup :activate_authlogic
102
102
  def activate_authlogic
103
- if @request && ! @request.respond_to?(:params)
103
+ if @request && !@request.respond_to?(:params)
104
104
  class <<@request
105
105
  alias_method :params, :parameters
106
106
  end
@@ -5,14 +5,14 @@ module Authlogic
5
5
  class MockController < ControllerAdapters::AbstractAdapter
6
6
  attr_accessor :http_user, :http_password, :realm
7
7
  attr_writer :request_content_type
8
-
8
+
9
9
  def initialize
10
10
  end
11
-
11
+
12
12
  def authenticate_with_http_basic(&block)
13
13
  yield http_user, http_password
14
14
  end
15
-
15
+
16
16
  def authenticate_or_request_with_http_basic(realm = 'DefaultRealm', &block)
17
17
  self.realm = realm
18
18
  @http_auth_requested = true
@@ -22,27 +22,27 @@ module Authlogic
22
22
  def cookies
23
23
  @cookies ||= MockCookieJar.new
24
24
  end
25
-
25
+
26
26
  def cookie_domain
27
27
  nil
28
28
  end
29
-
29
+
30
30
  def logger
31
31
  @logger ||= MockLogger.new
32
32
  end
33
-
33
+
34
34
  def params
35
35
  @params ||= {}
36
36
  end
37
-
37
+
38
38
  def request
39
39
  @request ||= MockRequest.new(controller)
40
40
  end
41
-
41
+
42
42
  def request_content_type
43
43
  @request_content_type ||= "text/html"
44
44
  end
45
-
45
+
46
46
  def session
47
47
  @session ||= {}
48
48
  end
@@ -5,7 +5,7 @@ module Authlogic
5
5
  hash = super
6
6
  hash && hash[:value]
7
7
  end
8
-
8
+
9
9
  def delete(key, options = {})
10
10
  super(key)
11
11
  end
@@ -36,4 +36,4 @@ module Authlogic
36
36
  end
37
37
  end
38
38
  end
39
- end
39
+ end
@@ -7,4 +7,4 @@ module Authlogic
7
7
  end
8
8
  end
9
9
  end
10
- end
10
+ end
@@ -12,8 +12,9 @@ module Authlogic
12
12
  end
13
13
 
14
14
  private
15
+
15
16
  def method_missing(*args, &block)
16
17
  end
17
18
  end
18
19
  end
19
- end
20
+ end
@@ -5,7 +5,7 @@ module Authlogic
5
5
  class RailsRequestAdapter < ControllerAdapters::AbstractAdapter
6
6
  def authenticate_with_http_basic(&block)
7
7
  end
8
-
8
+
9
9
  def cookies
10
10
  new_cookies = MockCookieJar.new
11
11
  super.each do |key, value|
@@ -13,18 +13,18 @@ module Authlogic
13
13
  end
14
14
  new_cookies
15
15
  end
16
-
16
+
17
17
  def cookie_domain
18
18
  nil
19
19
  end
20
-
20
+
21
21
  def request
22
22
  @request ||= MockRequest.new(controller)
23
23
  end
24
-
24
+
25
25
  def request_content_type
26
26
  request.format.to_s
27
27
  end
28
28
  end
29
29
  end
30
- end
30
+ end
@@ -3,7 +3,6 @@ require 'test_helper'
3
3
 
4
4
  module ActsAsAuthenticTest
5
5
  class EmailTest < ActiveSupport::TestCase
6
-
7
6
  GOOD_ASCII_EMAILS = [
8
7
  "a@a.com",
9
8
  "damien+test1...etc..@mydomain.com",
@@ -83,17 +82,25 @@ module ActsAsAuthenticTest
83
82
  end
84
83
 
85
84
  def test_validates_length_of_email_field_options_config
86
- assert_equal({:maximum => 100}, User.validates_length_of_email_field_options)
87
- assert_equal({:maximum => 100}, Employee.validates_length_of_email_field_options)
85
+ assert_equal({ :maximum => 100 }, User.validates_length_of_email_field_options)
86
+ assert_equal({ :maximum => 100 }, Employee.validates_length_of_email_field_options)
88
87
 
89
- User.validates_length_of_email_field_options = {:yes => "no"}
90
- assert_equal({:yes => "no"}, User.validates_length_of_email_field_options)
91
- User.validates_length_of_email_field_options({:within => 6..100})
92
- assert_equal({:within => 6..100}, User.validates_length_of_email_field_options)
88
+ User.validates_length_of_email_field_options = { :yes => "no" }
89
+ assert_equal({ :yes => "no" }, User.validates_length_of_email_field_options)
90
+ User.validates_length_of_email_field_options({ :within => 6..100 })
91
+ assert_equal({ :within => 6..100 }, User.validates_length_of_email_field_options)
93
92
  end
94
93
 
95
94
  def test_validates_format_of_email_field_options_config
96
- default = {:with => Authlogic::Regex.email, :message => Proc.new{I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}}
95
+ default = {
96
+ :with => Authlogic::Regex.email,
97
+ :message => Proc.new do
98
+ I18n.t(
99
+ 'error_messages.email_invalid',
100
+ :default => "should look like an email address."
101
+ )
102
+ end
103
+ }
97
104
  dmessage = default.delete(:message).call
98
105
 
99
106
  options = User.validates_format_of_email_field_options
@@ -108,13 +115,20 @@ module ActsAsAuthenticTest
108
115
  assert_equal dmessage, message.call
109
116
  assert_equal default, options
110
117
 
111
-
112
- User.validates_format_of_email_field_options = {:yes => "no"}
113
- assert_equal({:yes => "no"}, User.validates_format_of_email_field_options)
118
+ User.validates_format_of_email_field_options = { :yes => "no" }
119
+ assert_equal({ :yes => "no" }, User.validates_format_of_email_field_options)
114
120
  User.validates_format_of_email_field_options default
115
121
  assert_equal default, User.validates_format_of_email_field_options
116
122
 
117
- with_email_nonascii = {:with => Authlogic::Regex.email_nonascii, :message => Proc.new{I18n.t('error_messages.email_invalid_international', :default => "should look like an international email address.")}}
123
+ with_email_nonascii = {
124
+ :with => Authlogic::Regex.email_nonascii,
125
+ :message => Proc.new do
126
+ I18n.t(
127
+ 'error_messages.email_invalid_international',
128
+ :default => "should look like an international email address."
129
+ )
130
+ end
131
+ }
118
132
  User.validates_format_of_email_field_options = with_email_nonascii
119
133
  assert_equal(with_email_nonascii, User.validates_format_of_email_field_options)
120
134
  User.validates_format_of_email_field_options with_email_nonascii
@@ -141,11 +155,11 @@ module ActsAsAuthenticTest
141
155
  end
142
156
 
143
157
  def test_validates_uniqueness_of_email_field_options_config
144
- default = {:case_sensitive => false, :scope => Employee.validations_scope, :if => "#{Employee.email_field}_changed?".to_sym}
158
+ default = { :case_sensitive => false, :scope => Employee.validations_scope, :if => "#{Employee.email_field}_changed?".to_sym }
145
159
  assert_equal default, Employee.validates_uniqueness_of_email_field_options
146
160
 
147
- Employee.validates_uniqueness_of_email_field_options = {:yes => "no"}
148
- assert_equal({:yes => "no"}, Employee.validates_uniqueness_of_email_field_options)
161
+ Employee.validates_uniqueness_of_email_field_options = { :yes => "no" }
162
+ assert_equal({ :yes => "no" }, Employee.validates_uniqueness_of_email_field_options)
149
163
  Employee.validates_uniqueness_of_email_field_options default
150
164
  assert_equal default, Employee.validates_uniqueness_of_email_field_options
151
165
  end
@@ -193,7 +207,6 @@ module ActsAsAuthenticTest
193
207
  end
194
208
 
195
209
  def test_validates_format_of_nonascii_email_field
196
-
197
210
  (GOOD_ASCII_EMAILS + GOOD_ISO88591_EMAILS + GOOD_UTF8_EMAILS).each do |e|
198
211
  assert e =~ Authlogic::Regex.email_nonascii, "Good email should validate: #{e}"
199
212
  end
@@ -201,7 +214,6 @@ module ActsAsAuthenticTest
201
214
  (BAD_ASCII_EMAILS + BAD_ISO88591_EMAILS + BAD_UTF8_EMAILS).each do |e|
202
215
  assert e !~ Authlogic::Regex.email_nonascii, "Bad email should not validate: #{e}"
203
216
  end
204
-
205
217
  end
206
218
 
207
219
  def test_validates_uniqueness_of_email_field
@@ -19,9 +19,12 @@ module ActsAsAuthenticTest
19
19
  # slightly different. This is an attempt to make sure the scope is lambda wrapped
20
20
  # so that it is re-evaluated every time its called. My biggest concern is that the
21
21
  # test happens so fast that the test fails... I just don't know a better way to test it!
22
- query1 = User.logged_in.where_values
22
+
23
+ # for rails 5 I've changed the where_values to to_sql to compare
24
+
25
+ query1 = User.logged_in.to_sql
23
26
  sleep 0.1
24
- query2 = User.logged_in.where_values
27
+ query2 = User.logged_in.to_sql
25
28
  assert query1 != query2, ERROR_MSG % '#logged_in'
26
29
 
27
30
  assert_equal 0, User.logged_in.count
@@ -37,7 +40,10 @@ module ActsAsAuthenticTest
37
40
  # slightly different. This is an attempt to make sure the scope is lambda wrapped
38
41
  # so that it is re-evaluated every time its called. My biggest concern is that the
39
42
  # test happens so fast that the test fails... I just don't know a better way to test it!
40
- assert User.logged_in.where_values != User.logged_out.where_values, ERROR_MSG % '#logged_out'
43
+
44
+ # for rails 5 I've changed the where_values to to_sql to compare
45
+
46
+ assert User.logged_in.to_sql != User.logged_out.to_sql, ERROR_MSG % '#logged_out'
41
47
 
42
48
  assert_equal 3, User.logged_out.count
43
49
  User.first.update_attribute(:last_request_at, Time.now)
@@ -23,32 +23,38 @@ module ActsAsAuthenticTest
23
23
  end
24
24
 
25
25
  def test_validates_length_of_login_field_options_config
26
- assert_equal({:within => 3..100}, User.validates_length_of_login_field_options)
27
- assert_equal({:within => 3..100}, Employee.validates_length_of_login_field_options)
26
+ assert_equal({ :within => 3..100 }, User.validates_length_of_login_field_options)
27
+ assert_equal({ :within => 3..100 }, Employee.validates_length_of_login_field_options)
28
28
 
29
- User.validates_length_of_login_field_options = {:yes => "no"}
30
- assert_equal({:yes => "no"}, User.validates_length_of_login_field_options)
31
- User.validates_length_of_login_field_options({:within => 3..100})
32
- assert_equal({:within => 3..100}, User.validates_length_of_login_field_options)
29
+ User.validates_length_of_login_field_options = { :yes => "no" }
30
+ assert_equal({ :yes => "no" }, User.validates_length_of_login_field_options)
31
+ User.validates_length_of_login_field_options({ :within => 3..100 })
32
+ assert_equal({ :within => 3..100 }, User.validates_length_of_login_field_options)
33
33
  end
34
34
 
35
35
  def test_validates_format_of_login_field_options_config
36
- default = {:with => /\A\w[\w\.+\-_@ ]+\z/, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}
36
+ default = {
37
+ :with => /\A[a-zA-Z0-9_][a-zA-Z0-9\.+\-_@ ]+\z/,
38
+ :message => I18n.t(
39
+ 'error_messages.login_invalid',
40
+ :default => "should use only letters, numbers, spaces, and .-_@+ please."
41
+ )
42
+ }
37
43
  assert_equal default, User.validates_format_of_login_field_options
38
44
  assert_equal default, Employee.validates_format_of_login_field_options
39
45
 
40
- User.validates_format_of_login_field_options = {:yes => "no"}
41
- assert_equal({:yes => "no"}, User.validates_format_of_login_field_options)
46
+ User.validates_format_of_login_field_options = { :yes => "no" }
47
+ assert_equal({ :yes => "no" }, User.validates_format_of_login_field_options)
42
48
  User.validates_format_of_login_field_options default
43
49
  assert_equal default, User.validates_format_of_login_field_options
44
50
  end
45
51
 
46
52
  def test_validates_uniqueness_of_login_field_options_config
47
- default = {:case_sensitive => false, :scope => User.validations_scope, :if => "#{User.login_field}_changed?".to_sym}
53
+ default = { :case_sensitive => false, :scope => User.validations_scope, :if => "#{User.login_field}_changed?".to_sym }
48
54
  assert_equal default, User.validates_uniqueness_of_login_field_options
49
55
 
50
- User.validates_uniqueness_of_login_field_options = {:yes => "no"}
51
- assert_equal({:yes => "no"}, User.validates_uniqueness_of_login_field_options)
56
+ User.validates_uniqueness_of_login_field_options = { :yes => "no" }
57
+ assert_equal({ :yes => "no" }, User.validates_uniqueness_of_login_field_options)
52
58
  User.validates_uniqueness_of_login_field_options default
53
59
  assert_equal default, User.validates_uniqueness_of_login_field_options
54
60
  end
@@ -77,6 +83,34 @@ module ActsAsAuthenticTest
77
83
  u.login = "dakota.dux+1@gmail.com"
78
84
  assert !u.valid?
79
85
  assert u.errors[:login].size == 0
86
+
87
+ u.login = "marks .-_@+"
88
+ assert !u.valid?
89
+ assert u.errors[:login].size == 0
90
+
91
+ u.login = " space"
92
+ assert !u.valid?
93
+ assert u.errors[:login].size > 0
94
+
95
+ u.login = ".dot"
96
+ assert !u.valid?
97
+ assert u.errors[:login].size > 0
98
+
99
+ u.login = "-hyphen"
100
+ assert !u.valid?
101
+ assert u.errors[:login].size > 0
102
+
103
+ u.login = "_underscore"
104
+ assert !u.valid?
105
+ assert u.errors[:login].size == 0
106
+
107
+ u.login = "@atmark"
108
+ assert !u.valid?
109
+ assert u.errors[:login].size > 0
110
+
111
+ u.login = "+plus"
112
+ assert !u.valid?
113
+ assert u.errors[:login].size > 0
80
114
  end
81
115
 
82
116
  def test_validates_uniqueness_of_login_field
@@ -106,4 +140,4 @@ module ActsAsAuthenticTest
106
140
  assert_equal drew, Employee.find_by_smart_case_login_field("DGAINOR@BINARYLOGIC.COM")
107
141
  end
108
142
  end
109
- end
143
+ end