devise 3.2.1 → 4.4.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (254) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +58 -10
  3. data/CHANGELOG.md +199 -979
  4. data/CODE_OF_CONDUCT.md +22 -0
  5. data/CONTRIBUTING.md +73 -8
  6. data/Gemfile +19 -11
  7. data/Gemfile.lock +152 -119
  8. data/ISSUE_TEMPLATE.md +19 -0
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +347 -93
  11. data/Rakefile +4 -2
  12. data/app/controllers/devise/confirmations_controller.rb +11 -5
  13. data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
  14. data/app/controllers/devise/passwords_controller.rb +20 -8
  15. data/app/controllers/devise/registrations_controller.rb +34 -19
  16. data/app/controllers/devise/sessions_controller.rb +47 -17
  17. data/app/controllers/devise/unlocks_controller.rb +9 -4
  18. data/app/controllers/devise_controller.rb +67 -31
  19. data/app/helpers/devise_helper.rb +4 -2
  20. data/app/mailers/devise/mailer.rb +10 -0
  21. data/app/views/devise/confirmations/new.html.erb +8 -4
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
  23. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  24. data/app/views/devise/mailer/password_change.html.erb +3 -0
  25. data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
  26. data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
  27. data/app/views/devise/passwords/edit.html.erb +15 -6
  28. data/app/views/devise/passwords/new.html.erb +8 -4
  29. data/app/views/devise/registrations/edit.html.erb +28 -14
  30. data/app/views/devise/registrations/new.html.erb +19 -8
  31. data/app/views/devise/sessions/new.html.erb +17 -8
  32. data/app/views/devise/shared/{_links.erb → _links.html.erb} +2 -2
  33. data/app/views/devise/unlocks/new.html.erb +8 -4
  34. data/bin/test +13 -0
  35. data/config/locales/en.yml +22 -17
  36. data/devise.gemspec +7 -6
  37. data/gemfiles/Gemfile.rails-4.1-stable +32 -0
  38. data/gemfiles/Gemfile.rails-4.1-stable.lock +171 -0
  39. data/gemfiles/Gemfile.rails-4.2-stable +32 -0
  40. data/gemfiles/Gemfile.rails-4.2-stable.lock +192 -0
  41. data/gemfiles/Gemfile.rails-5.0-stable +33 -0
  42. data/gemfiles/Gemfile.rails-5.0-stable.lock +192 -0
  43. data/gemfiles/Gemfile.rails-5.2-rc1 +26 -0
  44. data/gemfiles/Gemfile.rails-5.2-rc1.lock +201 -0
  45. data/guides/bug_report_templates/integration_test.rb +106 -0
  46. data/lib/devise.rb +107 -84
  47. data/lib/devise/controllers/helpers.rb +111 -31
  48. data/lib/devise/controllers/rememberable.rb +15 -6
  49. data/lib/devise/controllers/scoped_views.rb +3 -1
  50. data/lib/devise/controllers/sign_in_out.rb +39 -26
  51. data/lib/devise/controllers/store_location.rb +31 -2
  52. data/lib/devise/controllers/url_helpers.rb +9 -7
  53. data/lib/devise/delegator.rb +2 -0
  54. data/lib/devise/encryptor.rb +24 -0
  55. data/lib/devise/failure_app.rb +98 -39
  56. data/lib/devise/hooks/activatable.rb +7 -6
  57. data/lib/devise/hooks/csrf_cleaner.rb +5 -1
  58. data/lib/devise/hooks/forgetable.rb +2 -0
  59. data/lib/devise/hooks/lockable.rb +7 -2
  60. data/lib/devise/hooks/proxy.rb +4 -2
  61. data/lib/devise/hooks/rememberable.rb +4 -2
  62. data/lib/devise/hooks/timeoutable.rb +16 -9
  63. data/lib/devise/hooks/trackable.rb +3 -1
  64. data/lib/devise/mailers/helpers.rb +15 -12
  65. data/lib/devise/mapping.rb +8 -2
  66. data/lib/devise/models.rb +3 -1
  67. data/lib/devise/models/authenticatable.rb +63 -36
  68. data/lib/devise/models/confirmable.rb +121 -41
  69. data/lib/devise/models/database_authenticatable.rb +66 -23
  70. data/lib/devise/models/lockable.rb +30 -17
  71. data/lib/devise/models/omniauthable.rb +3 -1
  72. data/lib/devise/models/recoverable.rb +62 -26
  73. data/lib/devise/models/registerable.rb +2 -0
  74. data/lib/devise/models/rememberable.rb +62 -33
  75. data/lib/devise/models/timeoutable.rb +4 -8
  76. data/lib/devise/models/trackable.rb +12 -3
  77. data/lib/devise/models/validatable.rb +16 -9
  78. data/lib/devise/modules.rb +12 -10
  79. data/lib/devise/omniauth.rb +2 -0
  80. data/lib/devise/omniauth/config.rb +2 -0
  81. data/lib/devise/omniauth/url_helpers.rb +14 -5
  82. data/lib/devise/orm/active_record.rb +5 -1
  83. data/lib/devise/orm/mongoid.rb +6 -2
  84. data/lib/devise/parameter_filter.rb +2 -0
  85. data/lib/devise/parameter_sanitizer.rb +131 -69
  86. data/lib/devise/rails.rb +10 -13
  87. data/lib/devise/rails/routes.rb +147 -116
  88. data/lib/devise/rails/warden_compat.rb +3 -10
  89. data/lib/devise/secret_key_finder.rb +25 -0
  90. data/lib/devise/strategies/authenticatable.rb +20 -9
  91. data/lib/devise/strategies/base.rb +3 -1
  92. data/lib/devise/strategies/database_authenticatable.rb +8 -5
  93. data/lib/devise/strategies/rememberable.rb +15 -3
  94. data/lib/devise/test/controller_helpers.rb +165 -0
  95. data/lib/devise/test/integration_helpers.rb +63 -0
  96. data/lib/devise/test_helpers.rb +7 -124
  97. data/lib/devise/time_inflector.rb +4 -2
  98. data/lib/devise/token_generator.rb +3 -41
  99. data/lib/devise/version.rb +3 -1
  100. data/lib/generators/active_record/devise_generator.rb +47 -10
  101. data/lib/generators/active_record/templates/migration.rb +9 -7
  102. data/lib/generators/active_record/templates/migration_existing.rb +9 -7
  103. data/lib/generators/devise/controllers_generator.rb +46 -0
  104. data/lib/generators/devise/devise_generator.rb +9 -5
  105. data/lib/generators/devise/install_generator.rb +22 -0
  106. data/lib/generators/devise/orm_helpers.rb +8 -19
  107. data/lib/generators/devise/views_generator.rb +51 -28
  108. data/lib/generators/mongoid/devise_generator.rb +22 -19
  109. data/lib/generators/templates/README +5 -12
  110. data/lib/generators/templates/controllers/README +14 -0
  111. data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
  112. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
  113. data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
  114. data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
  115. data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
  116. data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
  117. data/lib/generators/templates/devise.rb +64 -35
  118. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  119. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  120. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  121. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  122. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  123. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +2 -2
  124. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -4
  125. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +2 -2
  126. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +6 -6
  127. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +4 -4
  128. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +6 -6
  129. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +2 -2
  130. data/test/controllers/custom_registrations_controller_test.rb +42 -0
  131. data/test/controllers/custom_strategy_test.rb +10 -6
  132. data/test/controllers/helper_methods_test.rb +24 -0
  133. data/test/controllers/helpers_test.rb +88 -40
  134. data/test/controllers/inherited_controller_i18n_messages_test.rb +53 -0
  135. data/test/controllers/internal_helpers_test.rb +31 -22
  136. data/test/controllers/load_hooks_controller_test.rb +21 -0
  137. data/test/controllers/passwords_controller_test.rb +8 -5
  138. data/test/controllers/sessions_controller_test.rb +42 -33
  139. data/test/controllers/url_helpers_test.rb +13 -5
  140. data/test/delegator_test.rb +3 -1
  141. data/test/devise_test.rb +34 -19
  142. data/test/failure_app_test.rb +150 -42
  143. data/test/generators/active_record_generator_test.rb +58 -31
  144. data/test/generators/controllers_generator_test.rb +50 -0
  145. data/test/generators/devise_generator_test.rb +4 -2
  146. data/test/generators/install_generator_test.rb +16 -3
  147. data/test/generators/mongoid_generator_test.rb +5 -3
  148. data/test/generators/views_generator_test.rb +40 -2
  149. data/test/helpers/devise_helper_test.rb +20 -20
  150. data/test/integration/authenticatable_test.rb +134 -141
  151. data/test/integration/confirmable_test.rb +109 -67
  152. data/test/integration/database_authenticatable_test.rb +36 -23
  153. data/test/integration/http_authenticatable_test.rb +29 -20
  154. data/test/integration/lockable_test.rb +52 -49
  155. data/test/integration/mounted_engine_test.rb +38 -0
  156. data/test/integration/omniauthable_test.rb +30 -15
  157. data/test/integration/recoverable_test.rb +76 -61
  158. data/test/integration/registerable_test.rb +107 -91
  159. data/test/integration/rememberable_test.rb +82 -30
  160. data/test/integration/timeoutable_test.rb +48 -40
  161. data/test/integration/trackable_test.rb +15 -8
  162. data/test/mailers/confirmation_instructions_test.rb +16 -14
  163. data/test/mailers/email_changed_test.rb +132 -0
  164. data/test/mailers/mailer_test.rb +20 -0
  165. data/test/mailers/reset_password_instructions_test.rb +13 -11
  166. data/test/mailers/unlock_instructions_test.rb +12 -10
  167. data/test/mapping_test.rb +15 -6
  168. data/test/models/authenticatable_test.rb +15 -3
  169. data/test/models/confirmable_test.rb +190 -95
  170. data/test/models/database_authenticatable_test.rb +75 -41
  171. data/test/models/lockable_test.rb +115 -61
  172. data/test/models/omniauthable_test.rb +3 -1
  173. data/test/models/recoverable_test.rb +116 -37
  174. data/test/models/registerable_test.rb +3 -1
  175. data/test/models/rememberable_test.rb +95 -94
  176. data/test/models/serializable_test.rb +19 -8
  177. data/test/models/timeoutable_test.rb +10 -8
  178. data/test/models/trackable_test.rb +50 -1
  179. data/test/models/validatable_test.rb +24 -30
  180. data/test/models_test.rb +19 -8
  181. data/test/omniauth/config_test.rb +15 -11
  182. data/test/omniauth/url_helpers_test.rb +8 -9
  183. data/test/orm/active_record.rb +16 -2
  184. data/test/orm/mongoid.rb +4 -2
  185. data/test/parameter_sanitizer_test.rb +53 -57
  186. data/test/rails_app/app/active_record/admin.rb +2 -0
  187. data/test/rails_app/app/active_record/shim.rb +3 -1
  188. data/test/rails_app/app/active_record/user.rb +14 -0
  189. data/test/rails_app/app/active_record/user_on_engine.rb +9 -0
  190. data/test/rails_app/app/active_record/user_on_main_app.rb +9 -0
  191. data/test/rails_app/app/active_record/user_with_validations.rb +12 -0
  192. data/test/rails_app/app/active_record/user_without_email.rb +10 -0
  193. data/test/rails_app/app/controllers/admins/sessions_controller.rb +3 -1
  194. data/test/rails_app/app/controllers/admins_controller.rb +3 -6
  195. data/test/rails_app/app/controllers/application_controller.rb +7 -3
  196. data/test/rails_app/app/controllers/application_with_fake_engine.rb +32 -0
  197. data/test/rails_app/app/controllers/custom/registrations_controller.rb +33 -0
  198. data/test/rails_app/app/controllers/home_controller.rb +7 -1
  199. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +3 -1
  200. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +3 -1
  201. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +7 -5
  202. data/test/rails_app/app/controllers/users_controller.rb +8 -6
  203. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  204. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +5 -0
  205. data/test/rails_app/app/mailers/users/mailer.rb +3 -10
  206. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +6 -0
  207. data/test/rails_app/app/mongoid/admin.rb +13 -11
  208. data/test/rails_app/app/mongoid/shim.rb +4 -2
  209. data/test/rails_app/app/mongoid/user.rb +30 -19
  210. data/test/rails_app/app/mongoid/user_on_engine.rb +41 -0
  211. data/test/rails_app/app/mongoid/user_on_main_app.rb +41 -0
  212. data/test/rails_app/app/mongoid/user_with_validations.rb +37 -0
  213. data/test/rails_app/app/mongoid/user_without_email.rb +35 -0
  214. data/test/rails_app/app/views/admins/sessions/new.html.erb +1 -1
  215. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -1
  216. data/test/rails_app/app/views/home/index.html.erb +1 -1
  217. data/test/rails_app/app/views/home/join.html.erb +1 -1
  218. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -1
  219. data/test/rails_app/app/views/layouts/application.html.erb +1 -1
  220. data/test/rails_app/config/application.rb +13 -5
  221. data/test/rails_app/config/boot.rb +17 -4
  222. data/test/rails_app/config/environment.rb +2 -0
  223. data/test/rails_app/config/environments/development.rb +2 -0
  224. data/test/rails_app/config/environments/production.rb +10 -2
  225. data/test/rails_app/config/environments/test.rb +14 -3
  226. data/test/rails_app/config/initializers/backtrace_silencers.rb +2 -0
  227. data/test/rails_app/config/initializers/devise.rb +22 -21
  228. data/test/rails_app/config/initializers/inflections.rb +2 -0
  229. data/test/rails_app/config/initializers/secret_token.rb +3 -6
  230. data/test/rails_app/config/initializers/session_store.rb +2 -0
  231. data/test/rails_app/config/routes.rb +67 -43
  232. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +16 -10
  233. data/test/rails_app/db/schema.rb +2 -0
  234. data/test/rails_app/lib/shared_admin.rb +10 -4
  235. data/test/rails_app/lib/shared_user.rb +4 -1
  236. data/test/rails_app/lib/shared_user_without_email.rb +28 -0
  237. data/test/rails_app/lib/shared_user_without_omniauth.rb +15 -0
  238. data/test/rails_test.rb +11 -0
  239. data/test/routes_test.rb +92 -61
  240. data/test/secret_key_finder_test.rb +97 -0
  241. data/test/support/action_controller/record_identifier.rb +12 -0
  242. data/test/support/assertions.rb +4 -14
  243. data/test/support/helpers.rb +23 -10
  244. data/test/support/http_method_compatibility.rb +53 -0
  245. data/test/support/integration.rb +19 -16
  246. data/test/support/mongoid.yml +6 -0
  247. data/test/support/webrat/integrations/rails.rb +11 -0
  248. data/test/{test_helpers_test.rb → test/controller_helpers_test.rb} +60 -40
  249. data/test/test/integration_helpers_test.rb +34 -0
  250. data/test/test_helper.rb +9 -0
  251. data/test/test_models.rb +8 -6
  252. metadata +123 -53
  253. data/gemfiles/Gemfile.rails-3.2.x +0 -31
  254. data/gemfiles/Gemfile.rails-3.2.x.lock +0 -159
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class SessionsInheritedController < Devise::SessionsController
6
+ def test_i18n_scope
7
+ set_flash_message(:notice, :signed_in)
8
+ end
9
+ end
10
+
11
+ class AnotherInheritedController < SessionsInheritedController
12
+ protected
13
+
14
+ def translation_scope
15
+ 'another'
16
+ end
17
+ end
18
+
19
+ class InheritedControllerTest < Devise::ControllerTestCase
20
+ tests SessionsInheritedController
21
+
22
+ def setup
23
+ @mock_warden = OpenStruct.new
24
+ @controller.request.env['warden'] = @mock_warden
25
+ @controller.request.env['devise.mapping'] = Devise.mappings[:user]
26
+ end
27
+
28
+ test 'I18n scope is inherited from Devise::Sessions' do
29
+ I18n.expects(:t).with do |message, options|
30
+ message == 'user.signed_in' &&
31
+ options[:scope] == 'devise.sessions'
32
+ end
33
+ @controller.test_i18n_scope
34
+ end
35
+ end
36
+
37
+ class AnotherInheritedControllerTest < Devise::ControllerTestCase
38
+ tests AnotherInheritedController
39
+
40
+ def setup
41
+ @mock_warden = OpenStruct.new
42
+ @controller.request.env['warden'] = @mock_warden
43
+ @controller.request.env['devise.mapping'] = Devise.mappings[:user]
44
+ end
45
+
46
+ test 'I18n scope is overridden' do
47
+ I18n.expects(:t).with do |message, options|
48
+ message == 'user.signed_in' &&
49
+ options[:scope] == 'another'
50
+ end
51
+ @controller.test_i18n_scope
52
+ end
53
+ end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class MyController < DeviseController
4
6
  end
5
7
 
6
- class HelpersTest < ActionController::TestCase
8
+ class HelpersTest < Devise::ControllerTestCase
7
9
  tests MyController
8
10
 
9
11
  def setup
@@ -13,16 +15,16 @@ class HelpersTest < ActionController::TestCase
13
15
  end
14
16
 
15
17
  test 'get resource name from env' do
16
- assert_equal :user, @controller.resource_name
18
+ assert_equal :user, @controller.send(:resource_name)
17
19
  end
18
20
 
19
21
  test 'get resource class from env' do
20
- assert_equal User, @controller.resource_class
22
+ assert_equal User, @controller.send(:resource_class)
21
23
  end
22
24
 
23
25
  test 'get resource instance variable from env' do
24
26
  @controller.instance_variable_set(:@user, user = User.new)
25
- assert_equal user, @controller.resource
27
+ assert_equal user, @controller.send(:resource)
26
28
  end
27
29
 
28
30
  test 'set resource instance variable from env' do
@@ -36,26 +38,24 @@ class HelpersTest < ActionController::TestCase
36
38
  test 'get resource params from request params using resource name as key' do
37
39
  user_params = {'email' => 'shirley@templar.com'}
38
40
 
39
- params = if Devise.rails4?
40
- # Stub controller name so strong parameters can filter properly.
41
- # DeviseController does not allow any parameters by default.
42
- @controller.stubs(:controller_name).returns(:sessions_controller)
41
+ # Stub controller name so strong parameters can filter properly.
42
+ # DeviseController does not allow any parameters by default.
43
+ @controller.stubs(:controller_name).returns(:sessions_controller)
44
+
45
+ params = ActionController::Parameters.new({'user' => user_params})
43
46
 
44
- ActionController::Parameters.new({'user' => user_params})
45
- else
46
- HashWithIndifferentAccess.new({'user' => user_params})
47
- end
48
47
  @controller.stubs(:params).returns(params)
49
48
 
50
- assert_equal user_params, @controller.send(:resource_params)
49
+ res_params = @controller.send(:resource_params).permit!.to_h
50
+ assert_equal user_params, res_params
51
51
  end
52
52
 
53
53
  test 'resources methods are not controller actions' do
54
- assert @controller.class.action_methods.empty?
54
+ assert @controller.class.action_methods.delete_if { |m| m.include? 'commenter' }.empty?
55
55
  end
56
56
 
57
57
  test 'require no authentication tests current mapping' do
58
- @mock_warden.expects(:authenticate?).with(:rememberable, :scope => :user).returns(true)
58
+ @mock_warden.expects(:authenticate?).with(:rememberable, scope: :user).returns(true)
59
59
  @mock_warden.expects(:user).with(:user).returns(User.new)
60
60
  @controller.expects(:redirect_to).with(root_path)
61
61
  @controller.send :require_no_authentication
@@ -71,7 +71,7 @@ class HelpersTest < ActionController::TestCase
71
71
  end
72
72
 
73
73
  test 'require no authentication sets a flash message' do
74
- @mock_warden.expects(:authenticate?).with(:rememberable, :scope => :user).returns(true)
74
+ @mock_warden.expects(:authenticate?).with(:rememberable, scope: :user).returns(true)
75
75
  @mock_warden.expects(:user).with(:user).returns(User.new)
76
76
  @controller.expects(:redirect_to).with(root_path)
77
77
  @controller.send :require_no_authentication
@@ -79,8 +79,8 @@ class HelpersTest < ActionController::TestCase
79
79
  end
80
80
 
81
81
  test 'signed in resource returns signed in resource for current scope' do
82
- @mock_warden.expects(:authenticate).with(:scope => :user).returns(User.new)
83
- assert_kind_of User, @controller.signed_in_resource
82
+ @mock_warden.expects(:authenticate).with(scope: :user).returns(User.new)
83
+ assert_kind_of User, @controller.send(:signed_in_resource)
84
84
  end
85
85
 
86
86
  test 'is a devise controller' do
@@ -99,22 +99,31 @@ class HelpersTest < ActionController::TestCase
99
99
  assert_equal 'non-blank', flash[:notice]
100
100
  end
101
101
 
102
+ test 'issues non-blank flash.now messages normally' do
103
+ I18n.stubs(:t).returns('non-blank')
104
+ @controller.send :set_flash_message, :notice, :send_instructions, { now: true }
105
+ assert_equal 'non-blank', flash.now[:notice]
106
+ end
107
+
102
108
  test 'uses custom i18n options' do
103
- @controller.stubs(:devise_i18n_options).returns(:default => "devise custom options")
109
+ @controller.stubs(:devise_i18n_options).returns(default: "devise custom options")
104
110
  @controller.send :set_flash_message, :notice, :invalid_i18n_messagesend_instructions
105
111
  assert_equal 'devise custom options', flash[:notice]
106
112
  end
107
113
 
108
114
  test 'allows custom i18n options to override resource_name' do
109
115
  I18n.expects(:t).with("custom_resource_name.confirmed", anything)
110
- @controller.stubs(:devise_i18n_options).returns(:resource_name => "custom_resource_name")
116
+ @controller.stubs(:devise_i18n_options).returns(resource_name: "custom_resource_name")
111
117
  @controller.send :set_flash_message, :notice, :confirmed
112
118
  end
113
119
 
114
120
  test 'navigational_formats not returning a wild card' do
115
121
  MyController.send(:public, :navigational_formats)
116
- Devise.navigational_formats = [:"*/*", :html]
117
- assert_not @controller.navigational_formats.include?(:"*/*")
122
+
123
+ swap Devise, navigational_formats: ['*/*', :html] do
124
+ refute @controller.navigational_formats.include?("*/*")
125
+ end
126
+
118
127
  MyController.send(:protected, :navigational_formats)
119
128
  end
120
129
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class LoadHooksControllerTest < Devise::ControllerTestCase
6
+ setup do
7
+ ActiveSupport.on_load(:devise_controller) do
8
+ define_method :defined_by_load_hook do
9
+ puts 'I am defined dynamically by activesupport load hook'
10
+ end
11
+ end
12
+ end
13
+
14
+ teardown do
15
+ DeviseController.class_eval { undef :defined_by_load_hook }
16
+ end
17
+
18
+ test 'load hook called when controller is loaded' do
19
+ assert DeviseController.instance_methods.include? :defined_by_load_hook
20
+ end
21
+ end
@@ -1,18 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- class PasswordsControllerTest < ActionController::TestCase
5
+ class PasswordsControllerTest < Devise::ControllerTestCase
4
6
  tests Devise::PasswordsController
5
- include Devise::TestHelpers
7
+ include Devise::Test::ControllerHelpers
6
8
 
7
9
  setup do
8
10
  request.env["devise.mapping"] = Devise.mappings[:user]
9
- @user = create_user.tap(&:confirm!)
11
+ @user = create_user.tap(&:confirm)
10
12
  @raw = @user.send_reset_password_instructions
11
13
  end
12
14
 
13
15
  def put_update_with_params
14
- put :update, "user" => {
15
- "reset_password_token" => @raw, "password" => "123456", "password_confirmation" => "123456"
16
+ put :update, params: { "user" => {
17
+ "reset_password_token" => @raw, "password" => "1234567", "password_confirmation" => "1234567"
18
+ }
16
19
  }
17
20
  end
18
21
 
@@ -1,25 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- class SessionsControllerTest < ActionController::TestCase
5
+ class SessionsControllerTest < Devise::ControllerTestCase
4
6
  tests Devise::SessionsController
5
- include Devise::TestHelpers
7
+ include Devise::Test::ControllerHelpers
6
8
 
7
9
  test "#create doesn't raise unpermitted params when sign in fails" do
8
- ActiveSupport::Notifications.subscribe /unpermitted_parameters/ do |name, start, finish, id, payload|
9
- flunk "Unpermitted params: #{payload}"
10
+ begin
11
+ subscriber = ActiveSupport::Notifications.subscribe %r{unpermitted_parameters} do |name, start, finish, id, payload|
12
+ flunk "Unpermitted params: #{payload}"
13
+ end
14
+ request.env["devise.mapping"] = Devise.mappings[:user]
15
+ request.session["user_return_to"] = 'foo.bar'
16
+ create_user
17
+ post :create, params: { user: {
18
+ email: "wrong@email.com",
19
+ password: "wrongpassword"
20
+ }
21
+ }
22
+ assert_equal 200, @response.status
23
+ ensure
24
+ ActiveSupport::Notifications.unsubscribe(subscriber)
10
25
  end
11
- request.env["devise.mapping"] = Devise.mappings[:user]
12
- request.session["user_return_to"] = 'foo.bar'
13
- create_user
14
- post :create, :user => {
15
- :email => "wrong@email.com",
16
- :password => "wrongpassword"
17
- }
18
- assert_equal 200, @response.status
19
26
  end
20
27
 
21
28
  test "#create works even with scoped views" do
22
- swap Devise, :scoped_views => true do
29
+ swap Devise, scoped_views: true do
23
30
  request.env["devise.mapping"] = Devise.mappings[:user]
24
31
  post :create
25
32
  assert_equal 200, @response.status
@@ -32,12 +39,12 @@ class SessionsControllerTest < ActionController::TestCase
32
39
  request.session["user_return_to"] = 'foo.bar'
33
40
 
34
41
  user = create_user
35
- user.confirm!
36
- post :create, :user => {
37
- :email => user.email,
38
- :password => user.password
42
+ user.confirm
43
+ post :create, params: { user: {
44
+ email: user.email,
45
+ password: user.password
46
+ }
39
47
  }
40
-
41
48
  assert_nil request.session["user_return_to"]
42
49
  end
43
50
 
@@ -46,10 +53,11 @@ class SessionsControllerTest < ActionController::TestCase
46
53
  request.session["user_return_to"] = 'foo.bar'
47
54
 
48
55
  user = create_user
49
- user.confirm!
50
- post :create, :format => 'json', :user => {
51
- :email => user.email,
52
- :password => user.password
56
+ user.confirm
57
+ post :create, params: { format: 'json', user: {
58
+ email: user.email,
59
+ password: user.password
60
+ }
53
61
  }
54
62
 
55
63
  assert_equal 'foo.bar', request.session["user_return_to"]
@@ -57,9 +65,10 @@ class SessionsControllerTest < ActionController::TestCase
57
65
 
58
66
  test "#create doesn't raise exception after Warden authentication fails when TestHelpers included" do
59
67
  request.env["devise.mapping"] = Devise.mappings[:user]
60
- post :create, :user => {
61
- :email => "nosuchuser@example.com",
62
- :password => "wevdude"
68
+ post :create, params: { user: {
69
+ email: "nosuchuser@example.com",
70
+ password: "wevdude"
71
+ }
63
72
  }
64
73
  assert_equal 200, @response.status
65
74
  assert_template "devise/sessions/new"
@@ -68,13 +77,13 @@ class SessionsControllerTest < ActionController::TestCase
68
77
  test "#destroy doesn't set the flash if the requested format is not navigational" do
69
78
  request.env["devise.mapping"] = Devise.mappings[:user]
70
79
  user = create_user
71
- user.confirm!
72
- post :create, :format => 'json', :user => {
73
- :email => user.email,
74
- :password => user.password
80
+ user.confirm
81
+ post :create, params: { format: 'json', user: {
82
+ email: user.email,
83
+ password: user.password
84
+ }
75
85
  }
76
-
77
- delete :destroy, :format => 'json'
86
+ delete :destroy, format: 'json'
78
87
  assert flash[:notice].blank?, "flash[:notice] should be blank, not #{flash[:notice].inspect}"
79
88
  assert_equal 204, @response.status
80
89
  end
@@ -87,8 +96,8 @@ class SessionsControllerTest < ActionController::TestCase
87
96
  User.class_eval { attr_protected :email }
88
97
 
89
98
  begin
90
- assert_nothing_raised ActiveModel::MassAssignmentSecurity::Error do
91
- get :new, :user => { :email => "allez viens!" }
99
+ assert_nothing_raised do
100
+ get :new, user: { email: "allez viens!" }
92
101
  end
93
102
  ensure
94
103
  ActiveRecord::Base.mass_assignment_sanitizer = :logger
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- class RoutesTest < ActionController::TestCase
5
+ class RoutesTest < Devise::ControllerTestCase
4
6
  tests ApplicationController
5
7
 
6
8
  def assert_path_and_url(name, prepend_path=nil)
@@ -13,11 +15,17 @@ class RoutesTest < ActionController::TestCase
13
15
  assert_equal @controller.send(:"#{prepend_path}#{name}_url", :user),
14
16
  send(:"#{prepend_path}user_#{name}_url")
15
17
 
18
+ # With string
19
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", "user"),
20
+ send(:"#{prepend_path}user_#{name}_path")
21
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", "user"),
22
+ send(:"#{prepend_path}user_#{name}_url")
23
+
16
24
  # 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)
25
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", :user, param: 123),
26
+ send(:"#{prepend_path}user_#{name}_path", param: 123)
27
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", :user, param: 123),
28
+ send(:"#{prepend_path}user_#{name}_url", param: 123)
21
29
 
22
30
  @request.path = nil
23
31
  # With an object
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class DelegatorTest < ActiveSupport::TestCase
@@ -14,6 +16,6 @@ class DelegatorTest < ActiveSupport::TestCase
14
16
  end
15
17
 
16
18
  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"}})
19
+ assert_kind_of Proc, delegator.failure_app({"warden.options" => {scope: "manager"}})
18
20
  end
19
21
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  module Devise
4
6
  def self.yield_and_restore
5
7
  @@warden_configured = nil
6
- c, b = @@warden_config, @@warden_config_block
8
+ c, b = @@warden_config, @@warden_config_blocks
7
9
  yield
8
10
  ensure
9
- @@warden_config, @@warden_config_block = c, b
11
+ @@warden_config, @@warden_config_blocks = c, b
10
12
  end
11
13
  end
12
14
 
@@ -14,16 +16,16 @@ class DeviseTest < ActiveSupport::TestCase
14
16
  test 'bcrypt on the class' do
15
17
  password = "super secret"
16
18
  klass = Struct.new(:pepper, :stretches).new("blahblah", 2)
17
- hash = Devise.bcrypt(klass, password)
19
+ hash = Devise::Encryptor.digest(klass, password)
18
20
  assert_equal ::BCrypt::Password.create(hash), hash
19
21
 
20
22
  klass = Struct.new(:pepper, :stretches).new("bla", 2)
21
- hash = Devise.bcrypt(klass, password)
23
+ hash = Devise::Encryptor.digest(klass, password)
22
24
  assert_not_equal ::BCrypt::Password.new(hash), hash
23
25
  end
24
26
 
25
27
  test 'model options can be configured through Devise' do
26
- swap Devise, :allow_unconfirmed_access_for => 113, :pepper => "foo" do
28
+ swap Devise, allow_unconfirmed_access_for: 113, pepper: "foo" do
27
29
  assert_equal 113, Devise.allow_unconfirmed_access_for
28
30
  assert_equal "foo", Devise.pepper
29
31
  end
@@ -42,30 +44,43 @@ class DeviseTest < ActiveSupport::TestCase
42
44
 
43
45
  test 'warden manager user configuration through a block' do
44
46
  Devise.yield_and_restore do
45
- @executed = false
47
+ executed = false
46
48
  Devise.warden do |config|
47
- @executed = true
49
+ executed = true
48
50
  assert_kind_of Warden::Config, config
49
51
  end
50
52
 
51
53
  Devise.configure_warden!
52
- assert @executed
54
+ assert executed
55
+ end
56
+ end
57
+
58
+ test 'warden manager user configuration through multiple blocks' do
59
+ Devise.yield_and_restore do
60
+ executed = 0
61
+
62
+ 3.times do
63
+ Devise.warden { |config| executed += 1 }
64
+ end
65
+
66
+ Devise.configure_warden!
67
+ assert_equal 3, executed
53
68
  end
54
69
  end
55
70
 
56
71
  test 'add new module using the helper method' do
57
- assert_nothing_raised(Exception) { Devise.add_module(:coconut) }
72
+ Devise.add_module(:coconut)
58
73
  assert_equal 1, Devise::ALL.select { |v| v == :coconut }.size
59
- assert_not Devise::STRATEGIES.include?(:coconut)
60
- assert_not defined?(Devise::Models::Coconut)
74
+ refute Devise::STRATEGIES.include?(:coconut)
75
+ refute defined?(Devise::Models::Coconut)
61
76
  Devise::ALL.delete(:coconut)
62
77
 
63
- assert_nothing_raised(Exception) { Devise.add_module(:banana, :strategy => :fruits) }
78
+ Devise.add_module(:banana, strategy: :fruits)
64
79
  assert_equal :fruits, Devise::STRATEGIES[:banana]
65
80
  Devise::ALL.delete(:banana)
66
81
  Devise::STRATEGIES.delete(:banana)
67
82
 
68
- assert_nothing_raised(Exception) { Devise.add_module(:kivi, :controller => :fruits) }
83
+ Devise.add_module(:kivi, controller: :fruits)
69
84
  assert_equal :fruits, Devise::CONTROLLERS[:kivi]
70
85
  Devise::ALL.delete(:kivi)
71
86
  Devise::CONTROLLERS.delete(:kivi)
@@ -73,16 +88,16 @@ class DeviseTest < ActiveSupport::TestCase
73
88
 
74
89
  test 'should complain when comparing empty or different sized passes' do
75
90
  [nil, ""].each do |empty|
76
- assert_not Devise.secure_compare(empty, "something")
77
- assert_not Devise.secure_compare("something", empty)
78
- assert_not Devise.secure_compare(empty, empty)
91
+ refute Devise.secure_compare(empty, "something")
92
+ refute Devise.secure_compare("something", empty)
93
+ refute Devise.secure_compare(empty, empty)
79
94
  end
80
- assert_not Devise.secure_compare("size_1", "size_four")
95
+ refute Devise.secure_compare("size_1", "size_four")
81
96
  end
82
97
 
83
98
  test 'Devise.email_regexp should match valid email addresses' do
84
- valid_emails = ["test@example.com", "jo@jo.co", "f4$_m@you.com", "testing.example@example.com.ua"]
85
- non_valid_emails = ["rex", "test@go,com", "test user@example.com", "test_user@example server.com"]
99
+ valid_emails = ["test@example.com", "jo@jo.co", "f4$_m@you.com", "testing.example@example.com.ua", "test@tt", "test@valid---domain.com"]
100
+ non_valid_emails = ["rex", "test user@example.com", "test_user@example server.com"]
86
101
 
87
102
  valid_emails.each do |email|
88
103
  assert_match Devise.email_regexp, email