af-devise 2.1.2

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 (207) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +885 -0
  4. data/CONTRIBUTING.md +14 -0
  5. data/Gemfile +29 -0
  6. data/Gemfile.lock +155 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +394 -0
  9. data/Rakefile +34 -0
  10. data/app/controllers/devise/confirmations_controller.rb +43 -0
  11. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  12. data/app/controllers/devise/passwords_controller.rb +65 -0
  13. data/app/controllers/devise/registrations_controller.rb +119 -0
  14. data/app/controllers/devise/sessions_controller.rb +50 -0
  15. data/app/controllers/devise/unlocks_controller.rb +44 -0
  16. data/app/controllers/devise_controller.rb +184 -0
  17. data/app/helpers/devise_helper.rb +25 -0
  18. data/app/mailers/devise/mailer.rb +15 -0
  19. data/app/views/devise/_links.erb +3 -0
  20. data/app/views/devise/confirmations/new.html.erb +12 -0
  21. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  22. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  23. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  24. data/app/views/devise/passwords/edit.html.erb +16 -0
  25. data/app/views/devise/passwords/new.html.erb +12 -0
  26. data/app/views/devise/registrations/edit.html.erb +25 -0
  27. data/app/views/devise/registrations/new.html.erb +18 -0
  28. data/app/views/devise/sessions/new.html.erb +17 -0
  29. data/app/views/devise/shared/_links.erb +25 -0
  30. data/app/views/devise/unlocks/new.html.erb +12 -0
  31. data/config/locales/en.yml +59 -0
  32. data/devise.gemspec +25 -0
  33. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  34. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  35. data/lib/devise.rb +444 -0
  36. data/lib/devise/controllers/helpers.rb +285 -0
  37. data/lib/devise/controllers/rememberable.rb +52 -0
  38. data/lib/devise/controllers/scoped_views.rb +17 -0
  39. data/lib/devise/controllers/url_helpers.rb +67 -0
  40. data/lib/devise/delegator.rb +16 -0
  41. data/lib/devise/failure_app.rb +187 -0
  42. data/lib/devise/hooks/activatable.rb +11 -0
  43. data/lib/devise/hooks/forgetable.rb +9 -0
  44. data/lib/devise/hooks/lockable.rb +7 -0
  45. data/lib/devise/hooks/rememberable.rb +6 -0
  46. data/lib/devise/hooks/timeoutable.rb +25 -0
  47. data/lib/devise/hooks/trackable.rb +9 -0
  48. data/lib/devise/mailers/helpers.rb +91 -0
  49. data/lib/devise/mapping.rb +172 -0
  50. data/lib/devise/models.rb +128 -0
  51. data/lib/devise/models/authenticatable.rb +268 -0
  52. data/lib/devise/models/confirmable.rb +270 -0
  53. data/lib/devise/models/database_authenticatable.rb +127 -0
  54. data/lib/devise/models/lockable.rb +193 -0
  55. data/lib/devise/models/omniauthable.rb +27 -0
  56. data/lib/devise/models/recoverable.rb +140 -0
  57. data/lib/devise/models/registerable.rb +25 -0
  58. data/lib/devise/models/rememberable.rb +125 -0
  59. data/lib/devise/models/timeoutable.rb +49 -0
  60. data/lib/devise/models/token_authenticatable.rb +89 -0
  61. data/lib/devise/models/trackable.rb +35 -0
  62. data/lib/devise/models/validatable.rb +66 -0
  63. data/lib/devise/modules.rb +29 -0
  64. data/lib/devise/omniauth.rb +28 -0
  65. data/lib/devise/omniauth/config.rb +45 -0
  66. data/lib/devise/omniauth/url_helpers.rb +18 -0
  67. data/lib/devise/orm/active_record.rb +3 -0
  68. data/lib/devise/orm/mongoid.rb +3 -0
  69. data/lib/devise/param_filter.rb +41 -0
  70. data/lib/devise/rails.rb +54 -0
  71. data/lib/devise/rails/routes.rb +446 -0
  72. data/lib/devise/rails/warden_compat.rb +43 -0
  73. data/lib/devise/strategies/authenticatable.rb +176 -0
  74. data/lib/devise/strategies/base.rb +20 -0
  75. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  76. data/lib/devise/strategies/rememberable.rb +55 -0
  77. data/lib/devise/strategies/token_authenticatable.rb +56 -0
  78. data/lib/devise/test_helpers.rb +131 -0
  79. data/lib/devise/time_inflector.rb +14 -0
  80. data/lib/devise/version.rb +3 -0
  81. data/lib/generators/active_record/devise_generator.rb +79 -0
  82. data/lib/generators/active_record/templates/migration.rb +19 -0
  83. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  84. data/lib/generators/devise/devise_generator.rb +24 -0
  85. data/lib/generators/devise/install_generator.rb +24 -0
  86. data/lib/generators/devise/orm_helpers.rb +32 -0
  87. data/lib/generators/devise/views_generator.rb +116 -0
  88. data/lib/generators/mongoid/devise_generator.rb +57 -0
  89. data/lib/generators/templates/README +35 -0
  90. data/lib/generators/templates/devise.rb +240 -0
  91. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  92. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  93. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  94. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  95. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  96. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  97. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  98. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  99. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  100. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  101. data/test/controllers/custom_strategy_test.rb +62 -0
  102. data/test/controllers/helpers_test.rb +253 -0
  103. data/test/controllers/internal_helpers_test.rb +110 -0
  104. data/test/controllers/sessions_controller_test.rb +85 -0
  105. data/test/controllers/url_helpers_test.rb +59 -0
  106. data/test/delegator_test.rb +19 -0
  107. data/test/devise_test.rb +72 -0
  108. data/test/failure_app_test.rb +221 -0
  109. data/test/generators/active_record_generator_test.rb +75 -0
  110. data/test/generators/devise_generator_test.rb +39 -0
  111. data/test/generators/install_generator_test.rb +13 -0
  112. data/test/generators/mongoid_generator_test.rb +23 -0
  113. data/test/generators/views_generator_test.rb +52 -0
  114. data/test/helpers/devise_helper_test.rb +51 -0
  115. data/test/integration/authenticatable_test.rb +633 -0
  116. data/test/integration/confirmable_test.rb +298 -0
  117. data/test/integration/database_authenticatable_test.rb +82 -0
  118. data/test/integration/http_authenticatable_test.rb +97 -0
  119. data/test/integration/lockable_test.rb +242 -0
  120. data/test/integration/omniauthable_test.rb +133 -0
  121. data/test/integration/recoverable_test.rb +334 -0
  122. data/test/integration/registerable_test.rb +345 -0
  123. data/test/integration/rememberable_test.rb +158 -0
  124. data/test/integration/timeoutable_test.rb +140 -0
  125. data/test/integration/token_authenticatable_test.rb +161 -0
  126. data/test/integration/trackable_test.rb +92 -0
  127. data/test/mailers/confirmation_instructions_test.rb +102 -0
  128. data/test/mailers/reset_password_instructions_test.rb +83 -0
  129. data/test/mailers/unlock_instructions_test.rb +77 -0
  130. data/test/mapping_test.rb +127 -0
  131. data/test/models/authenticatable_test.rb +7 -0
  132. data/test/models/confirmable_test.rb +391 -0
  133. data/test/models/database_authenticatable_test.rb +196 -0
  134. data/test/models/lockable_test.rb +273 -0
  135. data/test/models/omniauthable_test.rb +7 -0
  136. data/test/models/recoverable_test.rb +205 -0
  137. data/test/models/registerable_test.rb +7 -0
  138. data/test/models/rememberable_test.rb +174 -0
  139. data/test/models/serializable_test.rb +49 -0
  140. data/test/models/timeoutable_test.rb +46 -0
  141. data/test/models/token_authenticatable_test.rb +55 -0
  142. data/test/models/trackable_test.rb +13 -0
  143. data/test/models/validatable_test.rb +117 -0
  144. data/test/models_test.rb +179 -0
  145. data/test/omniauth/config_test.rb +57 -0
  146. data/test/omniauth/url_helpers_test.rb +51 -0
  147. data/test/orm/active_record.rb +9 -0
  148. data/test/orm/mongoid.rb +13 -0
  149. data/test/rails_app/Rakefile +10 -0
  150. data/test/rails_app/app/active_record/admin.rb +6 -0
  151. data/test/rails_app/app/active_record/shim.rb +2 -0
  152. data/test/rails_app/app/active_record/user.rb +6 -0
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  154. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  155. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  156. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  160. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  161. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  162. data/test/rails_app/app/mailers/users/mailer.rb +8 -0
  163. data/test/rails_app/app/mongoid/admin.rb +29 -0
  164. data/test/rails_app/app/mongoid/shim.rb +24 -0
  165. data/test/rails_app/app/mongoid/user.rb +42 -0
  166. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  167. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  168. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  169. data/test/rails_app/app/views/home/index.html.erb +1 -0
  170. data/test/rails_app/app/views/home/join.html.erb +1 -0
  171. data/test/rails_app/app/views/home/private.html.erb +1 -0
  172. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  173. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  174. data/test/rails_app/app/views/users/index.html.erb +1 -0
  175. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  176. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  177. data/test/rails_app/config.ru +4 -0
  178. data/test/rails_app/config/application.rb +41 -0
  179. data/test/rails_app/config/boot.rb +8 -0
  180. data/test/rails_app/config/database.yml +18 -0
  181. data/test/rails_app/config/environment.rb +5 -0
  182. data/test/rails_app/config/environments/development.rb +18 -0
  183. data/test/rails_app/config/environments/production.rb +33 -0
  184. data/test/rails_app/config/environments/test.rb +33 -0
  185. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  186. data/test/rails_app/config/initializers/devise.rb +178 -0
  187. data/test/rails_app/config/initializers/inflections.rb +2 -0
  188. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  189. data/test/rails_app/config/routes.rb +100 -0
  190. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  191. data/test/rails_app/db/schema.rb +52 -0
  192. data/test/rails_app/lib/shared_admin.rb +14 -0
  193. data/test/rails_app/lib/shared_user.rb +26 -0
  194. data/test/rails_app/public/404.html +26 -0
  195. data/test/rails_app/public/422.html +26 -0
  196. data/test/rails_app/public/500.html +26 -0
  197. data/test/rails_app/public/favicon.ico +0 -0
  198. data/test/rails_app/script/rails +10 -0
  199. data/test/routes_test.rb +248 -0
  200. data/test/support/assertions.rb +40 -0
  201. data/test/support/helpers.rb +91 -0
  202. data/test/support/integration.rb +92 -0
  203. data/test/support/locale/en.yml +4 -0
  204. data/test/support/webrat/integrations/rails.rb +24 -0
  205. data/test/test_helper.rb +27 -0
  206. data/test/test_helpers_test.rb +151 -0
  207. metadata +421 -0
@@ -0,0 +1,110 @@
1
+ require 'test_helper'
2
+
3
+ class MyController < DeviseController
4
+ end
5
+
6
+ class HelpersTest < ActionController::TestCase
7
+ tests MyController
8
+
9
+ def setup
10
+ @mock_warden = OpenStruct.new
11
+ @controller.request.env['warden'] = @mock_warden
12
+ @controller.request.env['devise.mapping'] = Devise.mappings[:user]
13
+ end
14
+
15
+ test 'get resource name from env' do
16
+ assert_equal :user, @controller.resource_name
17
+ end
18
+
19
+ test 'get resource class from env' do
20
+ assert_equal User, @controller.resource_class
21
+ end
22
+
23
+ test 'get resource instance variable from env' do
24
+ @controller.instance_variable_set(:@user, user = User.new)
25
+ assert_equal user, @controller.resource
26
+ end
27
+
28
+ test 'set resource instance variable from env' do
29
+ user = @controller.send(:resource_class).new
30
+ @controller.send(:resource=, user)
31
+
32
+ assert_equal user, @controller.send(:resource)
33
+ assert_equal user, @controller.instance_variable_get(:@user)
34
+ end
35
+
36
+ test 'get resource params from request params using resource name as key' do
37
+ user_params = {'name' => 'Shirley Templar'}
38
+ @controller.stubs(:params).returns(HashWithIndifferentAccess.new({'user' => user_params}))
39
+
40
+ assert_equal user_params, @controller.resource_params
41
+ end
42
+
43
+ test 'resources methods are not controller actions' do
44
+ assert @controller.class.action_methods.empty?
45
+ end
46
+
47
+ test 'require no authentication tests current mapping' do
48
+ @mock_warden.expects(:authenticate?).with(:rememberable, :token_authenticatable, :scope => :user).returns(true)
49
+ @mock_warden.expects(:user).with(:user).returns(User.new)
50
+ @controller.expects(:redirect_to).with(root_path)
51
+ @controller.send :require_no_authentication
52
+ end
53
+
54
+ test 'require no authentication only checks if already authenticated if no inputs strategies are available' do
55
+ Devise.mappings[:user].expects(:no_input_strategies).returns([])
56
+ @mock_warden.expects(:authenticate?).never
57
+ @mock_warden.expects(:authenticated?).with(:user).once.returns(true)
58
+ @mock_warden.expects(:user).with(:user).returns(User.new)
59
+ @controller.expects(:redirect_to).with(root_path)
60
+ @controller.send :require_no_authentication
61
+ end
62
+
63
+ test 'require no authentication sets a flash message' do
64
+ @mock_warden.expects(:authenticate?).with(:rememberable, :token_authenticatable, :scope => :user).returns(true)
65
+ @mock_warden.expects(:user).with(:user).returns(User.new)
66
+ @controller.expects(:redirect_to).with(root_path)
67
+ @controller.send :require_no_authentication
68
+ assert flash[:alert] == I18n.t("devise.failure.already_authenticated")
69
+ end
70
+
71
+ test 'signed in resource returns signed in resource for current scope' do
72
+ @mock_warden.expects(:authenticate).with(:scope => :user).returns(User.new)
73
+ assert_kind_of User, @controller.signed_in_resource
74
+ end
75
+
76
+ test 'is a devise controller' do
77
+ assert @controller.devise_controller?
78
+ end
79
+
80
+ test 'does not issue blank flash messages' do
81
+ I18n.stubs(:t).returns(' ')
82
+ @controller.send :set_flash_message, :notice, :send_instructions
83
+ assert flash[:notice].nil?
84
+ end
85
+
86
+ test 'issues non-blank flash messages normally' do
87
+ I18n.stubs(:t).returns('non-blank')
88
+ @controller.send :set_flash_message, :notice, :send_instructions
89
+ assert_equal 'non-blank', flash[:notice]
90
+ end
91
+
92
+ test 'uses custom i18n options' do
93
+ @controller.stubs(:devise_i18n_options).returns(:default => "devise custom options")
94
+ @controller.send :set_flash_message, :notice, :invalid_i18n_messagesend_instructions
95
+ assert_equal 'devise custom options', flash[:notice]
96
+ end
97
+
98
+ test 'allows custom i18n options to override resource_name' do
99
+ I18n.expects(:t).with("custom_resource_name.confirmed", anything)
100
+ @controller.stubs(:devise_i18n_options).returns(:resource_name => "custom_resource_name")
101
+ @controller.send :set_flash_message, :notice, :confirmed
102
+ end
103
+
104
+ test 'navigational_formats not returning a wild card' do
105
+ MyController.send(:public, :navigational_formats)
106
+ Devise.navigational_formats = [:"*/*", :html]
107
+ assert_not @controller.navigational_formats.include?(:"*/*")
108
+ MyController.send(:protected, :navigational_formats)
109
+ end
110
+ end
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+
3
+ class SessionsControllerTest < ActionController::TestCase
4
+ tests Devise::SessionsController
5
+ include Devise::TestHelpers
6
+
7
+ test "#create works even with scoped views" do
8
+ swap Devise, :scoped_views => true do
9
+ request.env["devise.mapping"] = Devise.mappings[:user]
10
+ post :create
11
+ assert_equal 200, @response.status
12
+ assert_template "users/sessions/new"
13
+ end
14
+ end
15
+
16
+ test "#create delete the url stored in the session if the requested format is navigational" do
17
+ request.env["devise.mapping"] = Devise.mappings[:user]
18
+ request.session["user_return_to"] = 'foo.bar'
19
+
20
+ user = create_user
21
+ user.confirm!
22
+ post :create, :user => {
23
+ :email => user.email,
24
+ :password => user.password
25
+ }
26
+
27
+ assert_nil request.session["user_return_to"]
28
+ end
29
+
30
+ test "#create doesn't delete the url stored in the session if the requested format is not navigational" do
31
+ request.env["devise.mapping"] = Devise.mappings[:user]
32
+ request.session["user_return_to"] = 'foo.bar'
33
+
34
+ user = create_user
35
+ user.confirm!
36
+ post :create, :format => 'json', :user => {
37
+ :email => user.email,
38
+ :password => user.password
39
+ }
40
+
41
+ assert_equal 'foo.bar', request.session["user_return_to"]
42
+ end
43
+
44
+ test "#create doesn't raise exception after Warden authentication fails when TestHelpers included" do
45
+ request.env["devise.mapping"] = Devise.mappings[:user]
46
+ post :create, :user => {
47
+ :email => "nosuchuser@example.com",
48
+ :password => "wevdude"
49
+ }
50
+ assert_equal 200, @response.status
51
+ assert_template "devise/sessions/new"
52
+ end
53
+
54
+ test "#destroy doesn't set the flash if the requested format is not navigational" do
55
+ request.env["devise.mapping"] = Devise.mappings[:user]
56
+ user = create_user
57
+ user.confirm!
58
+ post :create, :format => 'json', :user => {
59
+ :email => user.email,
60
+ :password => user.password
61
+ }
62
+
63
+ delete :destroy, :format => 'json'
64
+ assert flash[:notice].blank?, "flash[:notice] should be blank, not #{flash[:notice].inspect}"
65
+ assert_equal 204, @response.status
66
+ end
67
+
68
+ if defined?(ActiveRecord) && ActiveRecord::Base.respond_to?(:mass_assignment_sanitizer)
69
+ test "#new doesn't raise mass-assignment exception even if sign-in key is attr_protected" do
70
+ request.env["devise.mapping"] = Devise.mappings[:user]
71
+
72
+ ActiveRecord::Base.mass_assignment_sanitizer = :strict
73
+ User.class_eval { attr_protected :email }
74
+
75
+ begin
76
+ assert_nothing_raised ActiveModel::MassAssignmentSecurity::Error do
77
+ get :new, :user => { :email => "allez viens!" }
78
+ end
79
+ ensure
80
+ ActiveRecord::Base.mass_assignment_sanitizer = :logger
81
+ User.class_eval { attr_accessible :email }
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ class RoutesTest < ActionController::TestCase
4
+ tests ApplicationController
5
+
6
+ def assert_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 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
+ assert_path_and_url :session
33
+ assert_path_and_url :session, :new
34
+ assert_path_and_url :session, :destroy
35
+ end
36
+
37
+ test 'should alias password to mapped user password' do
38
+ assert_path_and_url :password
39
+ assert_path_and_url :password, :new
40
+ assert_path_and_url :password, :edit
41
+ end
42
+
43
+ test 'should alias confirmation to mapped user confirmation' do
44
+ assert_path_and_url :confirmation
45
+ assert_path_and_url :confirmation, :new
46
+ end
47
+
48
+ test 'should alias unlock to mapped user unlock' do
49
+ assert_path_and_url :unlock
50
+ assert_path_and_url :unlock, :new
51
+ end
52
+
53
+ test 'should alias registration to mapped user registration' do
54
+ assert_path_and_url :registration
55
+ assert_path_and_url :registration, :new
56
+ assert_path_and_url :registration, :edit
57
+ assert_path_and_url :registration, :cancel
58
+ end
59
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class DelegatorTest < ActiveSupport::TestCase
4
+ def delegator
5
+ Devise::Delegator.new
6
+ end
7
+
8
+ test 'failure_app returns default failure app if no warden options in env' do
9
+ assert_equal Devise::FailureApp, delegator.failure_app({})
10
+ end
11
+
12
+ test 'failure_app returns default failure app if no scope in warden options' do
13
+ assert_equal Devise::FailureApp, delegator.failure_app({"warden.options" => {}})
14
+ end
15
+
16
+ test 'failure_app returns associated failure app by scope in the given environment' do
17
+ assert_kind_of Proc, delegator.failure_app({"warden.options" => {:scope => "manager"}})
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ require 'test_helper'
2
+
3
+ module Devise
4
+ def self.yield_and_restore
5
+ @@warden_configured = nil
6
+ c, b = @@warden_config, @@warden_config_block
7
+ yield
8
+ ensure
9
+ @@warden_config, @@warden_config_block = c, b
10
+ end
11
+ end
12
+
13
+ class DeviseTest < ActiveSupport::TestCase
14
+ test 'model options can be configured through Devise' do
15
+ swap Devise, :allow_unconfirmed_access_for => 113, :pepper => "foo" do
16
+ assert_equal 113, Devise.allow_unconfirmed_access_for
17
+ assert_equal "foo", Devise.pepper
18
+ end
19
+ end
20
+
21
+ test 'setup block yields self' do
22
+ Devise.setup do |config|
23
+ assert_equal Devise, config
24
+ end
25
+ end
26
+
27
+ test 'stores warden configuration' do
28
+ assert_kind_of Devise::Delegator, Devise.warden_config.failure_app
29
+ assert_equal :user, Devise.warden_config.default_scope
30
+ end
31
+
32
+ test 'warden manager user configuration through a block' do
33
+ Devise.yield_and_restore do
34
+ @executed = false
35
+ Devise.warden do |config|
36
+ @executed = true
37
+ assert_kind_of Warden::Config, config
38
+ end
39
+
40
+ Devise.configure_warden!
41
+ assert @executed
42
+ end
43
+ end
44
+
45
+ test 'add new module using the helper method' do
46
+ assert_nothing_raised(Exception) { Devise.add_module(:coconut) }
47
+ assert_equal 1, Devise::ALL.select { |v| v == :coconut }.size
48
+ assert_not Devise::STRATEGIES.include?(:coconut)
49
+ assert_not defined?(Devise::Models::Coconut)
50
+ Devise::ALL.delete(:coconut)
51
+
52
+ assert_nothing_raised(Exception) { Devise.add_module(:banana, :strategy => :fruits) }
53
+ assert_equal :fruits, Devise::STRATEGIES[:banana]
54
+ Devise::ALL.delete(:banana)
55
+ Devise::STRATEGIES.delete(:banana)
56
+
57
+ assert_nothing_raised(Exception) { Devise.add_module(:kivi, :controller => :fruits) }
58
+ assert_equal :fruits, Devise::CONTROLLERS[:kivi]
59
+ Devise::ALL.delete(:kivi)
60
+ Devise::CONTROLLERS.delete(:kivi)
61
+ end
62
+
63
+ test 'should complain when comparing empty or different sized passes' do
64
+ [nil, ""].each do |empty|
65
+ assert_not Devise.secure_compare(empty, "something")
66
+ assert_not Devise.secure_compare("something", empty)
67
+ assert_not Devise.secure_compare(empty, empty)
68
+ end
69
+ assert_not Devise.secure_compare("size_1", "size_four")
70
+ end
71
+
72
+ end
@@ -0,0 +1,221 @@
1
+ require 'test_helper'
2
+ require 'ostruct'
3
+
4
+ class FailureTest < ActiveSupport::TestCase
5
+ class RootFailureApp < Devise::FailureApp
6
+ def fake_app
7
+ Object.new
8
+ end
9
+ end
10
+
11
+ def self.context(name, &block)
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def call_failure(env_params={})
16
+ env = {
17
+ 'REQUEST_URI' => 'http://test.host/',
18
+ 'HTTP_HOST' => 'test.host',
19
+ 'REQUEST_METHOD' => 'GET',
20
+ 'warden.options' => { :scope => :user },
21
+ 'rack.session' => {},
22
+ 'action_dispatch.request.formats' => Array(env_params.delete('formats') || Mime::HTML),
23
+ 'rack.input' => "",
24
+ 'warden' => OpenStruct.new(:message => nil)
25
+ }.merge!(env_params)
26
+
27
+ @response = (env.delete(:app) || Devise::FailureApp).call(env).to_a
28
+ @request = ActionDispatch::Request.new(env)
29
+ end
30
+
31
+ context 'When redirecting' do
32
+ test 'returns to the default redirect location' do
33
+ call_failure
34
+ assert_equal 302, @response.first
35
+ assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert]
36
+ assert_equal 'http://test.host/users/sign_in', @response.second['Location']
37
+ end
38
+
39
+ test 'returns to the default redirect location for wildcard requests' do
40
+ call_failure 'action_dispatch.request.formats' => nil, 'HTTP_ACCEPT' => '*/*'
41
+ assert_equal 302, @response.first
42
+ assert_equal 'http://test.host/users/sign_in', @response.second['Location']
43
+ end
44
+
45
+ test 'returns to the root path if no session path is available' do
46
+ swap Devise, :router_name => :fake_app do
47
+ call_failure :app => RootFailureApp
48
+ assert_equal 302, @response.first
49
+ assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert]
50
+ assert_equal 'http://test.host/', @response.second['Location']
51
+ end
52
+ end
53
+
54
+ if Rails.application.config.respond_to?(:relative_url_root)
55
+ test 'returns to the default redirect location considering the relative url root' do
56
+ swap Rails.application.config, :relative_url_root => "/sample" do
57
+ call_failure
58
+ assert_equal 302, @response.first
59
+ assert_equal 'http://test.host/sample/users/sign_in', @response.second['Location']
60
+ end
61
+ end
62
+ end
63
+
64
+ test 'uses the proxy failure message as symbol' do
65
+ call_failure('warden' => OpenStruct.new(:message => :invalid))
66
+ assert_equal 'Invalid email or password.', @request.flash[:alert]
67
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
68
+ end
69
+
70
+ test 'uses the proxy failure message as string' do
71
+ call_failure('warden' => OpenStruct.new(:message => 'Hello world'))
72
+ assert_equal 'Hello world', @request.flash[:alert]
73
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
74
+ end
75
+
76
+ test 'set content type to default text/html' do
77
+ call_failure
78
+ assert_equal 'text/html; charset=utf-8', @response.second['Content-Type']
79
+ end
80
+
81
+ test 'setup a default message' do
82
+ call_failure
83
+ assert_match /You are being/, @response.last.body
84
+ assert_match /redirected/, @response.last.body
85
+ assert_match /users\/sign_in/, @response.last.body
86
+ end
87
+
88
+ test 'works for any navigational format' do
89
+ swap Devise, :navigational_formats => [:xml] do
90
+ call_failure('formats' => Mime::XML)
91
+ assert_equal 302, @response.first
92
+ end
93
+ end
94
+
95
+ test 'redirects the correct format if it is a non-html format request' do
96
+ swap Devise, :navigational_formats => [:js] do
97
+ call_failure('formats' => Mime::JS)
98
+ assert_equal 'http://test.host/users/sign_in.js', @response.second["Location"]
99
+ end
100
+ end
101
+ end
102
+
103
+ context 'For HTTP request' do
104
+ test 'return 401 status' do
105
+ call_failure('formats' => Mime::XML)
106
+ assert_equal 401, @response.first
107
+ end
108
+
109
+ test 'return appropriate body for xml' do
110
+ call_failure('formats' => Mime::XML)
111
+ result = %(<?xml version="1.0" encoding="UTF-8"?>\n<errors>\n <error>You need to sign in or sign up before continuing.</error>\n</errors>\n)
112
+ assert_equal result, @response.last.body
113
+ end
114
+
115
+ test 'return appropriate body for json' do
116
+ call_failure('formats' => Mime::JSON)
117
+ result = %({"error":"You need to sign in or sign up before continuing."})
118
+ assert_equal result, @response.last.body
119
+ end
120
+
121
+ test 'return 401 status for unknown formats' do
122
+ call_failure 'formats' => []
123
+ assert_equal 401, @response.first
124
+ end
125
+
126
+ test 'return WWW-authenticate headers if model allows' do
127
+ call_failure('formats' => Mime::XML)
128
+ assert_equal 'Basic realm="Application"', @response.second["WWW-Authenticate"]
129
+ end
130
+
131
+ test 'does not return WWW-authenticate headers if model does not allow' do
132
+ swap Devise, :http_authenticatable => false do
133
+ call_failure('formats' => Mime::XML)
134
+ assert_nil @response.second["WWW-Authenticate"]
135
+ end
136
+ end
137
+
138
+ test 'works for any non navigational format' do
139
+ swap Devise, :navigational_formats => [] do
140
+ call_failure('formats' => Mime::HTML)
141
+ assert_equal 401, @response.first
142
+ end
143
+ end
144
+
145
+ test 'uses the failure message as response body' do
146
+ call_failure('formats' => Mime::XML, 'warden' => OpenStruct.new(:message => :invalid))
147
+ assert_match '<error>Invalid email or password.</error>', @response.third.body
148
+ end
149
+
150
+ context 'on ajax call' do
151
+ context 'when http_authenticatable_on_xhr is false' do
152
+ test 'dont return 401 with navigational formats' do
153
+ swap Devise, :http_authenticatable_on_xhr => false do
154
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
155
+ assert_equal 302, @response.first
156
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
157
+ end
158
+ end
159
+
160
+ test 'dont return 401 with non navigational formats' do
161
+ swap Devise, :http_authenticatable_on_xhr => false do
162
+ call_failure('formats' => Mime::JSON, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
163
+ assert_equal 302, @response.first
164
+ assert_equal 'http://test.host/users/sign_in.json', @response.second["Location"]
165
+ end
166
+ end
167
+ end
168
+
169
+ context 'when http_authenticatable_on_xhr is true' do
170
+ test 'return 401' do
171
+ swap Devise, :http_authenticatable_on_xhr => true do
172
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
173
+ assert_equal 401, @response.first
174
+ end
175
+ end
176
+
177
+ test 'skip WWW-Authenticate header' do
178
+ swap Devise, :http_authenticatable_on_xhr => true do
179
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
180
+ assert_nil @response.second['WWW-Authenticate']
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ context 'With recall' do
188
+ test 'calls the original controller if invalid email or password' do
189
+ env = {
190
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in" },
191
+ "devise.mapping" => Devise.mappings[:user],
192
+ "warden" => stub_everything
193
+ }
194
+ call_failure(env)
195
+ assert @response.third.body.include?('<h2>Sign in</h2>')
196
+ assert @response.third.body.include?('Invalid email or password.')
197
+ end
198
+
199
+ test 'calls the original controller if not confirmed email' do
200
+ env = {
201
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :unconfirmed },
202
+ "devise.mapping" => Devise.mappings[:user],
203
+ "warden" => stub_everything
204
+ }
205
+ call_failure(env)
206
+ assert @response.third.body.include?('<h2>Sign in</h2>')
207
+ assert @response.third.body.include?('You have to confirm your account before continuing.')
208
+ end
209
+
210
+ test 'calls the original controller if inactive account' do
211
+ env = {
212
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :inactive },
213
+ "devise.mapping" => Devise.mappings[:user],
214
+ "warden" => stub_everything
215
+ }
216
+ call_failure(env)
217
+ assert @response.third.body.include?('<h2>Sign in</h2>')
218
+ assert @response.third.body.include?('Your account was not activated yet.')
219
+ end
220
+ end
221
+ end