janus 0.5.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 (79) hide show
  1. data/README.rdoc +144 -0
  2. data/lib/janus/config.rb +26 -0
  3. data/lib/janus/controllers/confirmations_controller.rb +56 -0
  4. data/lib/janus/controllers/helpers.rb +54 -0
  5. data/lib/janus/controllers/internal_helpers.rb +33 -0
  6. data/lib/janus/controllers/passwords_controller.rb +60 -0
  7. data/lib/janus/controllers/registrations_controller.rb +55 -0
  8. data/lib/janus/controllers/sessions_controller.rb +94 -0
  9. data/lib/janus/controllers/url_helpers.rb +61 -0
  10. data/lib/janus/helper.rb +11 -0
  11. data/lib/janus/hooks/rememberable.rb +20 -0
  12. data/lib/janus/hooks/remote_authenticatable.rb +27 -0
  13. data/lib/janus/hooks/trackable.rb +3 -0
  14. data/lib/janus/hooks.rb +58 -0
  15. data/lib/janus/mailer.rb +13 -0
  16. data/lib/janus/manager.rb +97 -0
  17. data/lib/janus/models/base.rb +31 -0
  18. data/lib/janus/models/confirmable.rb +45 -0
  19. data/lib/janus/models/database_authenticatable.rb +98 -0
  20. data/lib/janus/models/rememberable.rb +54 -0
  21. data/lib/janus/models/remote_authenticatable.rb +99 -0
  22. data/lib/janus/models/remote_token.rb +17 -0
  23. data/lib/janus/models/trackable.rb +37 -0
  24. data/lib/janus/routes.rb +78 -0
  25. data/lib/janus/strategies/base.rb +40 -0
  26. data/lib/janus/strategies/database_authenticatable.rb +20 -0
  27. data/lib/janus/strategies/rememberable.rb +52 -0
  28. data/lib/janus/strategies/remote_authenticatable.rb +28 -0
  29. data/lib/janus/strategies.rb +33 -0
  30. data/lib/janus/test_helper.rb +25 -0
  31. data/lib/janus.rb +60 -0
  32. data/test/functional/home_controller_test.rb +8 -0
  33. data/test/functional/janus/mailer_test.rb +14 -0
  34. data/test/functional/janus/manager_test.rb +94 -0
  35. data/test/functional/users/confirmations_controller_test.rb +59 -0
  36. data/test/functional/users/passwords_controller_test.rb +101 -0
  37. data/test/functional/users/registrations_controller_test.rb +112 -0
  38. data/test/functional/users/sessions_controller_test.rb +100 -0
  39. data/test/functional/users_controller_test.rb +22 -0
  40. data/test/integration/users/rememberable_test.rb +32 -0
  41. data/test/integration/users/remote_test.rb +72 -0
  42. data/test/integration/users/sessions_test.rb +18 -0
  43. data/test/integration/users/trackable_test.rb +22 -0
  44. data/test/rails_app/app/controllers/application_controller.rb +9 -0
  45. data/test/rails_app/app/controllers/blogs_controller.rb +6 -0
  46. data/test/rails_app/app/controllers/home_controller.rb +4 -0
  47. data/test/rails_app/app/controllers/users/confirmations_controller.rb +3 -0
  48. data/test/rails_app/app/controllers/users/passwords_controller.rb +3 -0
  49. data/test/rails_app/app/controllers/users/registrations_controller.rb +7 -0
  50. data/test/rails_app/app/controllers/users/sessions_controller.rb +11 -0
  51. data/test/rails_app/app/controllers/users_controller.rb +9 -0
  52. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  53. data/test/rails_app/app/mailers/janus_mailer.rb +2 -0
  54. data/test/rails_app/app/models/remote_token.rb +6 -0
  55. data/test/rails_app/app/models/user.rb +8 -0
  56. data/test/rails_app/config/application.rb +42 -0
  57. data/test/rails_app/config/boot.rb +6 -0
  58. data/test/rails_app/config/environment.rb +5 -0
  59. data/test/rails_app/config/environments/development.rb +26 -0
  60. data/test/rails_app/config/environments/production.rb +49 -0
  61. data/test/rails_app/config/environments/test.rb +36 -0
  62. data/test/rails_app/config/initializers/janus.rb +11 -0
  63. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  64. data/test/rails_app/config/initializers/session_store.rb +8 -0
  65. data/test/rails_app/config/routes.rb +12 -0
  66. data/test/rails_app/db/migrate/20110323153820_create_users.rb +34 -0
  67. data/test/rails_app/db/migrate/20110331153546_create_remote_tokens.rb +15 -0
  68. data/test/rails_app/db/schema.rb +45 -0
  69. data/test/rails_app/db/seeds.rb +7 -0
  70. data/test/test_helper.rb +103 -0
  71. data/test/unit/confirmable_test.rb +36 -0
  72. data/test/unit/janus_test.rb +27 -0
  73. data/test/unit/rememberable_test.rb +50 -0
  74. data/test/unit/remote_authenticatable_test.rb +37 -0
  75. data/test/unit/remote_token_test.rb +9 -0
  76. data/test/unit/reset_password_test.rb +45 -0
  77. data/test/unit/trackable_test.rb +21 -0
  78. data/test/unit/user_test.rb +60 -0
  79. metadata +232 -0
@@ -0,0 +1,52 @@
1
+ require 'janus/hooks/rememberable'
2
+
3
+ module Janus
4
+ module Strategies
5
+ class Rememberable < Base
6
+ def valid?
7
+ rememberable? && !remember_cookie.nil?
8
+ end
9
+
10
+ def authenticate!
11
+ user = resource.find_for_remember_authentication(remember_cookie)
12
+
13
+ if user.nil?
14
+ destroy_remember_cookie
15
+ pass
16
+ else
17
+ success!(user)
18
+ extend_remember_period if resource.extend_remember_period
19
+ end
20
+ end
21
+
22
+ def self.remember_cookie_name(scope)
23
+ "remember_#{scope}_token"
24
+ end
25
+
26
+ private
27
+ def destroy_remember_cookie
28
+ request.cookies.delete(remember_cookie_name)
29
+ end
30
+
31
+ def extend_remember_period
32
+ cookies[remember_cookie_name] = {
33
+ :value => @user.remember_token,
34
+ :expires => resource.remember_for.from_now
35
+ }
36
+ user.update_attribute(:remember_created_at, Time.now)
37
+ end
38
+
39
+ def remember_cookie_name
40
+ self.class.remember_cookie_name(scope)
41
+ end
42
+
43
+ def remember_cookie
44
+ request.cookies[remember_cookie_name]
45
+ end
46
+
47
+ def rememberable?
48
+ resource.include?(Janus::Models::Rememberable)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,28 @@
1
+ # IMPROVE: redirect to clean the URL from the auth_token.
2
+ module Janus
3
+ module Strategies
4
+ class RemoteAuthenticatable < Base
5
+ def valid?
6
+ resource.include?(Janus::Models::RemoteAuthenticatable) && !remote_token.nil?
7
+ end
8
+
9
+ def authenticate!
10
+ user = resource.find_for_remote_authentication(remote_token)
11
+
12
+ if user
13
+ success!(user)
14
+ else
15
+ pass
16
+ end
17
+ end
18
+
19
+ def remote_token
20
+ request.params[resource.remote_authentication_key]
21
+ end
22
+
23
+ def auth_method
24
+ :set_user
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ module Janus
2
+ module Strategies
3
+ extend ActiveSupport::Concern
4
+
5
+ # Runs authentication strategies to log a user in.
6
+ def run_strategies(scope)
7
+ Janus::Manager.strategies.each { |name| break if run_strategy(name, scope) }
8
+ end
9
+
10
+ # Runs a given strategy and returns true if it succeeded.
11
+ def run_strategy(name, scope)
12
+ strategy = "Janus::Strategies::#{name.to_s.camelize}".constantize.new(scope, self)
13
+
14
+ if strategy.valid?
15
+ strategy.authenticate!
16
+
17
+ if strategy.success?
18
+ send(strategy.auth_method, strategy.user, :scope => scope)
19
+ Janus::Manager.run_callbacks(:authenticate, strategy.user, self, :scope => scope)
20
+ end
21
+ end
22
+
23
+ strategy.success?
24
+ end
25
+
26
+ module ClassMethods
27
+ # Returns the list of strategies as underscore symbols.
28
+ def strategies
29
+ @strategies ||= [:rememberable, :remote_authenticatable]
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ module Janus
2
+ module TestHelper
3
+ def self.included(klass)
4
+ klass.class_eval do
5
+ setup { @janus = Janus::Manager.new(request, cookies) }
6
+ end
7
+ end
8
+
9
+ def sign_in(user, options = {})
10
+ @janus.login(user, options)
11
+ end
12
+
13
+ def sign_out(user_or_scope)
14
+ @janus.logout(Janus.scope_for(user_or_scope))
15
+ end
16
+
17
+ def assert_authenticated(scope)
18
+ assert @janus.authenticated?(scope), "Expected #{scope} to be authenticated."
19
+ end
20
+
21
+ def assert_not_authenticated(scope)
22
+ assert !@janus.authenticated?(scope), "Expected #{scope} to not be authenticated."
23
+ end
24
+ end
25
+ end
data/lib/janus.rb ADDED
@@ -0,0 +1,60 @@
1
+ require 'janus/config'
2
+ require 'janus/hooks'
3
+ require 'janus/strategies'
4
+ require 'janus/manager'
5
+ require 'janus/routes'
6
+
7
+ autoload :JanusHelper, 'janus/helper'
8
+
9
+ module Janus
10
+ class NotAuthenticated < StandardError
11
+ cattr_accessor :scope
12
+
13
+ def initialize(scope)
14
+ super("")
15
+ self.scope = scope
16
+ end
17
+ end
18
+
19
+ autoload :Mailer, 'janus/mailer'
20
+ autoload :TestHelper, 'janus/test_helper'
21
+
22
+ autoload :Helpers, 'janus/controllers/helpers'
23
+ autoload :UrlHelpers, 'janus/controllers/url_helpers'
24
+ autoload :InternalHelpers, 'janus/controllers/internal_helpers'
25
+
26
+ autoload :SessionsController, 'janus/controllers/sessions_controller'
27
+ autoload :RegistrationsController, 'janus/controllers/registrations_controller'
28
+ autoload :ConfirmationsController, 'janus/controllers/confirmations_controller'
29
+ autoload :PasswordsController, 'janus/controllers/passwords_controller'
30
+
31
+ module Models
32
+ autoload :Base, 'janus/models/base'
33
+ autoload :DatabaseAuthenticatable, 'janus/models/database_authenticatable'
34
+ autoload :Confirmable, 'janus/models/confirmable'
35
+ autoload :Rememberable, 'janus/models/rememberable'
36
+ autoload :RemoteAuthenticatable, 'janus/models/remote_authenticatable'
37
+ autoload :RemoteToken, 'janus/models/remote_token'
38
+ autoload :Trackable, 'janus/models/trackable'
39
+ end
40
+
41
+ module Strategies
42
+ autoload :Base, 'janus/strategies/base'
43
+ autoload :Rememberable, 'janus/strategies/rememberable'
44
+ autoload :RemoteAuthenticatable, 'janus/strategies/remote_authenticatable'
45
+ end
46
+
47
+ def self.scope_for(user_or_scope)
48
+ case user_or_scope
49
+ when Symbol then user_or_scope
50
+ when String then user_or_scope.to_sym
51
+ else user_or_scope.class.name.underscore.to_sym
52
+ end
53
+ end
54
+
55
+ def self.config
56
+ yield(Janus::Config) if block_given?
57
+ Janus::Config
58
+ end
59
+ end
60
+
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class HomeControllerTest < ActionController::TestCase
4
+ test "should get index" do
5
+ get :index
6
+ assert_response :ok
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class Janus::MailerTest < ActionMailer::TestCase
4
+ test "reset_password_instructions" do
5
+ users(:julien).generate_reset_password_token!
6
+
7
+ mail = JanusMailer.reset_password_instructions(users(:julien)).deliver
8
+ assert_equal [users(:julien).email], mail.to
9
+ assert !mail.subject.blank?
10
+
11
+ url = edit_user_password_url(:token => users(:julien).reset_password_token)
12
+ assert_match Regexp.new(Regexp.escape(url)), mail.encoded
13
+ end
14
+ end
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+
3
+ class Janus::ManagerTest < ActionController::TestCase
4
+ test "should log user in and out" do
5
+ @janus.login(users(:julien))
6
+ assert @janus.authenticated?(:user), "Expected user to be authenticated."
7
+ assert_equal users(:julien), @janus.user(:user)
8
+
9
+ @janus.logout(:user)
10
+ assert !@janus.authenticated?(:user), "Expected user to not be authenticated."
11
+ assert_nil @janus.user(:user)
12
+ end
13
+
14
+ test "should log user in and out with custom scope" do
15
+ @janus.login(users(:julien), :scope => :custom)
16
+ assert @janus.authenticated?(:custom), "Expected user to be authenticated."
17
+ assert_equal users(:julien), @janus.user(:custom)
18
+
19
+ @janus.logout(:custom)
20
+ assert !@janus.authenticated?(:custom), "Expected user to not be authenticated."
21
+ assert_nil @janus.user(:custom)
22
+ end
23
+
24
+ test "should log users in different scopes" do
25
+ @janus.login(users(:julien), :scope => :user)
26
+ @janus.login(users(:martha), :scope => :admin)
27
+ assert @janus.authenticated?(:user), "Expected user to be authenticated."
28
+ assert @janus.authenticated?(:admin), "Expected admin to be authenticated."
29
+ assert_equal users(:julien), @janus.user(:user)
30
+ assert_equal users(:martha), @janus.user(:admin)
31
+
32
+ @janus.logout(:admin)
33
+ assert @janus.authenticated?(:user), "Expected user to still be authenticated."
34
+ assert !@janus.authenticated?(:admin), "Expected admin to no longer be authenticated."
35
+ assert_equal users(:julien), @janus.user(:user)
36
+ assert_nil @janus.user(:admin)
37
+ end
38
+
39
+ test "should logout all scopes at once" do
40
+ @janus.login(users(:julien), :scope => :user)
41
+ @janus.login(users(:martha), :scope => :admin)
42
+ assert @janus.authenticated?(:user), "Expected user to be authenticated."
43
+ assert @janus.authenticated?(:admin), "Expected admin to be authenticated."
44
+
45
+ @janus.logout
46
+ assert !@janus.authenticated?(:user), "Expected user to no longer be authenticated."
47
+ assert !@janus.authenticated?(:admin), "Expected admin to no longer be authenticated."
48
+ end
49
+
50
+ test "should reset session after logout from last scope" do
51
+ @janus.login(users(:julien), :scope => :user)
52
+ @janus.login(users(:martha), :scope => :admin)
53
+
54
+ @janus.logout(:admin)
55
+ assert_not_nil session['janus']
56
+
57
+ @janus.logout(:user)
58
+ assert_nil session['janus']
59
+ end
60
+
61
+ test "should set and unset the user manually" do
62
+ @janus.set_user(users(:martha))
63
+ assert @janus.authenticated?(:user), "Expected user to be authenticated."
64
+ assert_equal users(:martha), @janus.user(:user)
65
+
66
+ @janus.unset_user(:user)
67
+ assert !@janus.authenticated?(:user), "Expected user to not be authenticated."
68
+ assert_nil @janus.user(:user)
69
+ end
70
+
71
+ test "should set and unset the user manually in different scopes" do
72
+ @janus.set_user(users(:martha), :scope => :user)
73
+ @janus.set_user(users(:julien), :scope => :admin)
74
+ assert @janus.authenticated?(:user), "Expected user to be authenticated."
75
+ assert @janus.authenticated?(:admin), "Expected admin to be authenticated."
76
+ assert_equal users(:martha), @janus.user(:user)
77
+ assert_equal users(:julien), @janus.user(:admin)
78
+
79
+ @janus.unset_user(:user)
80
+ assert !@janus.authenticated?(:user), "Expected user to no longer be authenticated."
81
+ assert @janus.authenticated?(:admin), "Expected admin to still be authenticated."
82
+ assert_nil @janus.user(:user)
83
+ assert_equal users(:julien), @janus.user(:admin)
84
+
85
+ @janus.unset_user(:martha)
86
+ end
87
+
88
+ test "authenticate!" do
89
+ assert_raise(Janus::NotAuthenticated) { @janus.authenticate!(:user) }
90
+
91
+ @janus.set_user(users(:julien))
92
+ assert_nothing_raised { @janus.authenticate!(:user) }
93
+ end
94
+ end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ class Users::ConfirmationsControllerTest < ActionController::TestCase
4
+ test "should get show with token" do
5
+ users(:julien).generate_confirmation_token
6
+ users(:julien).save!
7
+
8
+ assert_difference('User.count(:confirmed_at)') do
9
+ get :show, :confirm_token => users(:julien).confirmation_token
10
+ assert_redirected_to root_url
11
+ assert flash[:notice]
12
+ end
13
+ end
14
+
15
+ test "should not get show without token" do
16
+ assert_no_difference('User.count(:confirmed_at)') do
17
+ get :show
18
+ assert_response :ok
19
+ assert_template 'new'
20
+ assert_select '#error_explanation'
21
+ end
22
+ end
23
+
24
+ test "should not get show with bad token" do
25
+ users(:julien).generate_reset_password_token!
26
+
27
+ assert_no_difference('User.count(:confirmed_at)') do
28
+ get :show, :token => "aiorujfqptezjsmdguspfofkn"
29
+ assert_response :ok
30
+ assert_template 'new'
31
+ assert_select '#error_explanation'
32
+ end
33
+ end
34
+
35
+ test "should get new" do
36
+ get :new
37
+ assert_response :ok
38
+ assert_select '#user_email', 1
39
+ end
40
+
41
+ test "should create" do
42
+ assert_email do
43
+ post :create, :user => { :email => users(:julien).email }
44
+ end
45
+
46
+ assert_redirected_to root_url
47
+ assert flash[:notice]
48
+ end
49
+
50
+ test "should not create" do
51
+ assert_no_email do
52
+ post :create, :user => { :email => 'nobody@example.com' }
53
+ end
54
+
55
+ assert_response :ok
56
+ assert_template 'new'
57
+ assert_select '#error_explanation'
58
+ end
59
+ end
@@ -0,0 +1,101 @@
1
+ require 'test_helper'
2
+
3
+ class Users::PasswordsControllerTest < ActionController::TestCase
4
+ setup do
5
+ @attributes = {
6
+ :password => "azerty",
7
+ :password_confirmation => "azerty"
8
+ }
9
+ end
10
+
11
+ test "should get new" do
12
+ get :new
13
+ assert_response :ok
14
+ assert_select '#user_email', 1
15
+ end
16
+
17
+ test "should get edit with token" do
18
+ users(:julien).generate_reset_password_token!
19
+
20
+ get :edit, :token => users(:julien).reset_password_token
21
+ assert_response :ok
22
+ assert_select '#user_reset_password_token', 1
23
+ assert_select '#user_password', 1
24
+ assert_select '#user_password_confirmation', 1
25
+ end
26
+
27
+ test "should not get edit without token" do
28
+ get :edit
29
+ assert_redirected_to root_url
30
+ assert flash[:alert]
31
+ end
32
+
33
+ test "should not get edit with bad token" do
34
+ users(:julien).generate_reset_password_token!
35
+
36
+ get :edit, :token => "aiorujfqptezjsmdguspfofkn"
37
+ assert_redirected_to root_url
38
+ assert flash[:alert]
39
+ end
40
+
41
+ test "should create" do
42
+ assert_email do
43
+ post :create, :user => { :email => users(:julien).email }
44
+ end
45
+ assert_redirected_to root_url
46
+ assert flash[:notice]
47
+ end
48
+
49
+ test "should not create" do
50
+ assert_no_email do
51
+ post :create, :user => { :email => 'nobody@example.com' }
52
+ end
53
+ assert_response :ok
54
+ assert_template 'new'
55
+ assert_select '#error_explanation'
56
+ end
57
+
58
+ test "should update" do
59
+ users(:julien).generate_reset_password_token!
60
+
61
+ put :update, :user => @attributes.merge(:reset_password_token => users(:julien).reset_password_token)
62
+ assert_redirected_to root_url
63
+ assert flash[:notice]
64
+
65
+ users(:julien).reload
66
+
67
+ assert_nil users(:julien).reset_password_token
68
+ assert_nil users(:julien).reset_password_sent_at
69
+ assert users(:julien).valid_password?(@attributes[:password])
70
+ end
71
+
72
+ test "should not update" do
73
+ users(:julien).generate_reset_password_token!
74
+
75
+ put :update, :user => @attributes.merge(
76
+ :reset_password_token => users(:julien).reset_password_token,
77
+ :password_confirmation => "qwerty"
78
+ )
79
+ assert_response :ok
80
+ assert_template 'users/passwords/edit'
81
+ assert_select '#error_explanation'
82
+
83
+ users(:julien).reload
84
+
85
+ assert_not_nil users(:julien).reset_password_token
86
+ assert_not_nil users(:julien).reset_password_sent_at
87
+ assert !users(:julien).valid_password?(@attributes[:password])
88
+ end
89
+
90
+ test "should not update without token" do
91
+ put :update, :user => @attributes
92
+ assert_redirected_to root_url
93
+ assert flash[:alert]
94
+ end
95
+
96
+ test "should not update with bad token" do
97
+ put :update, :user => @attributes.merge(:reset_password_token => "zeouraprsoghpzçtusfgyzmpfojfjbsodifs")
98
+ assert_redirected_to root_url
99
+ assert flash[:alert]
100
+ end
101
+ end
@@ -0,0 +1,112 @@
1
+ require 'test_helper'
2
+
3
+ class Users::RegistrationsControllerTest < ActionController::TestCase
4
+ test "should get new" do
5
+ get :new
6
+ assert_response :ok
7
+ assert_select '#user_email'
8
+ assert_select '#user_password'
9
+ assert_select '#user_password_confirmation'
10
+ end
11
+
12
+ test "should create" do
13
+ assert_email do
14
+ post :create, :user => { :email => 'toto@example.com', :password => 'my secret' }
15
+ assert_redirected_to user_url
16
+ assert_authenticated(:user)
17
+ end
18
+ end
19
+
20
+ test "should create with password confirmation" do
21
+ assert_email do
22
+ post :create, :user => { :email => 'toto@example.com', :password => 'my secret', :password_confirmation => 'my secret' }
23
+ assert_redirected_to user_url
24
+ assert_authenticated(:user)
25
+ end
26
+ end
27
+
28
+ test "should not create with bad confirmation" do
29
+ assert_no_email do
30
+ post :create, :user => { :email => 'toto@example.com', :password => 'my secret', :password_confirmation => 'blah' }
31
+ assert_response :ok
32
+ assert_template 'users/registrations/new'
33
+ end
34
+
35
+ assert_select '#error_explanation'
36
+ assert_select "#user_password", 1
37
+ assert_select "#user_password[value]", 0
38
+ assert_select "#user_password_confirmation", 1
39
+ assert_select "#user_password_confirmation[value]", 0
40
+ end
41
+
42
+ test "should get edit" do
43
+ sign_in users(:julien)
44
+ get :edit
45
+ assert_response :ok
46
+ assert_select '#user_email'
47
+ assert_select '#user_current_password'
48
+ assert_select '#user_password'
49
+ assert_select '#user_password_confirmation'
50
+ end
51
+
52
+ test "should update" do
53
+ sign_in users(:julien)
54
+
55
+ # assert_email do
56
+ put :update, :user => { :email => 'toto@example.com', :current_password => 'secret' }
57
+ assert_redirected_to user_url
58
+ # end
59
+ end
60
+
61
+ test "should update with blank passwords" do
62
+ sign_in users(:julien)
63
+ put :update, :user => { :email => 'toto@example.com', :current_password => 'secret',
64
+ :password => "", :password_confirmation => "" }
65
+ assert_redirected_to user_url
66
+ assert users(:julien).valid_password?('secret')
67
+ end
68
+
69
+ test "should not update without current_password" do
70
+ sign_in users(:julien)
71
+ put :update, :user => { :email => 'toto@example.com' }
72
+ assert_response :ok
73
+ assert_template 'users/registrations/edit'
74
+ assert_select '#error_explanation'
75
+ end
76
+
77
+ test "should not update with bad current_password" do
78
+ sign_in users(:julien)
79
+ put :update, :user => { :email => 'toto@example.com', :current_password => 'bad secret',
80
+ :password => "azerty", :password_confirmation => "azerty" }
81
+ assert_response :ok
82
+ assert_template 'users/registrations/edit'
83
+ assert_select '#error_explanation'
84
+ assert_select '#user_current_password'
85
+ assert_select '#user_current_password[value]', 0
86
+ assert_select '#user_password'
87
+ assert_select '#user_password[value]', 0
88
+ assert_select '#user_password_confirmation'
89
+ assert_select '#user_password_confirmation[value]', 0
90
+ end
91
+
92
+ test "should destroy" do
93
+ sign_in users(:julien)
94
+ delete :destroy
95
+ assert_redirected_to root_url
96
+ end
97
+
98
+ test "anonymous should not get edit" do
99
+ get :edit
100
+ assert_redirected_to new_user_session_url
101
+ end
102
+
103
+ test "anonymous should not update" do
104
+ put :update, :user => { :email => 'toto@example.com', :current_password => 'bad secret' }
105
+ assert_redirected_to new_user_session_url
106
+ end
107
+
108
+ test "anonymous should not destroy" do
109
+ delete :destroy
110
+ assert_redirected_to new_user_session_url
111
+ end
112
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+
3
+ class Users::SessionsControllerTest < ActionController::TestCase
4
+ setup do
5
+ @valid = { :email => users(:julien).email, :password => 'secret' }
6
+ end
7
+
8
+ test "should get new" do
9
+ get :new
10
+ assert_response :ok
11
+ assert_select '#user_email', 1
12
+ assert_select '#user_password', 1
13
+ assert_select 'input[name=return_to]', 0
14
+ end
15
+
16
+ test "new should define return_to to referer by default" do
17
+ request.env['HTTP_REFERER'] = "/some/path"
18
+ get :new
19
+ assert_response :ok
20
+ assert_select '#user_email', 1
21
+ assert_select '#user_password', 1
22
+ assert_select 'input[name=return_to][value=/some/path]', 1
23
+ end
24
+
25
+ test "new should pass return_to" do
26
+ get :new, :return_to => root_path
27
+ assert_response :ok
28
+ assert_select '#user_email', 1
29
+ assert_select '#user_password', 1
30
+ assert_select 'input[name=return_to][value=' + root_path + ']', 1
31
+ end
32
+
33
+ test "should create" do
34
+ post :create, :user => @valid
35
+ assert_redirected_to user_url
36
+ assert_authenticated(:user)
37
+ end
38
+
39
+ test "should create and redirect to given path" do
40
+ post :create, :user => @valid, :return_to => blog_path
41
+ assert_redirected_to blog_path
42
+ assert_authenticated(:user)
43
+ end
44
+
45
+ test "should create and redirect to given URL" do
46
+ post :create, :user => @valid, :return_to => root_url
47
+ assert_redirected_to root_url
48
+ assert_authenticated(:user)
49
+ end
50
+
51
+ test "create should not redirect to unknown host" do
52
+ post :create, :user => @valid, :return_to => root_url(:host => 'www.bad-host.com')
53
+ assert_redirected_to user_url
54
+ assert_authenticated(:user)
55
+ end
56
+
57
+ test "should fail to create without password" do
58
+ post :create, :user => { :email => users(:julien).email, :password => '' }
59
+ assert_response :unauthorized
60
+ assert_template 'users/sessions/new'
61
+ assert_select "#user_email[value='" + users(:julien).email + "']"
62
+ assert_select "#user_password[value='secret']", 0
63
+ assert_select '#error_explanation'
64
+ assert_not_authenticated(:user)
65
+ end
66
+
67
+ test "should fail to create with bad password" do
68
+ post :create, :user => { :email => users(:martha).email, :password => 'force me in' }
69
+ assert_response :unauthorized
70
+ assert_template 'users/sessions/new'
71
+ assert_select "#user_email[value='" + users(:martha).email + "']"
72
+ assert_select "#user_password[value='force me in']", 0
73
+ assert_select '#error_explanation'
74
+ assert_not_authenticated(:user)
75
+ end
76
+
77
+ test "should fail to create with unknown user" do
78
+ post :create, :user => { :email => 'nobody@localhost', :password => 'secret' }
79
+ assert_response :unauthorized
80
+ assert_template 'users/sessions/new'
81
+ assert_select "#user_email[value='nobody@localhost']"
82
+ assert_select "#user_password[value='secret']", 0
83
+ assert_select '#error_explanation'
84
+ assert_not_authenticated(:user)
85
+ end
86
+
87
+ test "should destroy" do
88
+ sign_in users(:julien)
89
+
90
+ get :destroy
91
+ assert_redirected_to root_url
92
+ assert_not_authenticated(:user)
93
+ end
94
+
95
+ test "destroy should silently logout anonymous" do
96
+ get :destroy
97
+ assert_redirected_to root_url
98
+ assert_not_authenticated(:user)
99
+ end
100
+ end