authlogic 3.4.6 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
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