upstream-devise 2.1.0.rc

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 (215) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +846 -0
  4. data/Gemfile +35 -0
  5. data/Gemfile.lock +165 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +384 -0
  8. data/Rakefile +34 -0
  9. data/app/controllers/devise/confirmations_controller.rb +43 -0
  10. data/app/controllers/devise/omniauth_callbacks_controller.rb +24 -0
  11. data/app/controllers/devise/passwords_controller.rb +47 -0
  12. data/app/controllers/devise/registrations_controller.rb +107 -0
  13. data/app/controllers/devise/sessions_controller.rb +49 -0
  14. data/app/controllers/devise/unlocks_controller.rb +44 -0
  15. data/app/controllers/devise_controller.rb +177 -0
  16. data/app/helpers/devise_helper.rb +25 -0
  17. data/app/mailers/devise/mailer.rb +15 -0
  18. data/app/views/devise/_links.erb +3 -0
  19. data/app/views/devise/confirmations/new.html.erb +12 -0
  20. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  21. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  22. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  23. data/app/views/devise/passwords/edit.html.erb +16 -0
  24. data/app/views/devise/passwords/new.html.erb +12 -0
  25. data/app/views/devise/registrations/edit.html.erb +25 -0
  26. data/app/views/devise/registrations/new.html.erb +18 -0
  27. data/app/views/devise/sessions/new.html.erb +17 -0
  28. data/app/views/devise/shared/_links.erb +25 -0
  29. data/app/views/devise/unlocks/new.html.erb +12 -0
  30. data/config/locales/en.yml +57 -0
  31. data/devise.gemspec +25 -0
  32. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  33. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  34. data/lib/devise.rb +455 -0
  35. data/lib/devise/controllers/helpers.rb +269 -0
  36. data/lib/devise/controllers/rememberable.rb +52 -0
  37. data/lib/devise/controllers/scoped_views.rb +17 -0
  38. data/lib/devise/controllers/url_helpers.rb +67 -0
  39. data/lib/devise/delegator.rb +17 -0
  40. data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
  41. data/lib/devise/encryptors/base.rb +24 -0
  42. data/lib/devise/encryptors/clearance_sha1.rb +17 -0
  43. data/lib/devise/encryptors/restful_authentication_sha1.rb +22 -0
  44. data/lib/devise/encryptors/sha1.rb +25 -0
  45. data/lib/devise/encryptors/sha512.rb +25 -0
  46. data/lib/devise/failure_app.rb +185 -0
  47. data/lib/devise/hooks/activatable.rb +11 -0
  48. data/lib/devise/hooks/forgetable.rb +9 -0
  49. data/lib/devise/hooks/lockable.rb +7 -0
  50. data/lib/devise/hooks/rememberable.rb +6 -0
  51. data/lib/devise/hooks/timeoutable.rb +22 -0
  52. data/lib/devise/hooks/trackable.rb +9 -0
  53. data/lib/devise/mailers/helpers.rb +86 -0
  54. data/lib/devise/mapping.rb +172 -0
  55. data/lib/devise/models.rb +123 -0
  56. data/lib/devise/models/authenticatable.rb +231 -0
  57. data/lib/devise/models/confirmable.rb +242 -0
  58. data/lib/devise/models/database_authenticatable.rb +126 -0
  59. data/lib/devise/models/encryptable.rb +86 -0
  60. data/lib/devise/models/lockable.rb +185 -0
  61. data/lib/devise/models/omniauthable.rb +27 -0
  62. data/lib/devise/models/recoverable.rb +140 -0
  63. data/lib/devise/models/registerable.rb +25 -0
  64. data/lib/devise/models/rememberable.rb +125 -0
  65. data/lib/devise/models/timeoutable.rb +49 -0
  66. data/lib/devise/models/token_authenticatable.rb +77 -0
  67. data/lib/devise/models/trackable.rb +35 -0
  68. data/lib/devise/models/validatable.rb +66 -0
  69. data/lib/devise/modules.rb +30 -0
  70. data/lib/devise/omniauth.rb +28 -0
  71. data/lib/devise/omniauth/config.rb +45 -0
  72. data/lib/devise/omniauth/url_helpers.rb +33 -0
  73. data/lib/devise/orm/active_record.rb +3 -0
  74. data/lib/devise/orm/mongoid.rb +3 -0
  75. data/lib/devise/param_filter.rb +41 -0
  76. data/lib/devise/rails.rb +54 -0
  77. data/lib/devise/rails/routes.rb +412 -0
  78. data/lib/devise/rails/warden_compat.rb +43 -0
  79. data/lib/devise/strategies/authenticatable.rb +165 -0
  80. data/lib/devise/strategies/base.rb +15 -0
  81. data/lib/devise/strategies/database_authenticatable.rb +21 -0
  82. data/lib/devise/strategies/rememberable.rb +53 -0
  83. data/lib/devise/strategies/token_authenticatable.rb +57 -0
  84. data/lib/devise/test_helpers.rb +130 -0
  85. data/lib/devise/version.rb +3 -0
  86. data/lib/generators/active_record/devise_generator.rb +78 -0
  87. data/lib/generators/active_record/templates/migration.rb +19 -0
  88. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  89. data/lib/generators/devise/devise_generator.rb +24 -0
  90. data/lib/generators/devise/install_generator.rb +24 -0
  91. data/lib/generators/devise/orm_helpers.rb +32 -0
  92. data/lib/generators/devise/views_generator.rb +110 -0
  93. data/lib/generators/mongoid/devise_generator.rb +60 -0
  94. data/lib/generators/templates/README +31 -0
  95. data/lib/generators/templates/devise.rb +216 -0
  96. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  97. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  98. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  99. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  100. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  101. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  102. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  103. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  104. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  105. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  106. data/test/controllers/custom_strategy_test.rb +62 -0
  107. data/test/controllers/helpers_test.rb +254 -0
  108. data/test/controllers/internal_helpers_test.rb +97 -0
  109. data/test/controllers/sessions_controller_test.rb +36 -0
  110. data/test/controllers/url_helpers_test.rb +59 -0
  111. data/test/delegator_test.rb +19 -0
  112. data/test/devise_test.rb +72 -0
  113. data/test/encryptors_test.rb +30 -0
  114. data/test/failure_app_test.rb +211 -0
  115. data/test/generators/active_record_generator_test.rb +69 -0
  116. data/test/generators/devise_generator_test.rb +39 -0
  117. data/test/generators/install_generator_test.rb +13 -0
  118. data/test/generators/mongoid_generator_test.rb +23 -0
  119. data/test/generators/views_generator_test.rb +52 -0
  120. data/test/helpers/devise_helper_test.rb +51 -0
  121. data/test/indifferent_hash.rb +33 -0
  122. data/test/integration/authenticatable_test.rb +587 -0
  123. data/test/integration/confirmable_test.rb +255 -0
  124. data/test/integration/database_authenticatable_test.rb +82 -0
  125. data/test/integration/http_authenticatable_test.rb +97 -0
  126. data/test/integration/lockable_test.rb +224 -0
  127. data/test/integration/omniauthable_test.rb +133 -0
  128. data/test/integration/recoverable_test.rb +300 -0
  129. data/test/integration/registerable_test.rb +324 -0
  130. data/test/integration/rememberable_test.rb +158 -0
  131. data/test/integration/timeoutable_test.rb +114 -0
  132. data/test/integration/token_authenticatable_test.rb +161 -0
  133. data/test/integration/trackable_test.rb +92 -0
  134. data/test/mailers/confirmation_instructions_test.rb +95 -0
  135. data/test/mailers/reset_password_instructions_test.rb +83 -0
  136. data/test/mailers/unlock_instructions_test.rb +77 -0
  137. data/test/mapping_test.rb +127 -0
  138. data/test/models/authenticatable_test.rb +7 -0
  139. data/test/models/confirmable_test.rb +357 -0
  140. data/test/models/database_authenticatable_test.rb +189 -0
  141. data/test/models/encryptable_test.rb +73 -0
  142. data/test/models/lockable_test.rb +263 -0
  143. data/test/models/omniauthable_test.rb +7 -0
  144. data/test/models/recoverable_test.rb +205 -0
  145. data/test/models/registerable_test.rb +7 -0
  146. data/test/models/rememberable_test.rb +174 -0
  147. data/test/models/serializable_test.rb +48 -0
  148. data/test/models/timeoutable_test.rb +46 -0
  149. data/test/models/token_authenticatable_test.rb +55 -0
  150. data/test/models/trackable_test.rb +13 -0
  151. data/test/models/validatable_test.rb +117 -0
  152. data/test/models_test.rb +179 -0
  153. data/test/omniauth/config_test.rb +57 -0
  154. data/test/omniauth/url_helpers_test.rb +58 -0
  155. data/test/orm/active_record.rb +9 -0
  156. data/test/orm/mongoid.rb +14 -0
  157. data/test/rails_app/Rakefile +10 -0
  158. data/test/rails_app/app/active_record/admin.rb +6 -0
  159. data/test/rails_app/app/active_record/shim.rb +2 -0
  160. data/test/rails_app/app/active_record/user.rb +6 -0
  161. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  162. data/test/rails_app/app/controllers/admins_controller.rb +6 -0
  163. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  164. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  165. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  166. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  167. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  168. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  169. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  170. data/test/rails_app/app/mailers/users/mailer.rb +3 -0
  171. data/test/rails_app/app/mongoid/admin.rb +30 -0
  172. data/test/rails_app/app/mongoid/shim.rb +24 -0
  173. data/test/rails_app/app/mongoid/user.rb +45 -0
  174. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  175. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  176. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  177. data/test/rails_app/app/views/home/index.html.erb +1 -0
  178. data/test/rails_app/app/views/home/join.html.erb +1 -0
  179. data/test/rails_app/app/views/home/private.html.erb +1 -0
  180. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  181. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  182. data/test/rails_app/app/views/users/index.html.erb +1 -0
  183. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  184. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  185. data/test/rails_app/config.ru +4 -0
  186. data/test/rails_app/config/application.rb +41 -0
  187. data/test/rails_app/config/boot.rb +8 -0
  188. data/test/rails_app/config/database.yml +18 -0
  189. data/test/rails_app/config/environment.rb +5 -0
  190. data/test/rails_app/config/environments/development.rb +18 -0
  191. data/test/rails_app/config/environments/production.rb +33 -0
  192. data/test/rails_app/config/environments/test.rb +33 -0
  193. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  194. data/test/rails_app/config/initializers/devise.rb +186 -0
  195. data/test/rails_app/config/initializers/inflections.rb +2 -0
  196. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  197. data/test/rails_app/config/routes.rb +90 -0
  198. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +77 -0
  199. data/test/rails_app/db/schema.rb +52 -0
  200. data/test/rails_app/lib/shared_admin.rb +14 -0
  201. data/test/rails_app/lib/shared_user.rb +26 -0
  202. data/test/rails_app/public/404.html +26 -0
  203. data/test/rails_app/public/422.html +26 -0
  204. data/test/rails_app/public/500.html +26 -0
  205. data/test/rails_app/public/favicon.ico +0 -0
  206. data/test/rails_app/script/rails +10 -0
  207. data/test/routes_test.rb +248 -0
  208. data/test/support/assertions.rb +42 -0
  209. data/test/support/helpers.rb +91 -0
  210. data/test/support/integration.rb +90 -0
  211. data/test/support/locale/en.yml +4 -0
  212. data/test/support/webrat/integrations/rails.rb +24 -0
  213. data/test/test_helper.rb +27 -0
  214. data/test/test_helpers_test.rb +134 -0
  215. metadata +451 -0
@@ -0,0 +1,97 @@
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 'resources methods are not controller actions' do
37
+ assert @controller.class.action_methods.empty?
38
+ end
39
+
40
+ test 'require no authentication tests current mapping' do
41
+ @mock_warden.expects(:authenticate?).with(:rememberable, :token_authenticatable, :scope => :user).returns(true)
42
+ @mock_warden.expects(:user).with(:user).returns(User.new)
43
+ @controller.expects(:redirect_to).with(root_path)
44
+ @controller.send :require_no_authentication
45
+ end
46
+
47
+ test 'require no authentication only checks if already authenticated if no inputs strategies are available' do
48
+ Devise.mappings[:user].expects(:no_input_strategies).returns([])
49
+ @mock_warden.expects(:authenticate?).never
50
+ @mock_warden.expects(:authenticated?).with(:user).once.returns(true)
51
+ @mock_warden.expects(:user).with(:user).returns(User.new)
52
+ @controller.expects(:redirect_to).with(root_path)
53
+ @controller.send :require_no_authentication
54
+ end
55
+
56
+ test 'require no authentication sets a flash message' do
57
+ @mock_warden.expects(:authenticate?).with(:rememberable, :token_authenticatable, :scope => :user).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
+ assert flash[:alert] == I18n.t("devise.failure.already_authenticated")
62
+ end
63
+
64
+ test 'signed in resource returns signed in resource for current scope' do
65
+ @mock_warden.expects(:authenticate).with(:scope => :user).returns(User.new)
66
+ assert_kind_of User, @controller.signed_in_resource
67
+ end
68
+
69
+ test 'is a devise controller' do
70
+ assert @controller.devise_controller?
71
+ end
72
+
73
+ test 'does not issue blank flash messages' do
74
+ I18n.stubs(:t).returns(' ')
75
+ @controller.send :set_flash_message, :notice, :send_instructions
76
+ assert flash[:notice].nil?
77
+ end
78
+
79
+ test 'issues non-blank flash messages normally' do
80
+ I18n.stubs(:t).returns('non-blank')
81
+ @controller.send :set_flash_message, :notice, :send_instructions
82
+ assert_equal 'non-blank', flash[:notice]
83
+ end
84
+
85
+ test 'uses custom i18n options' do
86
+ @controller.stubs(:devise_i18n_options).returns(:default => "devise custom options")
87
+ @controller.send :set_flash_message, :notice, :invalid_i18n_messagesend_instructions
88
+ assert_equal 'devise custom options', flash[:notice]
89
+ end
90
+
91
+ test 'navigational_formats not returning a wild card' do
92
+ MyController.send(:public, :navigational_formats)
93
+ Devise.navigational_formats = [:"*/*", :html]
94
+ assert_not @controller.navigational_formats.include?(:"*/*")
95
+ MyController.send(:protected, :navigational_formats)
96
+ end
97
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ class SessionsControllerTest < ActionController::TestCase
4
+ tests Devise::SessionsController
5
+ include Devise::TestHelpers
6
+
7
+ test "#create doesn't raise exception after Warden authentication fails when TestHelpers included" do
8
+ request.env["devise.mapping"] = Devise.mappings[:user]
9
+ post :create, :user => {
10
+ :email => "nosuchuser@example.com",
11
+ :password => "wevdude"
12
+ }
13
+ assert_equal 200, @response.status
14
+ assert_template "devise/sessions/new"
15
+ end
16
+
17
+ if defined?(ActiveRecord)
18
+ if ActiveRecord::Base.respond_to?(:mass_assignment_sanitizer)
19
+ test "#new doesn't raise mass-assignment exception even if sign-in key is attr_protected" do
20
+ request.env["devise.mapping"] = Devise.mappings[:user]
21
+
22
+ ActiveRecord::Base.mass_assignment_sanitizer = :strict
23
+ User.class_eval { attr_protected :email }
24
+
25
+ begin
26
+ assert_nothing_raised ActiveModel::MassAssignmentSecurity::Error do
27
+ get :new, :user => { :email => "allez viens!" }
28
+ end
29
+ ensure
30
+ ActiveRecord::Base.mass_assignment_sanitizer = :logger
31
+ User.class_eval { attr_accessible :email }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ 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,30 @@
1
+ require 'test_helper'
2
+
3
+ class Encryptors < ActiveSupport::TestCase
4
+ test 'should match a password created by authlogic' do
5
+ authlogic = "b623c3bc9c775b0eb8edb218a382453396fec4146422853e66ecc4b6bc32d7162ee42074dcb5f180a770dc38b5df15812f09bbf497a4a1b95fe5e7d2b8eb7eb4"
6
+ encryptor = Devise::Encryptors::AuthlogicSha512.digest('123mudar', 20, 'usZK_z_EAaF61Gwkw-ed', '')
7
+ assert_equal authlogic, encryptor
8
+ end
9
+
10
+ test 'should match a password created by restful_authentication' do
11
+ restful_authentication = "93110f71309ce91366375ea44e2a6f5cc73fa8d4"
12
+ encryptor = Devise::Encryptors::RestfulAuthenticationSha1.digest('123mudar', 10, '48901d2b247a54088acb7f8ea3e695e50fe6791b', 'fee9a51ec0a28d11be380ca6dee6b4b760c1a3bf')
13
+ assert_equal restful_authentication, encryptor
14
+ end
15
+
16
+ test 'should match a password created by clearance' do
17
+ clearance = "0f40bbae18ddefd7066276c3ef209d40729b0378"
18
+ encryptor = Devise::Encryptors::ClearanceSha1.digest('123mudar', nil, '65c58472c207c829f28c68619d3e3aefed18ab3f', nil)
19
+ assert_equal clearance, encryptor
20
+ end
21
+
22
+ Devise::ENCRYPTORS_LENGTH.each do |key, value|
23
+ test "should have length #{value} for #{key.inspect}" do
24
+ swap Devise, :encryptor => key do
25
+ encryptor = Devise::Encryptors.const_get(key.to_s.classify)
26
+ assert_equal value, encryptor.digest('a', 4, encryptor.salt(4), nil).size
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,211 @@
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 'return 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 'return 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 'return 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
+ test 'uses the proxy failure message as symbol' do
55
+ call_failure('warden' => OpenStruct.new(:message => :invalid))
56
+ assert_equal 'Invalid email or password.', @request.flash[:alert]
57
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
58
+ end
59
+
60
+ test 'uses the proxy failure message as string' do
61
+ call_failure('warden' => OpenStruct.new(:message => 'Hello world'))
62
+ assert_equal 'Hello world', @request.flash[:alert]
63
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
64
+ end
65
+
66
+ test 'set content type to default text/html' do
67
+ call_failure
68
+ assert_equal 'text/html; charset=utf-8', @response.second['Content-Type']
69
+ end
70
+
71
+ test 'setup a default message' do
72
+ call_failure
73
+ assert_match /You are being/, @response.last.body
74
+ assert_match /redirected/, @response.last.body
75
+ assert_match /users\/sign_in/, @response.last.body
76
+ end
77
+
78
+ test 'works for any navigational format' do
79
+ swap Devise, :navigational_formats => [:xml] do
80
+ call_failure('formats' => Mime::XML)
81
+ assert_equal 302, @response.first
82
+ end
83
+ end
84
+
85
+ test 'redirects the correct format if it is a non-html format request' do
86
+ swap Devise, :navigational_formats => [:js] do
87
+ call_failure('formats' => Mime::JS)
88
+ assert_equal 'http://test.host/users/sign_in.js', @response.second["Location"]
89
+ end
90
+ end
91
+ end
92
+
93
+ context 'For HTTP request' do
94
+ test 'return 401 status' do
95
+ call_failure('formats' => Mime::XML)
96
+ assert_equal 401, @response.first
97
+ end
98
+
99
+ test 'return appropriate body for xml' do
100
+ call_failure('formats' => Mime::XML)
101
+ 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)
102
+ assert_equal result, @response.last.body
103
+ end
104
+
105
+ test 'return appropriate body for json' do
106
+ call_failure('formats' => Mime::JSON)
107
+ result = %({"error":"You need to sign in or sign up before continuing."})
108
+ assert_equal result, @response.last.body
109
+ end
110
+
111
+ test 'return 401 status for unknown formats' do
112
+ call_failure 'formats' => []
113
+ assert_equal 401, @response.first
114
+ end
115
+
116
+ test 'return WWW-authenticate headers if model allows' do
117
+ call_failure('formats' => Mime::XML)
118
+ assert_equal 'Basic realm="Application"', @response.second["WWW-Authenticate"]
119
+ end
120
+
121
+ test 'does not return WWW-authenticate headers if model does not allow' do
122
+ swap Devise, :http_authenticatable => false do
123
+ call_failure('formats' => Mime::XML)
124
+ assert_nil @response.second["WWW-Authenticate"]
125
+ end
126
+ end
127
+
128
+ test 'works for any non navigational format' do
129
+ swap Devise, :navigational_formats => [] do
130
+ call_failure('formats' => Mime::HTML)
131
+ assert_equal 401, @response.first
132
+ end
133
+ end
134
+
135
+ test 'uses the failure message as response body' do
136
+ call_failure('formats' => Mime::XML, 'warden' => OpenStruct.new(:message => :invalid))
137
+ assert_match '<error>Invalid email or password.</error>', @response.third.body
138
+ end
139
+
140
+ context 'on ajax call' do
141
+ context 'when http_authenticatable_on_xhr is false' do
142
+ test 'dont return 401 with navigational formats' do
143
+ swap Devise, :http_authenticatable_on_xhr => false do
144
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
145
+ assert_equal 302, @response.first
146
+ assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
147
+ end
148
+ end
149
+
150
+ test 'dont return 401 with non navigational formats' do
151
+ swap Devise, :http_authenticatable_on_xhr => false do
152
+ call_failure('formats' => Mime::JSON, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
153
+ assert_equal 302, @response.first
154
+ assert_equal 'http://test.host/users/sign_in.json', @response.second["Location"]
155
+ end
156
+ end
157
+ end
158
+
159
+ context 'when http_authenticatable_on_xhr is true' do
160
+ test 'return 401' do
161
+ swap Devise, :http_authenticatable_on_xhr => true do
162
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
163
+ assert_equal 401, @response.first
164
+ end
165
+ end
166
+
167
+ test 'skip WWW-Authenticate header' do
168
+ swap Devise, :http_authenticatable_on_xhr => true do
169
+ call_failure('formats' => Mime::HTML, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
170
+ assert_nil @response.second['WWW-Authenticate']
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+
177
+ context 'With recall' do
178
+ test 'calls the original controller if invalid email or password' do
179
+ env = {
180
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in" },
181
+ "devise.mapping" => Devise.mappings[:user],
182
+ "warden" => stub_everything
183
+ }
184
+ call_failure(env)
185
+ assert @response.third.body.include?('<h2>Sign in</h2>')
186
+ assert @response.third.body.include?('Invalid email or password.')
187
+ end
188
+
189
+ test 'calls the original controller if not confirmed email' do
190
+ env = {
191
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :unconfirmed },
192
+ "devise.mapping" => Devise.mappings[:user],
193
+ "warden" => stub_everything
194
+ }
195
+ call_failure(env)
196
+ assert @response.third.body.include?('<h2>Sign in</h2>')
197
+ assert @response.third.body.include?('You have to confirm your account before continuing.')
198
+ end
199
+
200
+ test 'calls the original controller if inactive account' do
201
+ env = {
202
+ "warden.options" => { :recall => "devise/sessions#new", :attempted_path => "/users/sign_in", :message => :inactive },
203
+ "devise.mapping" => Devise.mappings[:user],
204
+ "warden" => stub_everything
205
+ }
206
+ call_failure(env)
207
+ assert @response.third.body.include?('<h2>Sign in</h2>')
208
+ assert @response.third.body.include?('Your account was not activated yet.')
209
+ end
210
+ end
211
+ end