drogus-authlogic 2.1.3

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 (126) hide show
  1. data/.gitignore +9 -0
  2. data/CHANGELOG.rdoc +345 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +246 -0
  5. data/Rakefile +42 -0
  6. data/VERSION.yml +5 -0
  7. data/authlogic.gemspec +217 -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 +107 -0
  13. data/lib/authlogic/acts_as_authentic/email.rb +110 -0
  14. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +60 -0
  15. data/lib/authlogic/acts_as_authentic/login.rb +137 -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 +55 -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 +48 -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 +83 -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 +64 -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 +99 -0
  46. data/lib/authlogic/session/cookies.rb +130 -0
  47. data/lib/authlogic/session/existence.rb +93 -0
  48. data/lib/authlogic/session/foundation.rb +63 -0
  49. data/lib/authlogic/session/http_auth.rb +58 -0
  50. data/lib/authlogic/session/id.rb +41 -0
  51. data/lib/authlogic/session/klass.rb +78 -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 +45 -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/rails/init.rb +1 -0
  71. data/shoulda_macros/authlogic.rb +69 -0
  72. data/test/acts_as_authentic_test/base_test.rb +18 -0
  73. data/test/acts_as_authentic_test/email_test.rb +97 -0
  74. data/test/acts_as_authentic_test/logged_in_status_test.rb +36 -0
  75. data/test/acts_as_authentic_test/login_test.rb +109 -0
  76. data/test/acts_as_authentic_test/magic_columns_test.rb +27 -0
  77. data/test/acts_as_authentic_test/password_test.rb +236 -0
  78. data/test/acts_as_authentic_test/perishable_token_test.rb +90 -0
  79. data/test/acts_as_authentic_test/persistence_token_test.rb +55 -0
  80. data/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  81. data/test/acts_as_authentic_test/session_maintenance_test.rb +84 -0
  82. data/test/acts_as_authentic_test/single_access_test.rb +44 -0
  83. data/test/authenticates_many_test.rb +16 -0
  84. data/test/crypto_provider_test/aes256_test.rb +14 -0
  85. data/test/crypto_provider_test/bcrypt_test.rb +14 -0
  86. data/test/crypto_provider_test/sha1_test.rb +23 -0
  87. data/test/crypto_provider_test/sha256_test.rb +14 -0
  88. data/test/crypto_provider_test/sha512_test.rb +14 -0
  89. data/test/fixtures/companies.yml +5 -0
  90. data/test/fixtures/employees.yml +17 -0
  91. data/test/fixtures/projects.yml +3 -0
  92. data/test/fixtures/users.yml +24 -0
  93. data/test/i18n_test.rb +33 -0
  94. data/test/libs/affiliate.rb +7 -0
  95. data/test/libs/company.rb +6 -0
  96. data/test/libs/employee.rb +7 -0
  97. data/test/libs/employee_session.rb +2 -0
  98. data/test/libs/ldaper.rb +3 -0
  99. data/test/libs/ordered_hash.rb +9 -0
  100. data/test/libs/project.rb +3 -0
  101. data/test/libs/user.rb +5 -0
  102. data/test/libs/user_session.rb +6 -0
  103. data/test/random_test.rb +49 -0
  104. data/test/session_test/activation_test.rb +43 -0
  105. data/test/session_test/active_record_trickery_test.rb +36 -0
  106. data/test/session_test/brute_force_protection_test.rb +101 -0
  107. data/test/session_test/callbacks_test.rb +6 -0
  108. data/test/session_test/cookies_test.rb +112 -0
  109. data/test/session_test/credentials_test.rb +0 -0
  110. data/test/session_test/existence_test.rb +64 -0
  111. data/test/session_test/http_auth_test.rb +28 -0
  112. data/test/session_test/id_test.rb +17 -0
  113. data/test/session_test/klass_test.rb +40 -0
  114. data/test/session_test/magic_columns_test.rb +62 -0
  115. data/test/session_test/magic_states_test.rb +60 -0
  116. data/test/session_test/params_test.rb +53 -0
  117. data/test/session_test/password_test.rb +106 -0
  118. data/test/session_test/perishability_test.rb +15 -0
  119. data/test/session_test/persistence_test.rb +21 -0
  120. data/test/session_test/scopes_test.rb +60 -0
  121. data/test/session_test/session_test.rb +59 -0
  122. data/test/session_test/timeout_test.rb +52 -0
  123. data/test/session_test/unauthorized_record_test.rb +13 -0
  124. data/test/session_test/validation_test.rb +23 -0
  125. data/test/test_helper.rb +182 -0
  126. metadata +238 -0
@@ -0,0 +1,3 @@
1
+ web_services:
2
+ name: web services
3
+ users: ben, zack
@@ -0,0 +1,24 @@
1
+ ben:
2
+ company: binary_logic
3
+ projects: web_services
4
+ login: bjohnson
5
+ password_salt: <%= salt = Authlogic::Random.hex_token %>
6
+ crypted_password: <%= Authlogic::CryptoProviders::Sha512.encrypt("benrocks" + salt) %>
7
+ persistence_token: 6cde0674657a8a313ce952df979de2830309aa4c11ca65805dd00bfdc65dbcc2f5e36718660a1d2e68c1a08c276d996763985d2f06fd3d076eb7bc4d97b1e317
8
+ single_access_token: <%= Authlogic::Random.friendly_token %>
9
+ perishable_token: <%= Authlogic::Random.friendly_token %>
10
+ email: bjohnson@binarylogic.com
11
+ first_name: Ben
12
+ last_name: Johnson
13
+
14
+ zack:
15
+ company: logic_over_data
16
+ projects: web_services
17
+ login: zackham
18
+ password_salt: <%= salt = Authlogic::Random.hex_token %>
19
+ crypted_password: <%= Authlogic::CryptoProviders::Sha512.encrypt("zackrocks" + salt) %>
20
+ persistence_token: fd3c2d5ce09ab98e7547d21f1b3dcf9158a9a19b5d3022c0402f32ae197019fce3fdbc6614d7ee57d719bae53bb089e30edc9e5d6153e5bc3afca0ac1d320342
21
+ single_access_token: <%= Authlogic::Random.friendly_token %>
22
+ email: zham@ziggityzack.com
23
+ first_name: Zack
24
+ last_name: Ham
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class I18nTest < ActiveSupport::TestCase
4
+ def test_uses_authlogic_as_scope_by_default
5
+ assert_equal :authlogic, Authlogic::I18n.scope
6
+ end
7
+
8
+ def test_can_set_scope
9
+ assert_nothing_raised { Authlogic::I18n.scope = [:a, :b] }
10
+ assert_equal [:a, :b], Authlogic::I18n.scope
11
+ Authlogic::I18n.scope = :authlogic
12
+ end
13
+
14
+ def test_uses_built_in_translator_by_default
15
+ assert_equal Authlogic::I18n::Translator, Authlogic::I18n.translator.class
16
+ end
17
+
18
+ def test_can_set_custom_translator
19
+ old_translator = Authlogic::I18n.translator
20
+
21
+ assert_nothing_raised do
22
+ Authlogic::I18n.translator = Class.new do
23
+ def translate(key, options = {})
24
+ "Translated: #{key}"
25
+ end
26
+ end.new
27
+ end
28
+
29
+ assert_equal "Translated: x", Authlogic::I18n.translate(:x)
30
+
31
+ Authlogic::I18n.translator = old_translator
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ class Affiliate < ActiveRecord::Base
2
+ acts_as_authentic do |c|
3
+ c.crypted_password_field = :pw_hash
4
+ end
5
+
6
+ belongs_to :company
7
+ end
@@ -0,0 +1,6 @@
1
+ class Company < ActiveRecord::Base
2
+ authenticates_many :employee_sessions
3
+ authenticates_many :user_sessions
4
+ has_many :employees, :dependent => :destroy
5
+ has_many :users, :dependent => :destroy
6
+ end
@@ -0,0 +1,7 @@
1
+ class Employee < ActiveRecord::Base
2
+ acts_as_authentic do |c|
3
+ c.crypto_provider Authlogic::CryptoProviders::AES256
4
+ end
5
+
6
+ belongs_to :company
7
+ end
@@ -0,0 +1,2 @@
1
+ class EmployeeSession < Authlogic::Session::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ class Ldaper < ActiveRecord::Base
2
+ acts_as_authentic
3
+ end
@@ -0,0 +1,9 @@
1
+ class Hash
2
+ def each(&block)
3
+ sorted_keys = keys.sort { |a, b| a.to_s <=> b.to_s }
4
+ sorted_keys.each do |key|
5
+ yield key, self[key]
6
+ end
7
+ self
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class Project < ActiveRecord::Base
2
+ has_and_belongs_to_many :users
3
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ acts_as_authentic
3
+ belongs_to :company
4
+ has_and_belongs_to_many :projects
5
+ end
@@ -0,0 +1,6 @@
1
+ class UserSession < Authlogic::Session::Base
2
+ end
3
+
4
+ class BackOfficeUserSession < Authlogic::Session::Base
5
+ authenticate_with User
6
+ end
@@ -0,0 +1,49 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class RandomTest < ActiveSupport::TestCase
4
+ def test_random_tokens_have_consisten_length
5
+ with_any_random do
6
+ assert_equal 128, Authlogic::Random.hex_token.length
7
+ assert_equal 20, Authlogic::Random.friendly_token.length
8
+ end
9
+ end
10
+
11
+ def test_random_tokens_are_indeed_random
12
+ # this might fail if you are *really* unlucky :)
13
+ with_any_random do
14
+ assert_not_equal Authlogic::Random.hex_token, Authlogic::Random.hex_token
15
+ assert_not_equal Authlogic::Random.friendly_token, Authlogic::Random.friendly_token
16
+ end
17
+ end
18
+
19
+ private
20
+ def with_any_random(&block)
21
+ [true, false].each {|val| with_secure_random_enabled(val, &block)}
22
+ end
23
+
24
+ def with_secure_random_enabled(enabled = true)
25
+ # can't really test SecureRandom if we don't have an implementation
26
+ return if enabled && !Authlogic::Random::SecureRandom
27
+
28
+ current_sec_rand = Authlogic::Random::SecureRandom
29
+ reload_authlogic_with_sec_random!(current_sec_rand, enabled)
30
+
31
+ yield
32
+ ensure
33
+ reload_authlogic_with_sec_random!(current_sec_rand)
34
+ end
35
+
36
+ def reload_authlogic_with_sec_random!(secure_random, enabled = true)
37
+ silence_warnings do
38
+ secure_random.parent.const_set(secure_random.name.sub("#{secure_random.parent}::", ''), enabled ? secure_random : nil)
39
+ load(File.dirname(__FILE__) + '/../lib/authlogic/random.rb')
40
+ end
41
+ end
42
+
43
+ def silence_warnings
44
+ old_verbose, $VERBOSE = $VERBOSE, nil
45
+ yield
46
+ ensure
47
+ $VERBOSE = old_verbose
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SessionTest
4
+ module ActivationTest
5
+ class ClassMethodsTest < ActiveSupport::TestCase
6
+ def test_activated
7
+ assert UserSession.activated?
8
+ Authlogic::Session::Base.controller = nil
9
+ assert !UserSession.activated?
10
+ end
11
+
12
+ def test_controller
13
+ Authlogic::Session::Base.controller = nil
14
+ assert_nil Authlogic::Session::Base.controller
15
+ thread1 = Thread.new do
16
+ controller = MockController.new
17
+ Authlogic::Session::Base.controller = controller
18
+ assert_equal controller, Authlogic::Session::Base.controller
19
+ end
20
+ thread1.join
21
+
22
+ assert_nil Authlogic::Session::Base.controller
23
+
24
+ thread2 = Thread.new do
25
+ controller = MockController.new
26
+ Authlogic::Session::Base.controller = controller
27
+ assert_equal controller, Authlogic::Session::Base.controller
28
+ end
29
+ thread2.join
30
+
31
+ assert_nil Authlogic::Session::Base.controller
32
+ end
33
+ end
34
+
35
+ class InstanceMethodsTest < ActiveSupport::TestCase
36
+ def test_init
37
+ UserSession.controller = nil
38
+ assert_raise(Authlogic::Session::Activation::NotActivatedError) { UserSession.new }
39
+ UserSession.controller = controller
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SessionTest
4
+ module ActiveRecordTrickeryTest
5
+ class ClassMethodsTest < ActiveSupport::TestCase
6
+ def test_human_attribute_name
7
+ assert_equal "Some attribute", UserSession.human_attribute_name("some_attribute")
8
+ assert_equal "Some attribute", UserSession.human_attribute_name(:some_attribute)
9
+ end
10
+
11
+ def test_human_name
12
+ assert_equal "Usersession", UserSession.human_name
13
+ end
14
+
15
+ def test_self_and_descendents_from_active_record
16
+ assert_equal [UserSession], UserSession.self_and_descendents_from_active_record
17
+ end
18
+
19
+ def test_self_and_descendants_from_active_record
20
+ assert_equal [UserSession], UserSession.self_and_descendants_from_active_record
21
+ end
22
+ end
23
+
24
+ class InstanceMethodsTest < ActiveSupport::TestCase
25
+ def test_new_record
26
+ session = UserSession.new
27
+ assert session.new_record?
28
+ end
29
+
30
+ def test_to_model
31
+ session = UserSession.new
32
+ assert session, session.to_model
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SessionTest
4
+ module BruteForceProtectionTest
5
+ class ConfigTest < ActiveSupport::TestCase
6
+ def test_consecutive_failed_logins_limit
7
+ UserSession.consecutive_failed_logins_limit = 10
8
+ assert_equal 10, UserSession.consecutive_failed_logins_limit
9
+
10
+ UserSession.consecutive_failed_logins_limit 50
11
+ assert_equal 50, UserSession.consecutive_failed_logins_limit
12
+ end
13
+
14
+ def test_failed_login_ban_for
15
+ UserSession.failed_login_ban_for = 10
16
+ assert_equal 10, UserSession.failed_login_ban_for
17
+
18
+ UserSession.failed_login_ban_for 2.hours
19
+ assert_equal 2.hours.to_i, UserSession.failed_login_ban_for
20
+ end
21
+ end
22
+
23
+ class InstaceMethodsTest < ActiveSupport::TestCase
24
+ def test_under_limit
25
+ ben = users(:ben)
26
+ ben.failed_login_count = UserSession.consecutive_failed_logins_limit - 1
27
+ assert ben.save
28
+ assert UserSession.create(:login => ben.login, :password => "benrocks")
29
+ end
30
+
31
+ def test_exceeded_limit
32
+ ben = users(:ben)
33
+ ben.failed_login_count = UserSession.consecutive_failed_logins_limit
34
+ assert ben.save
35
+ assert UserSession.create(:login => ben.login, :password => "benrocks").new_session?
36
+ assert UserSession.create(ben).new_session?
37
+ ben.updated_at = (UserSession.failed_login_ban_for + 2.hours.to_i).seconds.ago
38
+ assert !UserSession.create(ben).new_session?
39
+ end
40
+
41
+ def test_exceeding_failed_logins_limit
42
+ UserSession.consecutive_failed_logins_limit = 2
43
+ ben = users(:ben)
44
+
45
+ 2.times do |i|
46
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
47
+ assert !session.save
48
+ assert session.errors[:password].size > 0
49
+ assert_equal i + 1, ben.reload.failed_login_count
50
+ end
51
+
52
+ session = UserSession.new(:login => ben.login, :password => "badpassword2")
53
+ assert !session.save
54
+ assert session.errors[:password].size == 0
55
+ assert_equal 3, ben.reload.failed_login_count
56
+
57
+ UserSession.consecutive_failed_logins_limit = 50
58
+ end
59
+
60
+ def test_exceeded_ban_for
61
+ UserSession.consecutive_failed_logins_limit = 2
62
+ UserSession.generalize_credentials_error_messages true
63
+ ben = users(:ben)
64
+
65
+ 2.times do |i|
66
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
67
+ assert !session.save
68
+ assert session.invalid_password?
69
+ assert_equal i + 1, ben.reload.failed_login_count
70
+ end
71
+
72
+ ActiveRecord::Base.connection.execute("update users set updated_at = '#{1.day.ago.to_s(:db)}' where login = '#{ben.login}'")
73
+ session = UserSession.new(:login => ben.login, :password => "benrocks")
74
+ assert session.save
75
+ assert_equal 0, ben.reload.failed_login_count
76
+
77
+ UserSession.consecutive_failed_logins_limit = 50
78
+ UserSession.generalize_credentials_error_messages false
79
+ end
80
+
81
+ def test_exceeded_ban_and_failed_doesnt_ban_again
82
+ UserSession.consecutive_failed_logins_limit = 2
83
+ ben = users(:ben)
84
+
85
+ 2.times do |i|
86
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
87
+ assert !session.save
88
+ assert session.errors[:password].size > 0
89
+ assert_equal i + 1, ben.reload.failed_login_count
90
+ end
91
+
92
+ ActiveRecord::Base.connection.execute("update users set updated_at = '#{1.day.ago.to_s(:db)}' where login = '#{ben.login}'")
93
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
94
+ assert !session.save
95
+ assert_equal 1, ben.reload.failed_login_count
96
+
97
+ UserSession.consecutive_failed_logins_limit = 50
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SessionTest
4
+ class CallbacksTest < ActiveSupport::TestCase
5
+ end
6
+ end
@@ -0,0 +1,112 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SessionTest
4
+ module CookiesTest
5
+ class ConfiTest < ActiveSupport::TestCase
6
+ def test_cookie_key
7
+ UserSession.cookie_key = "my_cookie_key"
8
+ assert_equal "my_cookie_key", UserSession.cookie_key
9
+
10
+ UserSession.cookie_key "user_credentials"
11
+ assert_equal "user_credentials", UserSession.cookie_key
12
+ end
13
+
14
+ def test_default_cookie_key
15
+ assert_equal "user_credentials", UserSession.cookie_key
16
+ assert_equal "back_office_user_credentials", BackOfficeUserSession.cookie_key
17
+ end
18
+
19
+ def test_remember_me
20
+ UserSession.remember_me = true
21
+ assert_equal true, UserSession.remember_me
22
+ session = UserSession.new
23
+ assert_equal true, session.remember_me
24
+
25
+ UserSession.remember_me false
26
+ assert_equal false, UserSession.remember_me
27
+ session = UserSession.new
28
+ assert_equal false, session.remember_me
29
+ end
30
+
31
+ def test_remember_me_for
32
+ UserSession.remember_me_for = 3.years
33
+ assert_equal 3.years, UserSession.remember_me_for
34
+ session = UserSession.new
35
+ session.remember_me = true
36
+ assert_equal 3.years, session.remember_me_for
37
+
38
+ UserSession.remember_me_for 3.months
39
+ assert_equal 3.months, UserSession.remember_me_for
40
+ session = UserSession.new
41
+ session.remember_me = true
42
+ assert_equal 3.months, session.remember_me_for
43
+ end
44
+ end
45
+
46
+ class InstanceMethodsTest < ActiveSupport::TestCase
47
+ def test_credentials
48
+ session = UserSession.new
49
+ session.credentials = {:remember_me => true}
50
+ assert_equal true, session.remember_me
51
+ end
52
+
53
+ def test_remember_me
54
+ session = UserSession.new
55
+ assert_equal false, session.remember_me
56
+ assert !session.remember_me?
57
+
58
+ session.remember_me = false
59
+ assert_equal false, session.remember_me
60
+ assert !session.remember_me?
61
+
62
+ session.remember_me = true
63
+ assert_equal true, session.remember_me
64
+ assert session.remember_me?
65
+
66
+ session.remember_me = nil
67
+ assert_nil session.remember_me
68
+ assert !session.remember_me?
69
+
70
+ session.remember_me = "1"
71
+ assert_equal "1", session.remember_me
72
+ assert session.remember_me?
73
+
74
+ session.remember_me = "true"
75
+ assert_equal "true", session.remember_me
76
+ assert session.remember_me?
77
+ end
78
+
79
+ def test_remember_me_until
80
+ session = UserSession.new
81
+ assert_nil session.remember_me_until
82
+
83
+ session.remember_me = true
84
+ assert 3.months.from_now <= session.remember_me_until
85
+ end
86
+
87
+ def test_persist_persist_by_cookie
88
+ ben = users(:ben)
89
+ assert !UserSession.find
90
+ set_cookie_for(ben)
91
+ assert session = UserSession.find
92
+ assert_equal ben, session.record
93
+ end
94
+
95
+ def test_after_save_save_cookie
96
+ ben = users(:ben)
97
+ session = UserSession.new(ben)
98
+ assert session.save
99
+ assert_equal "#{ben.persistence_token}::#{ben.id}", controller.cookies["user_credentials"]
100
+ end
101
+
102
+ def test_after_destroy_destroy_cookie
103
+ ben = users(:ben)
104
+ set_cookie_for(ben)
105
+ session = UserSession.find
106
+ assert controller.cookies["user_credentials"]
107
+ assert session.destroy
108
+ assert !controller.cookies["user_credentials"]
109
+ end
110
+ end
111
+ end
112
+ end