ramon-devise 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/CHANGELOG.rdoc +109 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +243 -0
  4. data/Rakefile +45 -0
  5. data/TODO +8 -0
  6. data/app/controllers/confirmations_controller.rb +33 -0
  7. data/app/controllers/passwords_controller.rb +41 -0
  8. data/app/controllers/sessions_controller.rb +33 -0
  9. data/app/models/devise_mailer.rb +53 -0
  10. data/app/views/confirmations/new.html.erb +16 -0
  11. data/app/views/devise_mailer/confirmation_instructions.html.erb +5 -0
  12. data/app/views/devise_mailer/reset_password_instructions.html.erb +8 -0
  13. data/app/views/passwords/edit.html.erb +20 -0
  14. data/app/views/passwords/new.html.erb +16 -0
  15. data/app/views/sessions/new.html.erb +23 -0
  16. data/generators/devise/USAGE +5 -0
  17. data/generators/devise/devise_generator.rb +25 -0
  18. data/generators/devise/lib/route_devise.rb +32 -0
  19. data/generators/devise/templates/README +22 -0
  20. data/generators/devise/templates/migration.rb +20 -0
  21. data/generators/devise/templates/model.rb +5 -0
  22. data/generators/devise_install/USAGE +3 -0
  23. data/generators/devise_install/devise_install_generator.rb +9 -0
  24. data/generators/devise_install/templates/devise.rb +40 -0
  25. data/generators/devise_views/USAGE +3 -0
  26. data/generators/devise_views/devise_views_generator.rb +24 -0
  27. data/init.rb +2 -0
  28. data/lib/devise.rb +79 -0
  29. data/lib/devise/controllers/filters.rb +111 -0
  30. data/lib/devise/controllers/helpers.rb +130 -0
  31. data/lib/devise/controllers/url_helpers.rb +49 -0
  32. data/lib/devise/failure.rb +38 -0
  33. data/lib/devise/hooks/confirmable.rb +11 -0
  34. data/lib/devise/hooks/rememberable.rb +27 -0
  35. data/lib/devise/locales/en.yml +18 -0
  36. data/lib/devise/mapping.rb +120 -0
  37. data/lib/devise/migrations.rb +51 -0
  38. data/lib/devise/models.rb +105 -0
  39. data/lib/devise/models/authenticatable.rb +97 -0
  40. data/lib/devise/models/confirmable.rb +156 -0
  41. data/lib/devise/models/recoverable.rb +88 -0
  42. data/lib/devise/models/rememberable.rb +95 -0
  43. data/lib/devise/models/validatable.rb +36 -0
  44. data/lib/devise/rails.rb +17 -0
  45. data/lib/devise/rails/routes.rb +109 -0
  46. data/lib/devise/rails/warden_compat.rb +26 -0
  47. data/lib/devise/strategies/authenticatable.rb +46 -0
  48. data/lib/devise/strategies/base.rb +24 -0
  49. data/lib/devise/strategies/rememberable.rb +35 -0
  50. data/lib/devise/version.rb +3 -0
  51. data/lib/devise/warden.rb +24 -0
  52. data/test/controllers/filters_test.rb +103 -0
  53. data/test/controllers/helpers_test.rb +55 -0
  54. data/test/controllers/url_helpers_test.rb +47 -0
  55. data/test/devise_test.rb +72 -0
  56. data/test/failure_test.rb +34 -0
  57. data/test/integration/authenticatable_test.rb +187 -0
  58. data/test/integration/confirmable_test.rb +89 -0
  59. data/test/integration/recoverable_test.rb +131 -0
  60. data/test/integration/rememberable_test.rb +65 -0
  61. data/test/mailers/confirmation_instructions_test.rb +59 -0
  62. data/test/mailers/reset_password_instructions_test.rb +62 -0
  63. data/test/mapping_test.rb +101 -0
  64. data/test/models/authenticatable_test.rb +118 -0
  65. data/test/models/confirmable_test.rb +237 -0
  66. data/test/models/recoverable_test.rb +141 -0
  67. data/test/models/rememberable_test.rb +130 -0
  68. data/test/models/validatable_test.rb +99 -0
  69. data/test/models_test.rb +111 -0
  70. data/test/rails_app/app/controllers/admins_controller.rb +6 -0
  71. data/test/rails_app/app/controllers/application_controller.rb +10 -0
  72. data/test/rails_app/app/controllers/home_controller.rb +4 -0
  73. data/test/rails_app/app/controllers/users_controller.rb +7 -0
  74. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  75. data/test/rails_app/app/models/account.rb +3 -0
  76. data/test/rails_app/app/models/admin.rb +3 -0
  77. data/test/rails_app/app/models/organizer.rb +3 -0
  78. data/test/rails_app/app/models/user.rb +3 -0
  79. data/test/rails_app/config/boot.rb +110 -0
  80. data/test/rails_app/config/environment.rb +41 -0
  81. data/test/rails_app/config/environments/development.rb +17 -0
  82. data/test/rails_app/config/environments/production.rb +28 -0
  83. data/test/rails_app/config/environments/test.rb +28 -0
  84. data/test/rails_app/config/initializers/new_rails_defaults.rb +21 -0
  85. data/test/rails_app/config/initializers/session_store.rb +15 -0
  86. data/test/rails_app/config/routes.rb +18 -0
  87. data/test/routes_test.rb +79 -0
  88. data/test/support/assertions_helper.rb +22 -0
  89. data/test/support/integration_tests_helper.rb +66 -0
  90. data/test/support/model_tests_helper.rb +51 -0
  91. data/test/test_helper.rb +40 -0
  92. metadata +154 -0
@@ -0,0 +1,55 @@
1
+ require 'test/test_helper'
2
+
3
+ class MyController < ApplicationController
4
+ include Devise::Controllers::Helpers
5
+ end
6
+
7
+ class HelpersTest < ActionController::TestCase
8
+ tests MyController
9
+
10
+ test 'get resource name from request path' do
11
+ @request.path = '/users/session'
12
+ assert_equal :user, @controller.resource_name
13
+ end
14
+
15
+ test 'get resource name from specific request path' do
16
+ @request.path = '/admin_area/session'
17
+ assert_equal :admin, @controller.resource_name
18
+ end
19
+
20
+ test 'get resource class from request path' do
21
+ @request.path = '/users/session'
22
+ assert_equal User, @controller.resource_class
23
+ end
24
+
25
+ test 'get resource instance variable from request path' do
26
+ @request.path = '/admin_area/session'
27
+ @controller.instance_variable_set(:@admin, admin = Admin.new)
28
+ assert_equal admin, @controller.resource
29
+ end
30
+
31
+ test 'set resource instance variable from request path' do
32
+ @request.path = '/admin_area/session'
33
+
34
+ admin = @controller.send(:resource_class).new
35
+ @controller.send(:resource=, admin)
36
+
37
+ assert_equal admin, @controller.send(:resource)
38
+ assert_equal admin, @controller.instance_variable_get(:@admin)
39
+ end
40
+
41
+ test 'resources methods are not controller actions' do
42
+ assert @controller.class.action_methods.empty?
43
+ end
44
+
45
+ test 'require no authentication tests current mapping' do
46
+ @controller.expects(:resource_name).returns(:user).twice
47
+ @mock_warden.expects(:authenticated?).with(:user).returns(true)
48
+ @controller.expects(:redirect_to).with(root_path)
49
+ @controller.send :require_no_authentication
50
+ end
51
+
52
+ test 'is a devise controller' do
53
+ assert @controller.devise_controller?
54
+ end
55
+ end
@@ -0,0 +1,47 @@
1
+ require 'test/test_helper'
2
+
3
+ class RoutesTest < ActionController::TestCase
4
+ tests ApplicationController
5
+
6
+ def test_path_and_url(name, prepend_path=nil)
7
+ @request.path = '/users/session'
8
+ prepend_path = "#{prepend_path}_" if prepend_path
9
+
10
+ # Resource param
11
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", :user),
12
+ send(:"#{prepend_path}user_#{name}_path")
13
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", :user),
14
+ send(:"#{prepend_path}user_#{name}_url")
15
+
16
+ # Default url params
17
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", :user, :param => 123),
18
+ send(:"#{prepend_path}user_#{name}_path", :param => 123)
19
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", :user, :param => 123),
20
+ send(:"#{prepend_path}user_#{name}_url", :param => 123)
21
+
22
+ @request.path = nil
23
+ # With an AR object
24
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", User.new),
25
+ send(:"#{prepend_path}user_#{name}_path")
26
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", User.new),
27
+ send(:"#{prepend_path}user_#{name}_url")
28
+ end
29
+
30
+
31
+ test 'should alias session to mapped user session' do
32
+ test_path_and_url :session
33
+ test_path_and_url :session, :new
34
+ test_path_and_url :session, :destroy
35
+ end
36
+
37
+ test 'should alias password to mapped user password' do
38
+ test_path_and_url :password
39
+ test_path_and_url :password, :new
40
+ test_path_and_url :password, :edit
41
+ end
42
+
43
+ test 'should alias confirmation to mapped user confirmation' do
44
+ test_path_and_url :confirmation
45
+ test_path_and_url :confirmation, :new
46
+ end
47
+ end
@@ -0,0 +1,72 @@
1
+ require 'test/test_helper'
2
+
3
+ module Devise
4
+ def self.clean_warden_config!
5
+ @warden_config = nil
6
+ end
7
+ end
8
+
9
+ class DeviseTest < ActiveSupport::TestCase
10
+ class MockManager
11
+ attr_accessor :failure_app
12
+ attr_reader :default_strategies, :silence_missing_strategies
13
+
14
+ def silence_missing_strategies!
15
+ @silence_missing_strategies = true
16
+ end
17
+
18
+ def default_strategies(*args)
19
+ if args.empty?
20
+ @default_strategies
21
+ else
22
+ @default_strategies = args
23
+ end
24
+ end
25
+ end
26
+
27
+ test 'DeviseMailer.sender can be configured through Devise' do
28
+ swap DeviseMailer, :sender => "foo@bar" do
29
+ assert_equal "foo@bar", DeviseMailer.sender
30
+ Devise.mailer_sender = "bar@foo"
31
+ assert_equal "bar@foo", DeviseMailer.sender
32
+ end
33
+ end
34
+
35
+ test 'model options can be configured through Devise' do
36
+ swap Devise, :confirm_within => 113, :pepper => "foo" do
37
+ assert_equal 113, Devise.confirm_within
38
+ assert_equal "foo", Devise.pepper
39
+ end
40
+ end
41
+
42
+ test 'setup block yields self' do
43
+ Devise.setup do |config|
44
+ assert_equal Devise, config
45
+ end
46
+ end
47
+
48
+ test 'warden manager configuration' do
49
+ manager = MockManager.new
50
+ Devise.configure_warden_manager(manager)
51
+
52
+ assert_equal Devise::Failure, manager.failure_app
53
+ assert_equal [:rememberable, :authenticatable], manager.default_strategies
54
+ assert manager.silence_missing_strategies
55
+ end
56
+
57
+ test 'warden manager user configuration through a block' do
58
+ begin
59
+ @executed = false
60
+ Devise.warden do |manager|
61
+ @executed = true
62
+ assert_kind_of MockManager, manager
63
+ end
64
+
65
+ manager = MockManager.new
66
+ Devise.configure_warden_manager(manager)
67
+ assert @executed
68
+ ensure
69
+ Devise.clean_warden_config!
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,34 @@
1
+ require 'test/test_helper'
2
+
3
+ class FailureTest < ActiveSupport::TestCase
4
+
5
+ def call_failure(env_params={})
6
+ env = {'warden.options' => {:scope => :user}.update(env_params)}
7
+ Devise::Failure.call(env)
8
+ end
9
+
10
+ test 'return 302 status' do
11
+ assert_equal 302, call_failure.first
12
+ end
13
+
14
+ test 'return redirect location based on mapping with params' do
15
+ assert_equal '/users/sign_in', call_failure.second['Location']
16
+ end
17
+
18
+ test 'add params to redirect location' do
19
+ location = call_failure(:params => {:test => true}).second['Location']
20
+ assert_equal '/users/sign_in?test=true', location
21
+ end
22
+
23
+ test 'set content type to default text/plain' do
24
+ assert_equal 'text/plain', call_failure.second['Content-Type']
25
+ end
26
+
27
+ test 'setup a default message' do
28
+ assert_equal ['You are being redirected to /users/sign_in'], call_failure.last
29
+ end
30
+
31
+ test 'pass in a different message' do
32
+ assert_equal ['Hello world'], call_failure(:message => 'Hello world').last
33
+ end
34
+ end
@@ -0,0 +1,187 @@
1
+ require 'test/test_helper'
2
+
3
+ class AuthenticationTest < ActionController::IntegrationTest
4
+
5
+ test 'home should be accessible without signed in' do
6
+ visit '/'
7
+ assert_response :success
8
+ assert_template 'home/index'
9
+ end
10
+
11
+ test 'sign in as user should not authenticate admin scope' do
12
+ sign_in_as_user
13
+
14
+ assert warden.authenticated?(:user)
15
+ assert_not warden.authenticated?(:admin)
16
+ end
17
+
18
+ test 'sign in as admin should not authenticate user scope' do
19
+ sign_in_as_admin
20
+
21
+ assert warden.authenticated?(:admin)
22
+ assert_not warden.authenticated?(:user)
23
+ end
24
+
25
+ test 'sign in as both user and admin at same time' do
26
+ sign_in_as_user
27
+ sign_in_as_admin
28
+
29
+ assert warden.authenticated?(:user)
30
+ assert warden.authenticated?(:admin)
31
+ end
32
+
33
+ test 'sign out as user should not touch admin authentication' do
34
+ sign_in_as_user
35
+ sign_in_as_admin
36
+
37
+ get destroy_user_session_path
38
+ assert_not warden.authenticated?(:user)
39
+ assert warden.authenticated?(:admin)
40
+ end
41
+
42
+ test 'sign out as admin should not touch user authentication' do
43
+ sign_in_as_user
44
+ sign_in_as_admin
45
+
46
+ get destroy_admin_session_path
47
+ assert_not warden.authenticated?(:admin)
48
+ assert warden.authenticated?(:user)
49
+ end
50
+
51
+ test 'not signed in as admin should not be able to access admins actions' do
52
+ get admins_path
53
+
54
+ assert_redirected_to new_admin_session_path(:unauthenticated => true)
55
+ assert_not warden.authenticated?(:admin)
56
+ end
57
+
58
+ test 'signed in as user should not be able to access admins actions' do
59
+ sign_in_as_user
60
+ assert warden.authenticated?(:user)
61
+ assert_not warden.authenticated?(:admin)
62
+
63
+ get admins_path
64
+ assert_redirected_to new_admin_session_path(:unauthenticated => true)
65
+ end
66
+
67
+ test 'signed in as admin should be able to access admin actions' do
68
+ sign_in_as_admin
69
+ assert warden.authenticated?(:admin)
70
+ assert_not warden.authenticated?(:user)
71
+
72
+ get admins_path
73
+
74
+ assert_response :success
75
+ assert_template 'admins/index'
76
+ assert_contain 'Welcome Admin'
77
+ end
78
+
79
+ test 'admin signing in with invalid email should return to sign in form with error message' do
80
+ sign_in_as_admin do
81
+ fill_in 'email', :with => 'wrongemail@test.com'
82
+ end
83
+
84
+ assert_contain 'Invalid email or password'
85
+ assert_not warden.authenticated?(:admin)
86
+ end
87
+
88
+ test 'admin signing in with invalid pasword should return to sign in form with error message' do
89
+ sign_in_as_admin do
90
+ fill_in 'password', :with => 'abcdef'
91
+ end
92
+
93
+ assert_contain 'Invalid email or password'
94
+ assert_not warden.authenticated?(:admin)
95
+ end
96
+
97
+ test 'error message is configurable by resource name' do
98
+ begin
99
+ I18n.backend.store_translations(:en, :devise => { :sessions =>
100
+ { :admin => { :invalid => "Invalid credentials" } } })
101
+
102
+ sign_in_as_admin do
103
+ fill_in 'password', :with => 'abcdef'
104
+ end
105
+
106
+ assert_contain 'Invalid credentials'
107
+ ensure
108
+ I18n.reload!
109
+ end
110
+ end
111
+
112
+ test 'authenticated admin should not be able to sign as admin again' do
113
+ sign_in_as_admin
114
+ get new_admin_session_path
115
+
116
+ assert_response :redirect
117
+ assert_redirected_to admin_root_path
118
+ assert warden.authenticated?(:admin)
119
+ end
120
+
121
+ test 'authenticated admin should be able to sign out' do
122
+ sign_in_as_admin
123
+ assert warden.authenticated?(:admin)
124
+
125
+ get destroy_admin_session_path
126
+ assert_response :redirect
127
+ assert_redirected_to root_path
128
+
129
+ get root_path
130
+ assert_contain 'Signed out successfully'
131
+ assert_not warden.authenticated?(:admin)
132
+ end
133
+
134
+ test 'unauthenticated admin does not set message on sign out' do
135
+ get destroy_admin_session_path
136
+ assert_response :redirect
137
+ assert_redirected_to root_path
138
+
139
+ get root_path
140
+ assert_not_contain 'Signed out successfully'
141
+ end
142
+
143
+ test 'redirect from warden shows sign in or sign up message' do
144
+ get admins_path
145
+
146
+ warden_path = new_admin_session_path(:unauthenticated => true)
147
+ assert_redirected_to warden_path
148
+
149
+ get warden_path
150
+ assert_contain 'You need to sign in or sign up before continuing.'
151
+ end
152
+
153
+ test 'render 404 on roles without permission' do
154
+ get 'admin_area/password/new'
155
+ assert_response :not_found
156
+ assert_not_contain 'Send me reset password instructions'
157
+ end
158
+
159
+ test 'return to default url if no other was requested' do
160
+ sign_in_as_user
161
+
162
+ assert_template 'home/index'
163
+ assert_nil session[:return_to]
164
+ end
165
+
166
+ test 'return to given url after sign in' do
167
+ get users_path
168
+ assert_redirected_to new_user_session_path(:unauthenticated => true)
169
+ assert_equal users_path, session[:"user.return_to"]
170
+ follow_redirect!
171
+
172
+ sign_in_as_user :visit => false
173
+ assert_template 'users/index'
174
+ assert_nil session[:"user.return_to"]
175
+ end
176
+
177
+ test 'return to configured home path after sign in' do
178
+ sign_in_as_admin
179
+ assert_equal "/admin_area/home", @request.path
180
+ end
181
+
182
+ test 'allows session to be set by a given scope' do
183
+ sign_in_as_user
184
+ visit 'users/index'
185
+ assert_equal "Cart", @controller.user_session[:cart]
186
+ end
187
+ end
@@ -0,0 +1,89 @@
1
+ require 'test/test_helper'
2
+
3
+ class ConfirmationTest < ActionController::IntegrationTest
4
+
5
+ def visit_user_confirmation_with_token(confirmation_token)
6
+ visit user_confirmation_path(:confirmation_token => confirmation_token)
7
+ end
8
+
9
+ test 'user should be able to request a new confirmation' do
10
+ user = create_user(:confirm => false)
11
+ ActionMailer::Base.deliveries.clear
12
+
13
+ visit new_user_session_path
14
+ click_link 'Didn\'t receive confirmation instructions?'
15
+
16
+ fill_in 'email', :with => user.email
17
+ click_button 'Resend confirmation instructions'
18
+
19
+ assert_template 'sessions/new'
20
+ assert_contain 'You will receive an email with instructions about how to confirm your account in a few minutes'
21
+ assert_equal 1, ActionMailer::Base.deliveries.size
22
+ end
23
+
24
+ test 'user with invalid confirmation token should not be able to confirm an account' do
25
+ visit_user_confirmation_with_token('invalid_confirmation')
26
+
27
+ assert_response :success
28
+ assert_template 'confirmations/new'
29
+ assert_have_selector '#errorExplanation'
30
+ assert_contain 'Confirmation token is invalid'
31
+ end
32
+
33
+ test 'user with valid confirmation token should be able to confirm an account' do
34
+ user = create_user(:confirm => false)
35
+ assert_not user.confirmed?
36
+
37
+ visit_user_confirmation_with_token(user.confirmation_token)
38
+
39
+ assert_template 'home/index'
40
+ assert_contain 'Your account was successfully confirmed.'
41
+
42
+ assert user.reload.confirmed?
43
+ end
44
+
45
+ test 'user already confirmed user should not be able to confirm the account again' do
46
+ user = create_user
47
+ visit_user_confirmation_with_token(user.confirmation_token)
48
+
49
+ assert_template 'confirmations/new'
50
+ assert_have_selector '#errorExplanation'
51
+ assert_contain 'already confirmed'
52
+ end
53
+
54
+ test 'sign in user automatically after confirming it\'s email' do
55
+ user = create_user(:confirm => false)
56
+ visit_user_confirmation_with_token(user.confirmation_token)
57
+
58
+ assert warden.authenticated?(:user)
59
+ end
60
+
61
+ test 'not confirmed user and setup to block without confirmation should not be able to sign in' do
62
+ Devise.confirm_within = 0
63
+ user = sign_in_as_user(:confirm => false)
64
+
65
+ assert_redirected_to new_user_session_path(:unconfirmed => true)
66
+ assert_not warden.authenticated?(:user)
67
+ end
68
+
69
+ test 'not confirmed user but configured with some days to confirm should be able to sign in' do
70
+ Devise.confirm_within = 1
71
+ user = sign_in_as_user(:confirm => false)
72
+
73
+ assert_response :success
74
+ assert warden.authenticated?(:user)
75
+ end
76
+
77
+ test 'error message is configurable by resource name' do
78
+ begin
79
+ I18n.backend.store_translations(:en, :devise => { :sessions =>
80
+ { :admin => { :unconfirmed => "Not confirmed user" } } })
81
+
82
+ get new_admin_session_path(:unconfirmed => true)
83
+
84
+ assert_contain 'Not confirmed user'
85
+ ensure
86
+ I18n.reload!
87
+ end
88
+ end
89
+ end