nulogy-authlogic 3.1.0.1

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 (129) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +62 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +250 -0
  5. data/Rakefile +50 -0
  6. data/VERSION.yml +5 -0
  7. data/authlogic.gemspec +192 -0
  8. data/generators/session/session_generator.rb +9 -0
  9. data/generators/session/templates/session.rb +2 -0
  10. data/init.rb +1 -0
  11. data/lib/authlogic.rb +64 -0
  12. data/lib/authlogic/acts_as_authentic/base.rb +109 -0
  13. data/lib/authlogic/acts_as_authentic/email.rb +110 -0
  14. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +59 -0
  15. data/lib/authlogic/acts_as_authentic/login.rb +142 -0
  16. data/lib/authlogic/acts_as_authentic/magic_columns.rb +24 -0
  17. data/lib/authlogic/acts_as_authentic/password.rb +355 -0
  18. data/lib/authlogic/acts_as_authentic/perishable_token.rb +105 -0
  19. data/lib/authlogic/acts_as_authentic/persistence_token.rb +68 -0
  20. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +61 -0
  21. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +139 -0
  22. data/lib/authlogic/acts_as_authentic/single_access_token.rb +65 -0
  23. data/lib/authlogic/acts_as_authentic/validations_scope.rb +32 -0
  24. data/lib/authlogic/authenticates_many/association.rb +42 -0
  25. data/lib/authlogic/authenticates_many/base.rb +54 -0
  26. data/lib/authlogic/controller_adapters/abstract_adapter.rb +67 -0
  27. data/lib/authlogic/controller_adapters/merb_adapter.rb +30 -0
  28. data/lib/authlogic/controller_adapters/rails_adapter.rb +50 -0
  29. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +61 -0
  30. data/lib/authlogic/crypto_providers/aes256.rb +43 -0
  31. data/lib/authlogic/crypto_providers/bcrypt.rb +90 -0
  32. data/lib/authlogic/crypto_providers/md5.rb +34 -0
  33. data/lib/authlogic/crypto_providers/sha1.rb +35 -0
  34. data/lib/authlogic/crypto_providers/sha256.rb +50 -0
  35. data/lib/authlogic/crypto_providers/sha512.rb +50 -0
  36. data/lib/authlogic/crypto_providers/wordpress.rb +43 -0
  37. data/lib/authlogic/i18n.rb +84 -0
  38. data/lib/authlogic/i18n/translator.rb +15 -0
  39. data/lib/authlogic/random.rb +33 -0
  40. data/lib/authlogic/regex.rb +25 -0
  41. data/lib/authlogic/session/activation.rb +58 -0
  42. data/lib/authlogic/session/active_record_trickery.rb +72 -0
  43. data/lib/authlogic/session/base.rb +37 -0
  44. data/lib/authlogic/session/brute_force_protection.rb +96 -0
  45. data/lib/authlogic/session/callbacks.rb +96 -0
  46. data/lib/authlogic/session/cookies.rb +182 -0
  47. data/lib/authlogic/session/existence.rb +93 -0
  48. data/lib/authlogic/session/foundation.rb +77 -0
  49. data/lib/authlogic/session/http_auth.rb +99 -0
  50. data/lib/authlogic/session/id.rb +41 -0
  51. data/lib/authlogic/session/klass.rb +69 -0
  52. data/lib/authlogic/session/magic_columns.rb +95 -0
  53. data/lib/authlogic/session/magic_states.rb +59 -0
  54. data/lib/authlogic/session/params.rb +101 -0
  55. data/lib/authlogic/session/password.rb +240 -0
  56. data/lib/authlogic/session/perishable_token.rb +18 -0
  57. data/lib/authlogic/session/persistence.rb +70 -0
  58. data/lib/authlogic/session/priority_record.rb +34 -0
  59. data/lib/authlogic/session/scopes.rb +101 -0
  60. data/lib/authlogic/session/session.rb +62 -0
  61. data/lib/authlogic/session/timeout.rb +82 -0
  62. data/lib/authlogic/session/unauthorized_record.rb +50 -0
  63. data/lib/authlogic/session/validation.rb +82 -0
  64. data/lib/authlogic/test_case.rb +120 -0
  65. data/lib/authlogic/test_case/mock_controller.rb +55 -0
  66. data/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
  67. data/lib/authlogic/test_case/mock_logger.rb +10 -0
  68. data/lib/authlogic/test_case/mock_request.rb +19 -0
  69. data/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
  70. data/lib/generators/authlogic/USAGE +8 -0
  71. data/lib/generators/authlogic/session_generator.rb +14 -0
  72. data/lib/generators/authlogic/templates/session.rb +2 -0
  73. data/rails/init.rb +1 -0
  74. data/shoulda_macros/authlogic.rb +69 -0
  75. data/test/acts_as_authentic_test/base_test.rb +18 -0
  76. data/test/acts_as_authentic_test/email_test.rb +116 -0
  77. data/test/acts_as_authentic_test/logged_in_status_test.rb +50 -0
  78. data/test/acts_as_authentic_test/login_test.rb +116 -0
  79. data/test/acts_as_authentic_test/magic_columns_test.rb +27 -0
  80. data/test/acts_as_authentic_test/password_test.rb +236 -0
  81. data/test/acts_as_authentic_test/perishable_token_test.rb +90 -0
  82. data/test/acts_as_authentic_test/persistence_token_test.rb +55 -0
  83. data/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  84. data/test/acts_as_authentic_test/session_maintenance_test.rb +84 -0
  85. data/test/acts_as_authentic_test/single_access_test.rb +44 -0
  86. data/test/authenticates_many_test.rb +16 -0
  87. data/test/crypto_provider_test/aes256_test.rb +14 -0
  88. data/test/crypto_provider_test/bcrypt_test.rb +14 -0
  89. data/test/crypto_provider_test/sha1_test.rb +23 -0
  90. data/test/crypto_provider_test/sha256_test.rb +14 -0
  91. data/test/crypto_provider_test/sha512_test.rb +14 -0
  92. data/test/fixtures/companies.yml +5 -0
  93. data/test/fixtures/employees.yml +17 -0
  94. data/test/fixtures/projects.yml +3 -0
  95. data/test/fixtures/users.yml +24 -0
  96. data/test/i18n_test.rb +33 -0
  97. data/test/libs/affiliate.rb +7 -0
  98. data/test/libs/company.rb +6 -0
  99. data/test/libs/employee.rb +7 -0
  100. data/test/libs/employee_session.rb +2 -0
  101. data/test/libs/ldaper.rb +3 -0
  102. data/test/libs/ordered_hash.rb +9 -0
  103. data/test/libs/project.rb +3 -0
  104. data/test/libs/user.rb +5 -0
  105. data/test/libs/user_session.rb +5 -0
  106. data/test/random_test.rb +42 -0
  107. data/test/session_test/activation_test.rb +43 -0
  108. data/test/session_test/active_record_trickery_test.rb +46 -0
  109. data/test/session_test/brute_force_protection_test.rb +101 -0
  110. data/test/session_test/callbacks_test.rb +54 -0
  111. data/test/session_test/cookies_test.rb +136 -0
  112. data/test/session_test/credentials_test.rb +0 -0
  113. data/test/session_test/existence_test.rb +64 -0
  114. data/test/session_test/http_auth_test.rb +57 -0
  115. data/test/session_test/id_test.rb +17 -0
  116. data/test/session_test/klass_test.rb +40 -0
  117. data/test/session_test/magic_columns_test.rb +62 -0
  118. data/test/session_test/magic_states_test.rb +60 -0
  119. data/test/session_test/params_test.rb +53 -0
  120. data/test/session_test/password_test.rb +106 -0
  121. data/test/session_test/perishability_test.rb +15 -0
  122. data/test/session_test/persistence_test.rb +21 -0
  123. data/test/session_test/scopes_test.rb +60 -0
  124. data/test/session_test/session_test.rb +59 -0
  125. data/test/session_test/timeout_test.rb +52 -0
  126. data/test/session_test/unauthorized_record_test.rb +13 -0
  127. data/test/session_test/validation_test.rb +23 -0
  128. data/test/test_helper.rb +168 -0
  129. metadata +252 -0
@@ -0,0 +1,14 @@
1
+ module Authlogic
2
+ module TestCase
3
+ class MockCookieJar < Hash # :nodoc:
4
+ def [](key)
5
+ hash = super
6
+ hash && hash[:value]
7
+ end
8
+
9
+ def delete(key, options = {})
10
+ super(key)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Authlogic
2
+ module TestCase
3
+ # Simple class to replace real loggers, so that we can raise any errors being logged.
4
+ class MockLogger
5
+ def error(message)
6
+ raise message
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ module Authlogic
2
+ module TestCase
3
+ class MockRequest # :nodoc:
4
+ attr_accessor :controller
5
+
6
+ def initialize(controller)
7
+ self.controller = controller
8
+ end
9
+
10
+ def remote_ip
11
+ (controller && controller.respond_to?(:env) && controller.env.is_a?(Hash) && controller.env['REMOTE_ADDR']) || "1.1.1.1"
12
+ end
13
+
14
+ private
15
+ def method_missing(*args, &block)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ module Authlogic
2
+ module TestCase
3
+ # Adapts authlogic to work with the @request object when testing. This way Authlogic can set cookies and what not before
4
+ # a request is made, ultimately letting you log in users in functional tests.
5
+ class RailsRequestAdapter < ControllerAdapters::AbstractAdapter
6
+ def authenticate_with_http_basic(&block)
7
+ end
8
+
9
+ def cookies
10
+ new_cookies = MockCookieJar.new
11
+ super.each do |key, value|
12
+ new_cookies[key] = value[:value]
13
+ end
14
+ new_cookies
15
+ end
16
+
17
+ def cookie_domain
18
+ nil
19
+ end
20
+
21
+ def request
22
+ @request ||= MockRequest.new(controller)
23
+ end
24
+
25
+ def request_content_type
26
+ request.format.to_s
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Create session model that represents the user’s current session.
3
+
4
+ Example:
5
+ rails generate authlogic:session UserSession
6
+
7
+ This will create:
8
+ Model UserSession in app/models directory
@@ -0,0 +1,14 @@
1
+ module Authlogic
2
+ class SessionGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+ argument :session_class_name, :type => :string, :default => "Session"
5
+
6
+ def self.banner
7
+ "rails generate authlogic:#{generator_name} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]"
8
+ end
9
+
10
+ def generate_session
11
+ template "session.rb", "app/models/#{session_class_name.underscore}.rb"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,2 @@
1
+ class <%= session_class_name %> < Authlogic::Session::Base
2
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require "authlogic"
@@ -0,0 +1,69 @@
1
+ # Test::Unit
2
+ # Place this file into your test/shoulda_macros directory
3
+ #
4
+ # Example:
5
+ #
6
+ # class UserTest
7
+ # should_have_authlogic
8
+ # end
9
+ #
10
+ # Rspec
11
+ # Place this file into your spec/support/shoulda directory
12
+ #
13
+ # Example:
14
+ #
15
+ # describe User do
16
+ # it { should have_authlogic }
17
+ # end
18
+
19
+ module Authlogic
20
+ module Shoulda
21
+
22
+ module Matchers
23
+ def have_authlogic
24
+ HaveAuthlogic.new
25
+ end
26
+ alias_method :be_authentic, :have_authlogic
27
+
28
+ class HaveAuthlogic
29
+
30
+ def matches?(subject)
31
+ subject.respond_to?(:password=) && subject.respond_to?(:valid_password?)
32
+ end
33
+
34
+ def failure_message
35
+ "Add the line 'acts_as_authentic' to your model"
36
+ end
37
+
38
+ def description
39
+ "have Authlogic"
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ module Macros
46
+ include Matchers
47
+
48
+ def should_have_authlogic
49
+ klass = described_type rescue model_class
50
+ matcher = HaveAuthlogic.new
51
+
52
+ should matcher.description do
53
+ assert matcher.matches?(klass.new), matcher.failure_message
54
+ end
55
+ end
56
+ alias_method :should_be_authentic, :should_have_authlogic
57
+
58
+ end
59
+
60
+ end
61
+ end
62
+
63
+ if defined? Spec
64
+ Spec::Runner.configure do |config|
65
+ config.include(Authlogic::Shoulda::Matchers)
66
+ end
67
+ else
68
+ Test::Unit::TestCase.class_eval { extend Authlogic::Shoulda::Macros }
69
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ module ActsAsAuthenticTest
4
+ class BaseTest < ActiveSupport::TestCase
5
+ def test_acts_as_authentic
6
+ assert_nothing_raised do
7
+ User.acts_as_authentic do
8
+ end
9
+ end
10
+ end
11
+
12
+ def test_acts_as_authentic_with_old_config
13
+ assert_raise(ArgumentError) do
14
+ User.acts_as_authentic({})
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ module ActsAsAuthenticTest
4
+ class EmailTest < ActiveSupport::TestCase
5
+ def test_email_field_config
6
+ assert_equal :email, User.email_field
7
+ assert_equal :email, Employee.email_field
8
+
9
+ User.email_field = :nope
10
+ assert_equal :nope, User.email_field
11
+ User.email_field :email
12
+ assert_equal :email, User.email_field
13
+ end
14
+
15
+ def test_validate_email_field_config
16
+ assert User.validate_email_field
17
+ assert Employee.validate_email_field
18
+
19
+ User.validate_email_field = false
20
+ assert !User.validate_email_field
21
+ User.validate_email_field true
22
+ assert User.validate_email_field
23
+ end
24
+
25
+ def test_validates_length_of_email_field_options_config
26
+ assert_equal({:maximum => 100}, User.validates_length_of_email_field_options)
27
+ assert_equal({:maximum => 100}, Employee.validates_length_of_email_field_options)
28
+
29
+ User.validates_length_of_email_field_options = {:yes => "no"}
30
+ assert_equal({:yes => "no"}, User.validates_length_of_email_field_options)
31
+ User.validates_length_of_email_field_options({:within => 6..100})
32
+ assert_equal({:within => 6..100}, User.validates_length_of_email_field_options)
33
+ end
34
+
35
+ def test_validates_format_of_email_field_options_config
36
+ email_invalid_msg = I18n.t('error_messages.email_invalid', :default => "should look like an email address.")
37
+ default = {:with => Authlogic::Regex.email, :message => email_invalid_msg}
38
+
39
+ user_options = User.validates_format_of_email_field_options
40
+ assert_equal default[:with], user_options[:with]
41
+ assert_equal email_invalid_msg, user_options[:message].call
42
+
43
+ employee_options = Employee.validates_format_of_email_field_options
44
+ assert_equal default[:with], employee_options[:with]
45
+ assert_equal email_invalid_msg, employee_options[:message].call
46
+
47
+ User.validates_format_of_email_field_options = {:yes => "no"}
48
+ assert_equal({:yes => "no"}, User.validates_format_of_email_field_options)
49
+ User.validates_format_of_email_field_options default
50
+ assert_equal default, User.validates_format_of_email_field_options
51
+ end
52
+
53
+ def test_validates_uniqueness_of_email_field_options_config
54
+ default = {:case_sensitive => false, :scope => Employee.validations_scope, :if => "#{Employee.email_field}_changed?".to_sym}
55
+ assert_equal default, Employee.validates_uniqueness_of_email_field_options
56
+
57
+ Employee.validates_uniqueness_of_email_field_options = {:yes => "no"}
58
+ assert_equal({:yes => "no"}, Employee.validates_uniqueness_of_email_field_options)
59
+ Employee.validates_uniqueness_of_email_field_options default
60
+ assert_equal default, Employee.validates_uniqueness_of_email_field_options
61
+ end
62
+
63
+ def test_validates_length_of_email_field
64
+ u = User.new
65
+ u.email = "a@a.a"
66
+ assert !u.valid?
67
+ assert u.errors[:email].size > 0
68
+
69
+ u.email = "a@a.com"
70
+ assert !u.valid?
71
+ assert u.errors[:email].size == 0
72
+ end
73
+
74
+ def test_validates_format_of_email_field
75
+ u = User.new
76
+ u.email = "aaaaaaaaaaaaa"
77
+ u.valid?
78
+ assert u.errors[:email].size > 0
79
+
80
+ u.email = "a@a.com"
81
+ u.valid?
82
+ assert u.errors[:email].size == 0
83
+
84
+ u.email = "damien+test1...etc..@mydomain.com"
85
+ u.valid?
86
+ assert u.errors[:email].size == 0
87
+
88
+ u.email = "dakota.dux+1@gmail.com"
89
+ u.valid?
90
+ assert u.errors[:email].size == 0
91
+
92
+ u.email = "dakota.d'ux@gmail.com"
93
+ u.valid?
94
+ assert u.errors[:email].size == 0
95
+
96
+ u.email = "<script>alert(123);</script>\nnobody@example.com"
97
+ assert !u.valid?
98
+ assert u.errors[:email].size > 0
99
+ end
100
+
101
+ def test_validates_uniqueness_of_email_field
102
+ u = User.new
103
+ u.email = "bjohnson@binarylogic.com"
104
+ assert !u.valid?
105
+ assert u.errors[:email].size > 0
106
+
107
+ u.email = "BJOHNSON@binarylogic.com"
108
+ assert !u.valid?
109
+ assert u.errors[:email].size > 0
110
+
111
+ u.email = "a@a.com"
112
+ assert !u.valid?
113
+ assert u.errors[:email].size == 0
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ module ActsAsAuthenticTest
4
+ class LoggedInStatusTest < ActiveSupport::TestCase
5
+ ERROR_MSG = 'Multiple calls to %s should result in different relations'
6
+
7
+ def test_logged_in_timeout_config
8
+ assert_equal 10.minutes.to_i, User.logged_in_timeout
9
+ assert_equal 10.minutes.to_i, Employee.logged_in_timeout
10
+
11
+ User.logged_in_timeout = 1.hour
12
+ assert_equal 1.hour.to_i, User.logged_in_timeout
13
+ User.logged_in_timeout 10.minutes
14
+ assert_equal 10.minutes.to_i, User.logged_in_timeout
15
+ end
16
+
17
+ def test_named_scope_logged_in
18
+ # Testing that the scope returned differs, because the time it was called should be
19
+ # slightly different. This is an attempt to make sure the scope is lambda wrapped
20
+ # so that it is re-evaluated every time its called. My biggest concern is that the
21
+ # test happens so fast that the test fails... I just don't know a better way to test it!
22
+ assert User.logged_in.where_values != User.logged_in.where_values, ERROR_MSG % '#logged_in'
23
+
24
+ assert_equal 0, User.logged_in.count
25
+ User.first.update_attribute(:last_request_at, Time.now)
26
+ assert_equal 1, User.logged_in.count
27
+ end
28
+
29
+ def test_named_scope_logged_out
30
+ # Testing that the scope returned differs, because the time it was called should be
31
+ # slightly different. This is an attempt to make sure the scope is lambda wrapped
32
+ # so that it is re-evaluated every time its called. My biggest concern is that the
33
+ # test happens so fast that the test fails... I just don't know a better way to test it!
34
+ assert User.logged_in.where_values != User.logged_out.where_values, ERROR_MSG % '#logged_out'
35
+
36
+ assert_equal 2, User.logged_out.count
37
+ User.first.update_attribute(:last_request_at, Time.now)
38
+ assert_equal 1, User.logged_out.count
39
+ end
40
+
41
+ def test_logged_in_logged_out
42
+ u = User.first
43
+ assert !u.logged_in?
44
+ assert u.logged_out?
45
+ u.last_request_at = Time.now
46
+ assert u.logged_in?
47
+ assert !u.logged_out?
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ module ActsAsAuthenticTest
4
+ class LoginTest < ActiveSupport::TestCase
5
+ def test_login_field_config
6
+ assert_equal :login, User.login_field
7
+ assert_nil Employee.login_field
8
+
9
+ User.login_field = :nope
10
+ assert_equal :nope, User.login_field
11
+ User.login_field :login
12
+ assert_equal :login, User.login_field
13
+ end
14
+
15
+ def test_validate_login_field_config
16
+ assert User.validate_login_field
17
+ assert Employee.validate_login_field
18
+
19
+ User.validate_login_field = false
20
+ assert !User.validate_login_field
21
+ User.validate_login_field true
22
+ assert User.validate_login_field
23
+ end
24
+
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)
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)
33
+ end
34
+
35
+ def test_validates_format_of_login_field_options_config
36
+ login_invalid_msg = I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")
37
+ default = {:with => /\A\w[\w\.+\-_@ ]+$/, :message => login_invalid_msg}
38
+
39
+ user_options = User.validates_format_of_login_field_options
40
+ assert_equal default[:with], user_options[:with]
41
+ assert_equal login_invalid_msg, user_options[:message].call
42
+
43
+ employee_options = Employee.validates_format_of_login_field_options
44
+ assert_equal default[:with], employee_options[:with]
45
+ assert_equal login_invalid_msg, employee_options[:message].call
46
+
47
+ User.validates_format_of_login_field_options = {:yes => "no"}
48
+ assert_equal({:yes => "no"}, User.validates_format_of_login_field_options)
49
+ User.validates_format_of_login_field_options default
50
+ assert_equal default, User.validates_format_of_login_field_options
51
+ end
52
+
53
+ def test_validates_uniqueness_of_login_field_options_config
54
+ default = {:case_sensitive => false, :scope => User.validations_scope, :if => "#{User.login_field}_changed?".to_sym}
55
+ assert_equal default, User.validates_uniqueness_of_login_field_options
56
+
57
+ User.validates_uniqueness_of_login_field_options = {:yes => "no"}
58
+ assert_equal({:yes => "no"}, User.validates_uniqueness_of_login_field_options)
59
+ User.validates_uniqueness_of_login_field_options default
60
+ assert_equal default, User.validates_uniqueness_of_login_field_options
61
+ end
62
+
63
+ def test_validates_length_of_login_field
64
+ u = User.new
65
+ u.login = "a"
66
+ assert !u.valid?
67
+ assert u.errors[:login].size > 0
68
+
69
+ u.login = "aaaaaaaaaa"
70
+ assert !u.valid?
71
+ assert u.errors[:login].size == 0
72
+ end
73
+
74
+ def test_validates_format_of_login_field
75
+ u = User.new
76
+ u.login = "fdsf@^&*"
77
+ assert !u.valid?
78
+ assert u.errors[:login].size > 0
79
+
80
+ u.login = "fdsfdsfdsfdsfs"
81
+ assert !u.valid?
82
+ assert u.errors[:login].size == 0
83
+
84
+ u.login = "dakota.dux+1@gmail.com"
85
+ assert !u.valid?
86
+ assert u.errors[:login].size == 0
87
+ end
88
+
89
+ def test_validates_uniqueness_of_login_field
90
+ u = User.new
91
+ u.login = "bjohnson"
92
+ assert !u.valid?
93
+ assert u.errors[:login].size > 0
94
+
95
+ u.login = "BJOHNSON"
96
+ assert !u.valid?
97
+ assert u.errors[:login].size > 0
98
+
99
+ u.login = "fdsfdsf"
100
+ assert !u.valid?
101
+ assert u.errors[:login].size == 0
102
+ end
103
+
104
+ def test_find_by_smart_case_login_field
105
+ ben = users(:ben)
106
+ assert_equal ben, User.find_by_smart_case_login_field("bjohnson")
107
+ assert_equal ben, User.find_by_smart_case_login_field("BJOHNSON")
108
+ assert_equal ben, User.find_by_smart_case_login_field("Bjohnson")
109
+
110
+ drew = employees(:drew)
111
+ assert_equal drew, Employee.find_by_smart_case_login_field("dgainor@binarylogic.com")
112
+ assert_equal drew, Employee.find_by_smart_case_login_field("Dgainor@binarylogic.com")
113
+ assert_equal drew, Employee.find_by_smart_case_login_field("DGAINOR@BINARYLOGIC.COM")
114
+ end
115
+ end
116
+ end