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.
- data/README.rdoc +144 -0
- data/lib/janus/config.rb +26 -0
- data/lib/janus/controllers/confirmations_controller.rb +56 -0
- data/lib/janus/controllers/helpers.rb +54 -0
- data/lib/janus/controllers/internal_helpers.rb +33 -0
- data/lib/janus/controllers/passwords_controller.rb +60 -0
- data/lib/janus/controllers/registrations_controller.rb +55 -0
- data/lib/janus/controllers/sessions_controller.rb +94 -0
- data/lib/janus/controllers/url_helpers.rb +61 -0
- data/lib/janus/helper.rb +11 -0
- data/lib/janus/hooks/rememberable.rb +20 -0
- data/lib/janus/hooks/remote_authenticatable.rb +27 -0
- data/lib/janus/hooks/trackable.rb +3 -0
- data/lib/janus/hooks.rb +58 -0
- data/lib/janus/mailer.rb +13 -0
- data/lib/janus/manager.rb +97 -0
- data/lib/janus/models/base.rb +31 -0
- data/lib/janus/models/confirmable.rb +45 -0
- data/lib/janus/models/database_authenticatable.rb +98 -0
- data/lib/janus/models/rememberable.rb +54 -0
- data/lib/janus/models/remote_authenticatable.rb +99 -0
- data/lib/janus/models/remote_token.rb +17 -0
- data/lib/janus/models/trackable.rb +37 -0
- data/lib/janus/routes.rb +78 -0
- data/lib/janus/strategies/base.rb +40 -0
- data/lib/janus/strategies/database_authenticatable.rb +20 -0
- data/lib/janus/strategies/rememberable.rb +52 -0
- data/lib/janus/strategies/remote_authenticatable.rb +28 -0
- data/lib/janus/strategies.rb +33 -0
- data/lib/janus/test_helper.rb +25 -0
- data/lib/janus.rb +60 -0
- data/test/functional/home_controller_test.rb +8 -0
- data/test/functional/janus/mailer_test.rb +14 -0
- data/test/functional/janus/manager_test.rb +94 -0
- data/test/functional/users/confirmations_controller_test.rb +59 -0
- data/test/functional/users/passwords_controller_test.rb +101 -0
- data/test/functional/users/registrations_controller_test.rb +112 -0
- data/test/functional/users/sessions_controller_test.rb +100 -0
- data/test/functional/users_controller_test.rb +22 -0
- data/test/integration/users/rememberable_test.rb +32 -0
- data/test/integration/users/remote_test.rb +72 -0
- data/test/integration/users/sessions_test.rb +18 -0
- data/test/integration/users/trackable_test.rb +22 -0
- data/test/rails_app/app/controllers/application_controller.rb +9 -0
- data/test/rails_app/app/controllers/blogs_controller.rb +6 -0
- data/test/rails_app/app/controllers/home_controller.rb +4 -0
- data/test/rails_app/app/controllers/users/confirmations_controller.rb +3 -0
- data/test/rails_app/app/controllers/users/passwords_controller.rb +3 -0
- data/test/rails_app/app/controllers/users/registrations_controller.rb +7 -0
- data/test/rails_app/app/controllers/users/sessions_controller.rb +11 -0
- data/test/rails_app/app/controllers/users_controller.rb +9 -0
- data/test/rails_app/app/helpers/application_helper.rb +2 -0
- data/test/rails_app/app/mailers/janus_mailer.rb +2 -0
- data/test/rails_app/app/models/remote_token.rb +6 -0
- data/test/rails_app/app/models/user.rb +8 -0
- data/test/rails_app/config/application.rb +42 -0
- data/test/rails_app/config/boot.rb +6 -0
- data/test/rails_app/config/environment.rb +5 -0
- data/test/rails_app/config/environments/development.rb +26 -0
- data/test/rails_app/config/environments/production.rb +49 -0
- data/test/rails_app/config/environments/test.rb +36 -0
- data/test/rails_app/config/initializers/janus.rb +11 -0
- data/test/rails_app/config/initializers/secret_token.rb +7 -0
- data/test/rails_app/config/initializers/session_store.rb +8 -0
- data/test/rails_app/config/routes.rb +12 -0
- data/test/rails_app/db/migrate/20110323153820_create_users.rb +34 -0
- data/test/rails_app/db/migrate/20110331153546_create_remote_tokens.rb +15 -0
- data/test/rails_app/db/schema.rb +45 -0
- data/test/rails_app/db/seeds.rb +7 -0
- data/test/test_helper.rb +103 -0
- data/test/unit/confirmable_test.rb +36 -0
- data/test/unit/janus_test.rb +27 -0
- data/test/unit/rememberable_test.rb +50 -0
- data/test/unit/remote_authenticatable_test.rb +37 -0
- data/test/unit/remote_token_test.rb +9 -0
- data/test/unit/reset_password_test.rb +45 -0
- data/test/unit/trackable_test.rb +21 -0
- data/test/unit/user_test.rb +60 -0
- 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,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
|