authlogic 2.0.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. data/.gitignore +9 -0
  2. data/CHANGELOG.rdoc +110 -1
  3. data/{MIT-LICENSE → LICENSE} +1 -1
  4. data/README.rdoc +138 -161
  5. data/Rakefile +40 -19
  6. data/VERSION.yml +4 -0
  7. data/authlogic.gemspec +212 -0
  8. data/init.rb +1 -1
  9. data/lib/authlogic/acts_as_authentic/base.rb +44 -35
  10. data/lib/authlogic/acts_as_authentic/email.rb +47 -14
  11. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +20 -14
  12. data/lib/authlogic/acts_as_authentic/login.rb +84 -8
  13. data/lib/authlogic/acts_as_authentic/password.rb +207 -88
  14. data/lib/authlogic/acts_as_authentic/perishable_token.rb +9 -4
  15. data/lib/authlogic/acts_as_authentic/persistence_token.rb +4 -2
  16. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +5 -4
  17. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +16 -4
  18. data/lib/authlogic/acts_as_authentic/single_access_token.rb +10 -3
  19. data/lib/authlogic/acts_as_authentic/validations_scope.rb +1 -1
  20. data/lib/authlogic/controller_adapters/abstract_adapter.rb +13 -1
  21. data/lib/authlogic/controller_adapters/rails_adapter.rb +14 -4
  22. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +61 -0
  23. data/lib/authlogic/crypto_providers/aes256.rb +2 -2
  24. data/lib/authlogic/crypto_providers/bcrypt.rb +3 -1
  25. data/lib/authlogic/crypto_providers/sha1.rb +2 -2
  26. data/lib/authlogic/i18n/translator.rb +15 -0
  27. data/lib/authlogic/i18n.rb +43 -14
  28. data/lib/authlogic/regex.rb +25 -0
  29. data/lib/authlogic/session/activation.rb +2 -0
  30. data/lib/authlogic/session/active_record_trickery.rb +26 -5
  31. data/lib/authlogic/session/brute_force_protection.rb +30 -11
  32. data/lib/authlogic/session/callbacks.rb +18 -7
  33. data/lib/authlogic/session/cookies.rb +21 -17
  34. data/lib/authlogic/session/existence.rb +6 -2
  35. data/lib/authlogic/session/foundation.rb +1 -1
  36. data/lib/authlogic/session/http_auth.rb +46 -11
  37. data/lib/authlogic/session/magic_columns.rb +29 -9
  38. data/lib/authlogic/session/magic_states.rb +6 -5
  39. data/lib/authlogic/session/params.rb +16 -10
  40. data/lib/authlogic/session/password.rb +115 -31
  41. data/lib/authlogic/session/priority_record.rb +1 -1
  42. data/lib/authlogic/session/session.rb +5 -3
  43. data/lib/authlogic/session/timeout.rb +1 -1
  44. data/lib/authlogic/session/validation.rb +13 -7
  45. data/lib/authlogic/test_case/mock_controller.rb +45 -0
  46. data/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
  47. data/lib/authlogic/test_case/mock_logger.rb +10 -0
  48. data/lib/authlogic/test_case/mock_request.rb +19 -0
  49. data/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
  50. data/lib/authlogic/test_case.rb +114 -0
  51. data/lib/authlogic.rb +4 -3
  52. data/rails/init.rb +1 -0
  53. data/shoulda_macros/authlogic.rb +3 -2
  54. data/test/acts_as_authentic_test/base_test.rb +6 -0
  55. data/test/acts_as_authentic_test/email_test.rb +25 -7
  56. data/test/acts_as_authentic_test/login_test.rb +37 -7
  57. data/test/acts_as_authentic_test/magic_columns_test.rb +4 -4
  58. data/test/acts_as_authentic_test/password_test.rb +46 -44
  59. data/test/acts_as_authentic_test/perishable_token_test.rb +36 -2
  60. data/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  61. data/test/acts_as_authentic_test/session_maintenance_test.rb +26 -18
  62. data/test/acts_as_authentic_test/single_access_test.rb +6 -1
  63. data/test/i18n_test.rb +33 -0
  64. data/test/libs/affiliate.rb +7 -0
  65. data/test/libs/ldaper.rb +3 -0
  66. data/test/random_test.rb +2 -2
  67. data/test/session_test/activation_test.rb +1 -1
  68. data/test/session_test/active_record_trickery_test.rb +12 -2
  69. data/test/session_test/brute_force_protection_test.rb +37 -12
  70. data/test/session_test/cookies_test.rb +3 -3
  71. data/test/session_test/existence_test.rb +3 -3
  72. data/test/session_test/http_auth_test.rb +20 -8
  73. data/test/session_test/magic_columns_test.rb +9 -6
  74. data/test/session_test/magic_states_test.rb +3 -3
  75. data/test/session_test/params_test.rb +4 -4
  76. data/test/session_test/password_test.rb +23 -1
  77. data/test/session_test/session_test.rb +9 -9
  78. data/test/session_test/timeout_test.rb +10 -1
  79. data/test/test_helper.rb +53 -23
  80. metadata +42 -27
  81. data/Manifest.txt +0 -111
  82. data/lib/authlogic/testing/test_unit_helpers.rb +0 -39
  83. data/lib/authlogic/version.rb +0 -56
  84. data/test/libs/mock_controller.rb +0 -35
  85. data/test/libs/mock_cookie_jar.rb +0 -10
  86. data/test/libs/mock_request.rb +0 -5
@@ -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,114 @@
1
+ require File.dirname(__FILE__) + "/test_case/rails_request_adapter"
2
+ require File.dirname(__FILE__) + "/test_case/mock_cookie_jar"
3
+ require File.dirname(__FILE__) + "/test_case/mock_controller"
4
+ require File.dirname(__FILE__) + "/test_case/mock_logger"
5
+ require File.dirname(__FILE__) + "/test_case/mock_request"
6
+
7
+ module Authlogic
8
+ # This module is a collection of methods and classes that help you easily test Authlogic. In fact,
9
+ # I use these same tools to test the internals of Authlogic.
10
+ #
11
+ # === The quick and dirty
12
+ #
13
+ # require "authlogic/test_case" # include at the top of test_helper.rb
14
+ # setup :activate_authlogic # run before tests are executed
15
+ # UserSession.create(users(:whomever)) # logs a user in
16
+ #
17
+ # For a more detailed explanation, see below.
18
+ #
19
+ # === Setting up
20
+ #
21
+ # Authlogic comes with some simple testing tools. To get these, you need to first require Authlogic's TestCase. If
22
+ # you are doing this in a rails app, you would require this file at the top of your test_helper.rb file:
23
+ #
24
+ # require "authlogic/test_case"
25
+ #
26
+ # If you are using Test::Unit::TestCase, the standard testing library that comes with ruby, then you can skip this next part.
27
+ # If you are not, you need to include the Authlogic::TestCase into your testing suite as follows:
28
+ #
29
+ # include Authlogic::TestCase
30
+ #
31
+ # Now that everything is ready to go, let's move onto actually testing. Here is the basic idea behind testing:
32
+ #
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
35
+ # Authlogic::Session::Activation::NotActivatedError any time you try to instantiate an object without a "connection".
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
+ #
38
+ # === Fixtures / Factories
39
+ #
40
+ # Creating users via fixtures / factories is easy. Here's an example of a fixture:
41
+ #
42
+ # ben:
43
+ # email: whatever@whatever.com
44
+ # password_salt: <%= salt = Authlogic::Random.hex_token %>
45
+ # crypted_password: <%= Authlogic::CryptoProviders::Sha512.encrypt("benrocks" + salt) %>
46
+ # persistence_token: <%= Authlogic::Random.hex_token %>
47
+ # single_access_token: <%= Authlogic::Random.friendly_token %>
48
+ # perishable_token: <%= Authlogic::Random.friendly_token %>
49
+ #
50
+ # Notice the crypted_password value. Just supplement that with whatever crypto provider you are using, if you are not using the default.
51
+ #
52
+ # === Functional tests
53
+ #
54
+ # Activating Authlogic isn't a problem here, because making a request will activate Authlogic for you. The problem is
55
+ # logging users in so they can access restricted areas. Solving this is simple, just do this:
56
+ #
57
+ # setup :activate_authlogic
58
+ #
59
+ # For those of you unfamiliar with TestUnit, the setup method bascially just executes a method before any test is ran.
60
+ # It is essentially "setting up" your tests.
61
+ #
62
+ # Once you have done this, just log users in like usual:
63
+ #
64
+ # UserSession.create(users(:whomever))
65
+ # # access my restricted area here
66
+ #
67
+ # Do this before you make your request and it will act as if that user is logged in.
68
+ #
69
+ # === Integration tests
70
+ #
71
+ # Again, just like functional tests, you don't have to do anything. As soon as you make a request, Authlogic will be
72
+ # conntected. If you want to activate Authlogic before making a request follow the same steps described in the
73
+ # "functional tests" section above. It works in the same manner.
74
+ #
75
+ # === Unit tests
76
+ #
77
+ # The only time you need to do any trickiness here is if you want to test Authlogic models. Maybe you added some custom
78
+ # code or methods in your Authlogic models. Maybe you are writing a plugin or a library that extends Authlogic.
79
+ #
80
+ # That being said, in this environment there is no controller. So you need to use a "mock" controller. Something
81
+ # that looks like a controller, acts like a controller, but isn't a "real" controller. You are essentially connecting
82
+ # Authlogic to your "mock" controller, then you can test off of the mock controller to make sure everything is functioning
83
+ # properly.
84
+ #
85
+ # I use a mock controller to test Authlogic myself. It's part of the Authlogic library that you can easily use. It's as simple
86
+ # as functional and integration tests. Just do the following:
87
+ #
88
+ # setup :activate_authlogic
89
+ #
90
+ # You also get a controller method that you can test off of. For example:
91
+ #
92
+ # ben = users(:ben)
93
+ # assert_nil controller.session["user_credentials"]
94
+ # assert UserSession.create(ben)
95
+ # assert_equal controller.session["user_credentials"], ben.persistence_token
96
+ #
97
+ # See how I am checking that Authlogic is interacting with the controller properly? That's the idea here.
98
+ module TestCase
99
+ # Activates authlogic so that you can use it in your tests. You should call this method in your test's setup. Ex:
100
+ #
101
+ # setup :activate_authlogic
102
+ def activate_authlogic
103
+ Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller
104
+ end
105
+
106
+ # The Authlogic::TestCase::MockController object passed to Authlogic to activate it. You can access this in your test.
107
+ # See the module description for an example.
108
+ def controller
109
+ @controller ||= Authlogic::TestCase::MockController.new
110
+ end
111
+ end
112
+
113
+ ::Test::Unit::TestCase.send(:include, TestCase) if defined?(::Test::Unit::TestCase)
114
+ end
data/lib/authlogic.rb CHANGED
@@ -1,12 +1,13 @@
1
- require "active_support"
1
+ require "active_record"
2
2
 
3
- require File.dirname(__FILE__) + "/authlogic/version"
4
3
  require File.dirname(__FILE__) + "/authlogic/i18n"
5
4
  require File.dirname(__FILE__) + "/authlogic/random"
5
+ require File.dirname(__FILE__) + "/authlogic/regex"
6
6
 
7
7
  require File.dirname(__FILE__) + "/authlogic/controller_adapters/abstract_adapter"
8
8
  require File.dirname(__FILE__) + "/authlogic/controller_adapters/rails_adapter" if defined?(Rails)
9
9
  require File.dirname(__FILE__) + "/authlogic/controller_adapters/merb_adapter" if defined?(Merb)
10
+ require File.dirname(__FILE__) + "/authlogic/controller_adapters/sinatra_adapter" if defined?(Sinatra)
10
11
 
11
12
  require File.dirname(__FILE__) + "/authlogic/crypto_providers/md5"
12
13
  require File.dirname(__FILE__) + "/authlogic/crypto_providers/sha1"
@@ -52,4 +53,4 @@ require File.dirname(__FILE__) + "/authlogic/session/session"
52
53
  require File.dirname(__FILE__) + "/authlogic/session/timeout"
53
54
  require File.dirname(__FILE__) + "/authlogic/session/unauthorized_record"
54
55
  require File.dirname(__FILE__) + "/authlogic/session/validation"
55
- require File.dirname(__FILE__) + "/authlogic/session/base"
56
+ require File.dirname(__FILE__) + "/authlogic/session/base"
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require "authlogic"
@@ -2,9 +2,10 @@ module Authlogic
2
2
  module ShouldaMacros
3
3
  class Test::Unit::TestCase
4
4
  def self.should_be_authentic
5
- klass = model_class
5
+ klass = described_type rescue model_class
6
6
  should "acts as authentic" do
7
- assert klass.respond_to?(:acts_as_authentic_config)
7
+ assert klass.new.respond_to?(:password=)
8
+ assert klass.new.respond_to?(:valid_password?)
8
9
  end
9
10
  end
10
11
  end
@@ -8,5 +8,11 @@ module ActsAsAuthenticTest
8
8
  end
9
9
  end
10
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
11
17
  end
12
18
  end
@@ -33,7 +33,7 @@ module ActsAsAuthenticTest
33
33
  end
34
34
 
35
35
  def test_validates_format_of_email_field_options_config
36
- default = {:with => User.send(:email_regex), :message => I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}
36
+ default = {:with => Authlogic::Regex.email, :message => I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}
37
37
  assert_equal default, User.validates_format_of_email_field_options
38
38
  assert_equal default, Employee.validates_format_of_email_field_options
39
39
 
@@ -43,37 +43,55 @@ module ActsAsAuthenticTest
43
43
  assert_equal default, User.validates_format_of_email_field_options
44
44
  end
45
45
 
46
+ def test_validates_uniqueness_of_email_field_options_config
47
+ default = {:case_sensitive => false, :scope => Employee.validations_scope, :if => "#{Employee.email_field}_changed?".to_sym}
48
+ assert_equal default, Employee.validates_uniqueness_of_email_field_options
49
+
50
+ Employee.validates_uniqueness_of_email_field_options = {:yes => "no"}
51
+ assert_equal({:yes => "no"}, Employee.validates_uniqueness_of_email_field_options)
52
+ Employee.validates_uniqueness_of_email_field_options default
53
+ assert_equal default, Employee.validates_uniqueness_of_email_field_options
54
+ end
55
+
46
56
  def test_validates_length_of_email_field
47
57
  u = User.new
48
58
  u.email = "a@a.a"
49
59
  assert !u.valid?
50
- assert u.errors.on(:email)
60
+ assert u.errors[:email].size > 0
51
61
 
52
62
  u.email = "a@a.com"
53
63
  assert !u.valid?
54
- assert !u.errors.on(:email)
64
+ assert u.errors[:email].size == 0
55
65
  end
56
66
 
57
67
  def test_validates_format_of_email_field
58
68
  u = User.new
59
69
  u.email = "aaaaaaaaaaaaa"
60
70
  assert !u.valid?
61
- assert u.errors.on(:email)
71
+ assert u.errors[:email].size > 0
62
72
 
63
73
  u.email = "a@a.com"
64
74
  assert !u.valid?
65
- assert !u.errors.on(:email)
75
+ assert u.errors[:email].size == 0
76
+
77
+ u.email = "dakota.dux+1@gmail.com"
78
+ assert !u.valid?
79
+ assert u.errors[:email].size == 0
66
80
  end
67
81
 
68
82
  def test_validates_uniqueness_of_email_field
69
83
  u = User.new
70
84
  u.email = "bjohnson@binarylogic.com"
71
85
  assert !u.valid?
72
- assert u.errors.on(:email)
86
+ assert u.errors[:email].size > 0
87
+
88
+ u.email = "BJOHNSON@binarylogic.com"
89
+ assert !u.valid?
90
+ assert u.errors[:email].size > 0
73
91
 
74
92
  u.email = "a@a.com"
75
93
  assert !u.valid?
76
- assert !u.errors.on(:email)
94
+ assert u.errors[:email].size == 0
77
95
  end
78
96
  end
79
97
  end
@@ -33,7 +33,7 @@ module ActsAsAuthenticTest
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 = {:with => /\A\w[\w\.+\-_@ ]+\z/, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}
37
37
  assert_equal default, User.validates_format_of_login_field_options
38
38
  assert_equal default, Employee.validates_format_of_login_field_options
39
39
 
@@ -43,37 +43,67 @@ module ActsAsAuthenticTest
43
43
  assert_equal default, User.validates_format_of_login_field_options
44
44
  end
45
45
 
46
+ 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}
48
+ assert_equal default, User.validates_uniqueness_of_login_field_options
49
+
50
+ User.validates_uniqueness_of_login_field_options = {:yes => "no"}
51
+ assert_equal({:yes => "no"}, User.validates_uniqueness_of_login_field_options)
52
+ User.validates_uniqueness_of_login_field_options default
53
+ assert_equal default, User.validates_uniqueness_of_login_field_options
54
+ end
55
+
46
56
  def test_validates_length_of_login_field
47
57
  u = User.new
48
58
  u.login = "a"
49
59
  assert !u.valid?
50
- assert u.errors.on(:login)
60
+ assert u.errors[:login].size > 0
51
61
 
52
62
  u.login = "aaaaaaaaaa"
53
63
  assert !u.valid?
54
- assert !u.errors.on(:login)
64
+ assert u.errors[:login].size == 0
55
65
  end
56
66
 
57
67
  def test_validates_format_of_login_field
58
68
  u = User.new
59
69
  u.login = "fdsf@^&*"
60
70
  assert !u.valid?
61
- assert u.errors.on(:login)
71
+ assert u.errors[:login].size > 0
62
72
 
63
73
  u.login = "fdsfdsfdsfdsfs"
64
74
  assert !u.valid?
65
- assert !u.errors.on(:login)
75
+ assert u.errors[:login].size == 0
76
+
77
+ u.login = "dakota.dux+1@gmail.com"
78
+ assert !u.valid?
79
+ assert u.errors[:login].size == 0
66
80
  end
67
81
 
68
82
  def test_validates_uniqueness_of_login_field
69
83
  u = User.new
70
84
  u.login = "bjohnson"
71
85
  assert !u.valid?
72
- assert u.errors.on(:login)
86
+ assert u.errors[:login].size > 0
87
+
88
+ u.login = "BJOHNSON"
89
+ assert !u.valid?
90
+ assert u.errors[:login].size > 0
73
91
 
74
92
  u.login = "fdsfdsf"
75
93
  assert !u.valid?
76
- assert !u.errors.on(:login)
94
+ assert u.errors[:login].size == 0
95
+ end
96
+
97
+ def test_find_by_smart_case_login_field
98
+ ben = users(:ben)
99
+ assert_equal ben, User.find_by_smart_case_login_field("bjohnson")
100
+ assert_equal ben, User.find_by_smart_case_login_field("BJOHNSON")
101
+ assert_equal ben, User.find_by_smart_case_login_field("Bjohnson")
102
+
103
+ drew = employees(:drew)
104
+ assert_equal drew, Employee.find_by_smart_case_login_field("dgainor@binarylogic.com")
105
+ assert_equal drew, Employee.find_by_smart_case_login_field("Dgainor@binarylogic.com")
106
+ assert_equal drew, Employee.find_by_smart_case_login_field("DGAINOR@BINARYLOGIC.COM")
77
107
  end
78
108
  end
79
109
  end
@@ -6,22 +6,22 @@ module ActsAsAuthenticTest
6
6
  u = User.new
7
7
  u.login_count = -1
8
8
  assert !u.valid?
9
- assert u.errors.on(:login_count)
9
+ assert u.errors[:login_count].size > 0
10
10
 
11
11
  u.login_count = 0
12
12
  assert !u.valid?
13
- assert !u.errors.on(:login_count)
13
+ assert u.errors[:login_count].size == 0
14
14
  end
15
15
 
16
16
  def test_validates_numericality_of_failed_login_count
17
17
  u = User.new
18
18
  u.failed_login_count = -1
19
19
  assert !u.valid?
20
- assert u.errors.on(:failed_login_count)
20
+ assert u.errors[:failed_login_count].size > 0
21
21
 
22
22
  u.failed_login_count = 0
23
23
  assert !u.valid?
24
- assert !u.errors.on(:failed_login_count)
24
+ assert u.errors[:failed_login_count].size == 0
25
25
  end
26
26
  end
27
27
  end
@@ -22,6 +22,24 @@ module ActsAsAuthenticTest
22
22
  assert_equal :password_salt, User.password_salt_field
23
23
  end
24
24
 
25
+ def test_ignore_blank_passwords_config
26
+ assert User.ignore_blank_passwords
27
+ assert Employee.ignore_blank_passwords
28
+
29
+ User.ignore_blank_passwords = false
30
+ assert !User.ignore_blank_passwords
31
+ User.ignore_blank_passwords true
32
+ assert User.ignore_blank_passwords
33
+ end
34
+
35
+ def test_check_passwords_against_database
36
+ assert User.check_passwords_against_database
37
+ User.check_passwords_against_database = false
38
+ assert !User.check_passwords_against_database
39
+ User.check_passwords_against_database true
40
+ assert User.check_passwords_against_database
41
+ end
42
+
25
43
  def test_validate_password_field_config
26
44
  assert User.validate_password_field
27
45
  assert Employee.validate_password_field
@@ -44,7 +62,7 @@ module ActsAsAuthenticTest
44
62
  end
45
63
 
46
64
  def test_validates_confirmation_of_password_field_options_config
47
- default = {:minimum => 4, :if => "#{User.password_salt_field}_changed?".to_sym}
65
+ default = {:if => :require_password?}
48
66
  assert_equal default, User.validates_confirmation_of_password_field_options
49
67
  assert_equal default, Employee.validates_confirmation_of_password_field_options
50
68
 
@@ -85,48 +103,15 @@ module ActsAsAuthenticTest
85
103
  assert_equal [], User.transition_from_crypto_providers
86
104
  end
87
105
 
88
- def test_act_like_restful_authentication_config
89
- assert !User.act_like_restful_authentication
90
- assert !Employee.act_like_restful_authentication
91
-
92
- User.act_like_restful_authentication = true
93
- assert User.act_like_restful_authentication
94
- assert_equal Authlogic::CryptoProviders::Sha1, User.crypto_provider
95
- assert defined?(::REST_AUTH_SITE_KEY)
96
- assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
97
-
98
- User.act_like_restful_authentication false
99
- assert !User.act_like_restful_authentication
100
-
101
- User.crypto_provider = Authlogic::CryptoProviders::Sha512
102
- User.transition_from_crypto_providers = []
103
- end
104
-
105
- def test_transition_from_restful_authentication_config
106
- assert !User.transition_from_restful_authentication
107
- assert !Employee.transition_from_restful_authentication
108
-
109
- User.transition_from_restful_authentication = true
110
- assert User.transition_from_restful_authentication
111
- assert defined?(::REST_AUTH_SITE_KEY)
112
- assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
113
-
114
- User.transition_from_restful_authentication false
115
- assert !User.transition_from_restful_authentication
116
-
117
- User.crypto_provider = Authlogic::CryptoProviders::Sha512
118
- User.transition_from_crypto_providers = []
119
- end
120
-
121
106
  def test_validates_length_of_password
122
107
  u = User.new
123
108
  u.password_confirmation = "test2"
124
109
  assert !u.valid?
125
- assert u.errors.on(:password)
110
+ assert u.errors[:password].size > 0
126
111
 
127
112
  u.password = "test"
128
113
  assert !u.valid?
129
- assert !u.errors.on(:password_confirmation)
114
+ assert u.errors[:password_confirmation].size == 0
130
115
  end
131
116
 
132
117
  def test_validates_confirmation_of_password
@@ -134,34 +119,31 @@ module ActsAsAuthenticTest
134
119
  u.password = "test"
135
120
  u.password_confirmation = "test2"
136
121
  assert !u.valid?
137
- assert u.errors.on(:password)
122
+ assert u.errors[:password].size > 0
138
123
 
139
124
  u.password_confirmation = "test"
140
125
  assert !u.valid?
141
- assert !u.errors.on(:password)
126
+ assert u.errors[:password].size == 0
142
127
  end
143
128
 
144
129
  def test_validates_length_of_password_confirmation
145
130
  u = User.new
146
131
 
147
- assert !u.valid?
148
- assert u.errors.on(:password_confirmation)
149
-
150
132
  u.password = "test"
151
133
  u.password_confirmation = ""
152
134
  assert !u.valid?
153
- assert u.errors.on(:password_confirmation)
135
+ assert u.errors[:password_confirmation].size > 0
154
136
 
155
137
  u.password_confirmation = "test"
156
138
  assert !u.valid?
157
- assert !u.errors.on(:password_confirmation)
139
+ assert u.errors[:password_confirmation].size == 0
158
140
 
159
141
  ben = users(:ben)
160
142
  assert ben.valid?
161
143
 
162
144
  ben.password = "newpass"
163
145
  assert !ben.valid?
164
- assert ben.errors.on(:password_confirmation)
146
+ assert ben.errors[:password_confirmation].size > 0
165
147
 
166
148
  ben.password_confirmation = "newpass"
167
149
  assert ben.valid?
@@ -183,6 +165,26 @@ module ActsAsAuthenticTest
183
165
  transition_password_to(Authlogic::CryptoProviders::Sha512, ben, [Authlogic::CryptoProviders::Sha1, Authlogic::CryptoProviders::BCrypt])
184
166
  end
185
167
 
168
+ def test_checks_password_against_database
169
+ ben = users(:ben)
170
+ ben.password = "new pass"
171
+ assert !ben.valid_password?("new pass")
172
+ assert ben.valid_password?("benrocks")
173
+ end
174
+
175
+ def test_checks_password_against_database_and_always_fails_on_new_records
176
+ user = User.new
177
+ user.password = "new pass"
178
+ assert !user.valid_password?("new pass")
179
+ end
180
+
181
+ def test_checks_password_against_object
182
+ ben = users(:ben)
183
+ ben.password = "new pass"
184
+ assert ben.valid_password?("new pass", false)
185
+ assert !ben.valid_password?("benrocks", false)
186
+ end
187
+
186
188
  def test_reset_password
187
189
  ben = users(:ben)
188
190
  old_crypted_password = ben.crypted_password
@@ -26,7 +26,7 @@ module ActsAsAuthenticTest
26
26
  u = User.new
27
27
  u.perishable_token = users(:ben).perishable_token
28
28
  assert !u.valid?
29
- assert u.errors.on(:perishable_token)
29
+ assert u.errors[:perishable_token].size > 0
30
30
  end
31
31
 
32
32
  def test_before_save_reset_perishable_token
@@ -52,5 +52,39 @@ module ActsAsAuthenticTest
52
52
  ben.reload
53
53
  assert_not_equal old_perishable_token, ben.perishable_token
54
54
  end
55
+
56
+ def test_find_using_perishable_token
57
+ ben = users(:ben)
58
+ assert_equal ben, User.find_using_perishable_token(ben.perishable_token)
59
+ end
60
+
61
+ def test_find_using_perishable_token_when_perished
62
+ ben = users(:ben)
63
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{1.week.ago.to_s(:db)}' where id = #{ben.id}")
64
+ assert_nil User.find_using_perishable_token(ben.perishable_token)
65
+ end
66
+
67
+ def test_find_using_perishable_token_when_perished
68
+ User.perishable_token_valid_for = 1.minute
69
+ ben = users(:ben)
70
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{2.minutes.ago.to_s(:db)}' where id = #{ben.id}")
71
+ assert_nil User.find_using_perishable_token(ben.perishable_token)
72
+ User.perishable_token_valid_for = 10.minutes
73
+ end
74
+
75
+ def test_find_using_perishable_token_when_passing_threshold
76
+ User.perishable_token_valid_for = 1.minute
77
+ ben = users(:ben)
78
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{10.minutes.ago.to_s(:db)}' where id = #{ben.id}")
79
+ assert_nil User.find_using_perishable_token(ben.perishable_token, 5.minutes)
80
+ assert_equal ben, User.find_using_perishable_token(ben.perishable_token, 20.minutes)
81
+ User.perishable_token_valid_for = 10.minutes
82
+ end
83
+
84
+ def test_find_perishable_token_with_bang
85
+ assert_raises ActiveRecord::RecordNotFound do
86
+ User.find_using_perishable_token!('some_bad_value')
87
+ end
88
+ end
55
89
  end
56
- end
90
+ end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ActsAsAuthenticTest
4
+ class RestfulAuthenticationTest < ActiveSupport::TestCase
5
+ def test_act_like_restful_authentication_config
6
+ assert !User.act_like_restful_authentication
7
+ assert !Employee.act_like_restful_authentication
8
+
9
+ User.act_like_restful_authentication = true
10
+ assert User.act_like_restful_authentication
11
+ assert_equal Authlogic::CryptoProviders::Sha1, User.crypto_provider
12
+ assert defined?(::REST_AUTH_SITE_KEY)
13
+ assert_equal '', ::REST_AUTH_SITE_KEY
14
+ assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
15
+
16
+ User.act_like_restful_authentication false
17
+ assert !User.act_like_restful_authentication
18
+
19
+ User.crypto_provider = Authlogic::CryptoProviders::Sha512
20
+ User.transition_from_crypto_providers = []
21
+ end
22
+
23
+ def test_transition_from_restful_authentication_config
24
+ assert !User.transition_from_restful_authentication
25
+ assert !Employee.transition_from_restful_authentication
26
+
27
+ User.transition_from_restful_authentication = true
28
+ assert User.transition_from_restful_authentication
29
+ assert defined?(::REST_AUTH_SITE_KEY)
30
+ assert_equal '', ::REST_AUTH_SITE_KEY
31
+ assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
32
+
33
+ User.transition_from_restful_authentication false
34
+ assert !User.transition_from_restful_authentication
35
+
36
+ User.crypto_provider = Authlogic::CryptoProviders::Sha512
37
+ User.transition_from_crypto_providers = []
38
+ end
39
+ end
40
+ end