janus 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +3 -0
  4. data/.gitignore +4 -0
  5. data/.travis.yml +18 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +4 -5
  8. data/Rakefile +22 -0
  9. data/VERSION +1 -0
  10. data/certs/ysbaddaden.pem +21 -0
  11. data/janus.gemspec +28 -0
  12. data/lib/generators/janus/resource_generator.rb +17 -1
  13. data/lib/generators/templates/janus.rb +9 -5
  14. data/lib/generators/templates/mailer.rb +3 -0
  15. data/lib/generators/templates/mailer/confirmation_instructions.html.erb +7 -0
  16. data/lib/generators/templates/mailer/confirmation_instructions.text.erb +7 -0
  17. data/lib/generators/templates/mailer/reset_password_instructions.html.erb +9 -0
  18. data/lib/generators/templates/mailer/reset_password_instructions.text.erb +7 -0
  19. data/lib/janus.rb +3 -0
  20. data/lib/janus/config.rb +9 -3
  21. data/lib/janus/controllers/confirmations_controller.rb +1 -1
  22. data/lib/janus/controllers/internal_helpers.rb +8 -1
  23. data/lib/janus/controllers/passwords_controller.rb +1 -1
  24. data/lib/janus/controllers/registrations_controller.rb +1 -1
  25. data/lib/janus/controllers/sessions_controller.rb +6 -5
  26. data/lib/janus/models/confirmable.rb +2 -0
  27. data/lib/janus/models/database_authenticatable.rb +4 -2
  28. data/lib/janus/models/rememberable.rb +2 -0
  29. data/lib/janus/models/remote_authenticatable.rb +2 -0
  30. data/lib/janus/models/remote_token.rb +6 -5
  31. data/lib/janus/models/token_authenticatable.rb +79 -0
  32. data/lib/janus/models/trackable.rb +2 -0
  33. data/lib/janus/strategies.rb +1 -1
  34. data/lib/janus/strategies/token_authenticatable.rb +22 -0
  35. data/lib/janus/version.rb +10 -0
  36. data/test/fixtures/admins.yml +5 -0
  37. data/test/fixtures/users.yml +10 -0
  38. data/test/functional/admins/sessions_controller_test.rb +13 -0
  39. data/test/functional/home_controller_test.rb +8 -0
  40. data/test/functional/janus/mailer_test.rb +14 -0
  41. data/test/functional/janus/manager_test.rb +94 -0
  42. data/test/functional/users/confirmations_controller_test.rb +68 -0
  43. data/test/functional/users/passwords_controller_test.rb +131 -0
  44. data/test/functional/users/registrations_controller_test.rb +112 -0
  45. data/test/functional/users/sessions_controller_test.rb +100 -0
  46. data/test/functional/users_controller_test.rb +29 -0
  47. data/test/generators/install_generator_test.rb +16 -0
  48. data/test/generators/resource_generator_test.rb +80 -0
  49. data/test/integration/users/rememberable_test.rb +32 -0
  50. data/test/integration/users/remote_test.rb +72 -0
  51. data/test/integration/users/sessions_test.rb +18 -0
  52. data/test/integration/users/token_authenticatable_test.rb +42 -0
  53. data/test/integration/users/trackable_test.rb +22 -0
  54. data/test/rails_app/.gitignore +4 -0
  55. data/test/rails_app/Rakefile +7 -0
  56. data/test/rails_app/app/controllers/admins/sessions_controller.rb +11 -0
  57. data/test/rails_app/app/controllers/application_controller.rb +9 -0
  58. data/test/rails_app/app/controllers/blogs_controller.rb +6 -0
  59. data/test/rails_app/app/controllers/home_controller.rb +4 -0
  60. data/test/rails_app/app/controllers/users/confirmations_controller.rb +3 -0
  61. data/test/rails_app/app/controllers/users/passwords_controller.rb +3 -0
  62. data/test/rails_app/app/controllers/users/registrations_controller.rb +17 -0
  63. data/test/rails_app/app/controllers/users/sessions_controller.rb +11 -0
  64. data/test/rails_app/app/controllers/users_controller.rb +9 -0
  65. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  66. data/test/rails_app/app/mailers/user_mailer.rb +3 -0
  67. data/test/rails_app/app/models/admin.rb +3 -0
  68. data/test/rails_app/app/models/remote_token.rb +6 -0
  69. data/test/rails_app/app/models/user.rb +8 -0
  70. data/test/rails_app/app/views/admins/sessions/new.html.erb +30 -0
  71. data/test/rails_app/app/views/blogs/show.html.erb +2 -0
  72. data/test/rails_app/app/views/home/index.html.erb +2 -0
  73. data/test/rails_app/app/views/layouts/application.html.erb +28 -0
  74. data/test/rails_app/app/views/user_mailer/confirmation_instructions.html.erb +7 -0
  75. data/test/rails_app/app/views/user_mailer/confirmation_instructions.text.erb +7 -0
  76. data/test/rails_app/app/views/user_mailer/reset_password_instructions.html.erb +9 -0
  77. data/test/rails_app/app/views/user_mailer/reset_password_instructions.text.erb +7 -0
  78. data/test/rails_app/app/views/users/confirmations/new.html.erb +16 -0
  79. data/test/rails_app/app/views/users/passwords/edit.html.erb +21 -0
  80. data/test/rails_app/app/views/users/passwords/new.html.erb +16 -0
  81. data/test/rails_app/app/views/users/registrations/edit.html.erb +31 -0
  82. data/test/rails_app/app/views/users/registrations/new.html.erb +26 -0
  83. data/test/rails_app/app/views/users/sessions/new.html.erb +30 -0
  84. data/test/rails_app/app/views/users/show.html.erb +2 -0
  85. data/test/rails_app/config.ru +4 -0
  86. data/test/rails_app/config/application.rb +43 -0
  87. data/test/rails_app/config/boot.rb +6 -0
  88. data/test/rails_app/config/database.yml +22 -0
  89. data/test/rails_app/config/environment.rb +5 -0
  90. data/test/rails_app/config/environments/development.rb +23 -0
  91. data/test/rails_app/config/environments/production.rb +50 -0
  92. data/test/rails_app/config/environments/test.rb +34 -0
  93. data/test/rails_app/config/initializers/janus.rb +25 -0
  94. data/test/rails_app/config/initializers/secret_token.rb +8 -0
  95. data/test/rails_app/config/initializers/session_store.rb +8 -0
  96. data/test/rails_app/config/locales/janus.en.yml +65 -0
  97. data/test/rails_app/config/routes.rb +13 -0
  98. data/test/rails_app/db/migrate/20110323153820_create_users.rb +40 -0
  99. data/test/rails_app/db/migrate/20110331153546_create_remote_tokens.rb +15 -0
  100. data/test/rails_app/db/migrate/20130412104138_create_admins.rb +10 -0
  101. data/test/rails_app/db/schema.rb +58 -0
  102. data/test/rails_app/db/seeds.rb +7 -0
  103. data/test/rails_app/lib/tasks/.gitkeep +0 -0
  104. data/test/rails_app/public/404.html +26 -0
  105. data/test/rails_app/public/422.html +26 -0
  106. data/test/rails_app/public/500.html +26 -0
  107. data/test/rails_app/script/rails +6 -0
  108. data/test/test_helper.rb +121 -0
  109. data/test/unit/confirmable_test.rb +36 -0
  110. data/test/unit/janus_test.rb +27 -0
  111. data/test/unit/rememberable_test.rb +47 -0
  112. data/test/unit/remote_authenticatable_test.rb +37 -0
  113. data/test/unit/remote_token_test.rb +9 -0
  114. data/test/unit/reset_password_test.rb +45 -0
  115. data/test/unit/token_authenticatable_test.rb +41 -0
  116. data/test/unit/trackable_test.rb +21 -0
  117. data/test/unit/user_test.rb +68 -0
  118. metadata +303 -21
  119. metadata.gz.sig +0 -0
@@ -0,0 +1,7 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
4
+ # Examples:
5
+ #
6
+ # cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
7
+ # Mayor.create(:name => 'Daley', :city => cities.first)
File without changes
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ <p>We've been notified about this issue and we'll take a look at it shortly.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,121 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ require File.expand_path('../rails_app/config/environment', __FILE__)
4
+ require 'rails/test_help'
5
+ require 'capybara/rails'
6
+ require 'minitest/mock'
7
+
8
+ ActiveRecord::Migration.verbose = false
9
+ ActiveRecord::Migrator.migrate(Rails.root.join('db', 'migrate').to_s)
10
+
11
+ class ActiveSupport::TestCase
12
+ self.fixture_path = File.expand_path('../fixtures', __FILE__)
13
+ fixtures :all
14
+
15
+ # Executes the given block having first modified Janus' encryptor.
16
+ # Resets the encryptor to its previous state after the block execution.
17
+ def with_encryptor(encryptor)
18
+ default_encryptor = Janus::Config.encryptor
19
+ begin
20
+ Janus::Config.encryptor = encryptor
21
+ yield
22
+ ensure
23
+ Janus::Config.encryptor = default_encryptor
24
+ end
25
+ end
26
+ end
27
+
28
+ class ActionController::TestCase
29
+ include Janus::TestHelper
30
+
31
+ teardown { sign_out }
32
+
33
+ def assert_email(count = 1, message = nil)
34
+ assert_difference('ActionMailer::Base.deliveries.size', count, message) do
35
+ yield
36
+ end
37
+ end
38
+
39
+ def assert_no_email(message = nil)
40
+ assert_no_difference('ActionMailer::Base.deliveries.size', message) do
41
+ yield
42
+ end
43
+ end
44
+ end
45
+
46
+ class ActionDispatch::IntegrationTest
47
+ self.fixture_path = File.expand_path('../fixtures', __FILE__)
48
+
49
+ include Capybara::DSL
50
+
51
+ teardown { page.reset! }
52
+
53
+ def sign_up(user, options = {})
54
+ scope = options[:scope]
55
+ route = "new_#{scope}_registration_url"
56
+
57
+ visit send(route, options[:url])
58
+ fill_in "#{scope}_email", :with => user[:email]
59
+ fill_in "#{scope}_password", :with => user[:password]
60
+ fill_in "#{scope}_password_confirmation", :with => user[:password]
61
+ find('input[name=commit]').click
62
+ end
63
+
64
+ def sign_in(user, options = {})
65
+ scope = options[:scope] || Janus.scope_for(user)
66
+ route = "new_#{scope}_session_url"
67
+
68
+ visit send(route, options[:url])
69
+ fill_in "#{scope}_email", :with => user.email
70
+ fill_in "#{scope}_password", :with => 'secret'
71
+ check "remember_me" if options[:remember_me]
72
+ find('input[name=commit]').click
73
+ end
74
+
75
+ def sign_out(user_or_scope)
76
+ scope = Janus.scope_for(user_or_scope)
77
+ route = "destroy_#{scope}_session_url"
78
+ page.driver.submit :delete, send(route), {}
79
+ end
80
+
81
+ def service_login(scope, options)
82
+ route = "new_#{scope}_session_url"
83
+ visit send(route, options)
84
+ end
85
+
86
+ def close_user_session
87
+ driver = Capybara.current_session.driver
88
+ # case driver
89
+ # when Capybara::Driver::Selenium
90
+ # browser = driver.browser
91
+ # browser.manage.delete_cookie(cookie_name)
92
+ # when Capybara::Driver::RackTest
93
+ cookie_jar = driver.browser.current_session.instance_variable_get(:@rack_mock_session).cookie_jar
94
+ cookie_jar.instance_variable_get(:@cookies).reject! do |cookie|
95
+ expires = cookie.instance_variable_get(:@options)["expires"]
96
+ expires.nil? || Time.parse(expires) < Time.now
97
+ end
98
+ # end
99
+ end
100
+
101
+ def assert_authenticated
102
+ assert has_selector?("a#my_page"), "Expected user to be authenticated."
103
+ end
104
+
105
+ def assert_not_authenticated
106
+ assert has_selector?("a#sign_in"), "Expected user to not be authenticated."
107
+ end
108
+
109
+ def assert_select(selector)
110
+ assert has_selector?(selector), "Expected selector <#{selector}> but found none."
111
+ end
112
+ end
113
+
114
+ class ActionMailer::TestCase
115
+ include Rails.application.routes.url_helpers
116
+
117
+ def default_url_options
118
+ Rails.application.config.action_mailer.default_url_options
119
+ end
120
+ end
121
+
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ class ConfirmableTest < ActiveSupport::TestCase
4
+ setup do
5
+ @user = users(:julien)
6
+ end
7
+
8
+ test "generate_confirmation_token" do
9
+ @user.generate_confirmation_token
10
+ assert_not_nil @user.confirmation_token
11
+ assert_not_nil @user.confirmation_sent_at
12
+ assert_nil @user.confirmed_at
13
+
14
+ @user.reload
15
+ assert_nil @user.confirmation_token
16
+ assert_nil @user.confirmation_sent_at
17
+ assert_nil @user.confirmed_at
18
+ end
19
+
20
+ test "confirm!" do
21
+ @user.generate_confirmation_token
22
+ @user.confirm!
23
+ assert_nil @user.confirmation_token
24
+ assert_nil @user.confirmation_sent_at
25
+ assert_not_nil @user.confirmed_at
26
+ end
27
+
28
+ test "find_for_confirmation" do
29
+ assert_nil User.find_for_confirmation(nil)
30
+ assert_nil User.find_for_confirmation("amroiuzigsqjg")
31
+
32
+ @user.generate_confirmation_token
33
+ @user.save!
34
+ assert_equal @user, User.find_for_confirmation(@user.confirmation_token)
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class JanusTest < ActiveSupport::TestCase
4
+ test "scope_for symbol" do
5
+ assert_equal :user, Janus.scope_for(:user)
6
+ end
7
+
8
+ test "scope_for string" do
9
+ assert_equal :user, Janus.scope_for("user")
10
+ end
11
+
12
+ test "scope_for object" do
13
+ assert_equal :user, Janus.scope_for(User.new)
14
+ end
15
+
16
+ test "config" do
17
+ pepper = Janus.config.pepper
18
+ begin
19
+ Janus.config do |config|
20
+ config.pepper = "0123456789"
21
+ end
22
+ assert_equal "0123456789", Janus.config.pepper
23
+ ensure
24
+ Janus.config.pepper = pepper
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class RememberableTest < ActiveSupport::TestCase
4
+ setup do
5
+ @user = users(:julien)
6
+ end
7
+
8
+ test "remember_token" do
9
+ @user.remember_me!
10
+ assert_not_nil @user.remember_token
11
+ assert_not_nil @user.remember_created_at
12
+
13
+ @user.forget_me!
14
+ assert_nil @user.remember_token
15
+ assert_nil @user.remember_created_at
16
+ end
17
+
18
+ test "should not remember across browsers" do
19
+ @user.remember_me!
20
+ token = @user.remember_token
21
+ @user.remember_me!
22
+ assert_not_equal token, @user.remember_token
23
+ end
24
+
25
+ test "find_for_remember_authentication" do
26
+ assert_nil User.find_for_remember_authentication(nil)
27
+ assert_nil User.find_for_remember_authentication(" ")
28
+
29
+ @user.remember_me!
30
+ token = @user.remember_token
31
+
32
+ assert_equal @user, User.find_for_remember_authentication(token)
33
+ assert_equal @user, User.find_for_remember_authentication(token)
34
+
35
+ @user.remember_me!
36
+ assert_nil User.find_for_remember_authentication(token), "token should no longer be valid"
37
+
38
+ @user.forget_me!
39
+ assert_nil User.find_for_remember_authentication(token), "token should have been erased"
40
+ end
41
+
42
+ test "expiration" do
43
+ @user.remember_me!
44
+ @user.update_attribute(:remember_created_at, 1.year.ago)
45
+ assert_nil User.find_for_remember_authentication(@user.remember_token)
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class RemoteAuthenticatableTest < ActiveSupport::TestCase
4
+ setup do
5
+ @user = users(:julien)
6
+ end
7
+
8
+ test "session token" do
9
+ @user.generate_session_token!
10
+ assert_not_nil @user.session_token
11
+
12
+ @user.destroy_session_token!
13
+ assert_nil @user.session_token
14
+ end
15
+
16
+ test "find_for_remote_authentication" do
17
+ assert_nil User.find_for_remote_authentication(nil)
18
+ assert_nil User.find_for_remote_authentication(" ")
19
+
20
+ token1 = token2 = nil
21
+
22
+ assert_difference('RemoteToken.count', 2) do
23
+ token1 = @user.generate_remote_token!
24
+ token2 = @user.generate_remote_token!
25
+ end
26
+
27
+ assert_difference('RemoteToken.count', -1) do
28
+ assert_equal @user, User.find_for_remote_authentication(token1)
29
+ assert_nil User.find_for_remote_authentication(token1)
30
+ end
31
+
32
+ assert_difference('RemoteToken.count', -1) do
33
+ assert_equal @user, User.find_for_remote_authentication(token2)
34
+ assert_nil User.find_for_remote_authentication(token2)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class RemoteTokenTest < ActiveSupport::TestCase
4
+ test "should create" do
5
+ remote_token = RemoteToken.create(:user => users(:julien))
6
+ assert remote_token.persisted?, remote_token.errors.to_xml
7
+ assert_not_nil remote_token.token
8
+ end
9
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class ResetPasswordTest < ActiveSupport::TestCase
4
+ setup do
5
+ @user = users(:julien)
6
+ end
7
+
8
+ test "generate reset password token" do
9
+ assert @user.generate_reset_password_token!
10
+ assert @user.persisted?
11
+ assert_not_nil @user.reset_password_token
12
+ assert_not_nil @user.reset_password_sent_at
13
+ end
14
+
15
+ test "reset password" do
16
+ assert @user.generate_reset_password_token!
17
+ assert @user.reset_password!('password' => "azerty", 'password_confirmation' => "azerty")
18
+ assert @user.persisted?
19
+ assert_nil @user.reset_password_token
20
+ assert_nil @user.reset_password_sent_at
21
+ assert @user.valid_password?("azerty")
22
+ end
23
+
24
+ test "should find user with token" do
25
+ @user.generate_reset_password_token!
26
+ user = User.find_for_password_reset(@user.reset_password_token)
27
+ assert_equal @user, user
28
+ assert_not_nil user.reset_password_token
29
+ assert_not_nil user.reset_password_sent_at
30
+ end
31
+
32
+ test "should not find user with bad tokens" do
33
+ assert_nil User.find_for_password_reset(nil)
34
+ assert_nil User.find_for_password_reset("ariualfknsmgojqm")
35
+ end
36
+
37
+ test "token expiration" do
38
+ @user.generate_reset_password_token!
39
+ @user.update_attribute(:reset_password_sent_at, 1.week.ago)
40
+ assert_nil User.find_for_password_reset(@user.reset_password_token)
41
+ @user.reload
42
+ assert_nil @user.reset_password_token
43
+ assert_nil @user.reset_password_sent_at
44
+ end
45
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ class TokenAuthenticatableTest < ActiveSupport::TestCase
4
+ setup { @user = users(:julien) }
5
+
6
+ test "reset_authentication_token" do
7
+ @user.reset_authentication_token
8
+ assert @user.authentication_token_changed?
9
+ end
10
+
11
+ test "reset_authentication_token!" do
12
+ token = @user.authentication_token
13
+ @user.reset_authentication_token!
14
+ refute @user.authentication_token_changed?
15
+ refute_equal token, @user.authentication_token
16
+ end
17
+
18
+ test "find_for_token_authentication" do
19
+ @user.reset_authentication_token!
20
+ user = User.find_for_token_authentication(@user.authentication_token)
21
+ assert_equal @user, user
22
+ refute_nil @user.reload.authentication_token
23
+ end
24
+
25
+ test "find_for_token_authentication with expired token" do
26
+ @user.reset_authentication_token!
27
+ @user.update_attribute :authentication_token_created_at, 1.month.ago
28
+
29
+ assert_nil User.find_for_token_authentication(@user.authentication_token)
30
+ assert_nil @user.reload.authentication_token
31
+ end
32
+
33
+ test "find_for_token_authentication must destroy non reusable token" do
34
+ @user.reset_authentication_token!
35
+
36
+ User.stub(:reusable_authentication_token, false) do
37
+ assert_equal @user, User.find_for_token_authentication(@user.authentication_token)
38
+ assert_nil @user.reload.authentication_token
39
+ end
40
+ end
41
+ end