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
@@ -1,14 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SharedAdmin
2
4
  extend ActiveSupport::Concern
3
5
 
4
6
  included do
5
7
  devise :database_authenticatable, :registerable,
6
8
  :timeoutable, :recoverable, :lockable, :confirmable,
7
- :unlock_strategy => :time, :lock_strategy => :none,
8
- :allow_unconfirmed_access_for => 2.weeks, :reconfirmable => true
9
+ unlock_strategy: :time, lock_strategy: :none,
10
+ allow_unconfirmed_access_for: 2.weeks, reconfirmable: true
9
11
 
10
- validates_length_of :reset_password_token, :minimum => 3, :allow_blank => true
11
- validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed?
12
+ validates_length_of :reset_password_token, minimum: 3, allow_blank: true
13
+ if Devise::Test.rails51?
14
+ validates_uniqueness_of :email, allow_blank: true, if: :will_save_change_to_email?
15
+ else
16
+ validates_uniqueness_of :email, allow_blank: true, if: :email_changed?
17
+ end
12
18
  end
13
19
 
14
20
  def raw_confirmation_token
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SharedUser
2
4
  extend ActiveSupport::Concern
3
5
 
4
6
  included do
5
7
  devise :database_authenticatable, :confirmable, :lockable, :recoverable,
6
8
  :registerable, :rememberable, :timeoutable,
7
- :trackable, :validatable, :omniauthable
9
+ :trackable, :validatable, :omniauthable, password_length: 7..72,
10
+ reconfirmable: false
8
11
 
9
12
  attr_accessor :other_key
10
13
 
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SharedUserWithoutEmail
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # NOTE: This is missing :validatable and :confirmable, as they both require
8
+ # an email field at the moment. It is also missing :omniauthable because that
9
+ # adds unnecessary complexity to the setup
10
+ devise :database_authenticatable, :lockable, :recoverable,
11
+ :registerable, :rememberable, :timeoutable,
12
+ :trackable
13
+ end
14
+
15
+ # This test stub is a bit rubbish because it's tied very closely to the
16
+ # implementation where we care about this one case. However, completely
17
+ # removing the email field breaks "recoverable" tests completely, so we are
18
+ # just taking the approach here that "email" is something that is a not an
19
+ # ActiveRecord field.
20
+ def email_changed?
21
+ raise NoMethodError
22
+ end
23
+
24
+ def respond_to?(method_name, include_all=false)
25
+ return false if method_name.to_sym == :email_changed?
26
+ super(method_name, include_all)
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SharedUserWithoutOmniauth
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ devise :database_authenticatable, :confirmable, :lockable, :recoverable,
8
+ :registerable, :rememberable, :timeoutable,
9
+ :trackable, :validatable, reconfirmable: false
10
+ end
11
+
12
+ def raw_confirmation_token
13
+ @raw_confirmation_token
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class RailsTest < ActiveSupport::TestCase
6
+ test 'correct initializer position' do
7
+ initializer = Devise::Engine.initializers.detect { |i| i.name == 'devise.omniauth' }
8
+ assert_equal :load_config_initializers, initializer.after
9
+ assert_equal :build_middleware_stack, initializer.before
10
+ end
11
+ end
@@ -1,110 +1,112 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- ExpectedRoutingError = Devise.rails4? ? MiniTest::Assertion : ActionController::RoutingError
5
+ ExpectedRoutingError = MiniTest::Assertion
4
6
 
5
7
  class DefaultRoutingTest < ActionController::TestCase
6
8
  test 'map new user session' do
7
- assert_recognizes({:controller => 'devise/sessions', :action => 'new'}, {:path => 'users/sign_in', :method => :get})
9
+ assert_recognizes({controller: 'devise/sessions', action: 'new'}, {path: 'users/sign_in', method: :get})
8
10
  assert_named_route "/users/sign_in", :new_user_session_path
9
11
  end
10
12
 
11
13
  test 'map create user session' do
12
- assert_recognizes({:controller => 'devise/sessions', :action => 'create'}, {:path => 'users/sign_in', :method => :post})
14
+ assert_recognizes({controller: 'devise/sessions', action: 'create'}, {path: 'users/sign_in', method: :post})
13
15
  assert_named_route "/users/sign_in", :user_session_path
14
16
  end
15
17
 
16
18
  test 'map destroy user session' do
17
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => 'users/sign_out', :method => :get})
19
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: 'users/sign_out', method: :delete})
18
20
  assert_named_route "/users/sign_out", :destroy_user_session_path
19
21
  end
20
22
 
21
23
  test 'map new user confirmation' do
22
- assert_recognizes({:controller => 'devise/confirmations', :action => 'new'}, 'users/confirmation/new')
24
+ assert_recognizes({controller: 'devise/confirmations', action: 'new'}, 'users/confirmation/new')
23
25
  assert_named_route "/users/confirmation/new", :new_user_confirmation_path
24
26
  end
25
27
 
26
28
  test 'map create user confirmation' do
27
- assert_recognizes({:controller => 'devise/confirmations', :action => 'create'}, {:path => 'users/confirmation', :method => :post})
29
+ assert_recognizes({controller: 'devise/confirmations', action: 'create'}, {path: 'users/confirmation', method: :post})
28
30
  assert_named_route "/users/confirmation", :user_confirmation_path
29
31
  end
30
32
 
31
33
  test 'map show user confirmation' do
32
- assert_recognizes({:controller => 'devise/confirmations', :action => 'show'}, {:path => 'users/confirmation', :method => :get})
34
+ assert_recognizes({controller: 'devise/confirmations', action: 'show'}, {path: 'users/confirmation', method: :get})
33
35
  end
34
36
 
35
37
  test 'map new user password' do
36
- assert_recognizes({:controller => 'devise/passwords', :action => 'new'}, 'users/password/new')
38
+ assert_recognizes({controller: 'devise/passwords', action: 'new'}, 'users/password/new')
37
39
  assert_named_route "/users/password/new", :new_user_password_path
38
40
  end
39
41
 
40
42
  test 'map create user password' do
41
- assert_recognizes({:controller => 'devise/passwords', :action => 'create'}, {:path => 'users/password', :method => :post})
43
+ assert_recognizes({controller: 'devise/passwords', action: 'create'}, {path: 'users/password', method: :post})
42
44
  assert_named_route "/users/password", :user_password_path
43
45
  end
44
46
 
45
47
  test 'map edit user password' do
46
- assert_recognizes({:controller => 'devise/passwords', :action => 'edit'}, 'users/password/edit')
48
+ assert_recognizes({controller: 'devise/passwords', action: 'edit'}, 'users/password/edit')
47
49
  assert_named_route "/users/password/edit", :edit_user_password_path
48
50
  end
49
51
 
50
52
  test 'map update user password' do
51
- assert_recognizes({:controller => 'devise/passwords', :action => 'update'}, {:path => 'users/password', :method => :put})
53
+ assert_recognizes({controller: 'devise/passwords', action: 'update'}, {path: 'users/password', method: :put})
52
54
  end
53
55
 
54
56
  test 'map new user unlock' do
55
- assert_recognizes({:controller => 'devise/unlocks', :action => 'new'}, 'users/unlock/new')
57
+ assert_recognizes({controller: 'devise/unlocks', action: 'new'}, 'users/unlock/new')
56
58
  assert_named_route "/users/unlock/new", :new_user_unlock_path
57
59
  end
58
60
 
59
61
  test 'map create user unlock' do
60
- assert_recognizes({:controller => 'devise/unlocks', :action => 'create'}, {:path => 'users/unlock', :method => :post})
62
+ assert_recognizes({controller: 'devise/unlocks', action: 'create'}, {path: 'users/unlock', method: :post})
61
63
  assert_named_route "/users/unlock", :user_unlock_path
62
64
  end
63
65
 
64
66
  test 'map show user unlock' do
65
- assert_recognizes({:controller => 'devise/unlocks', :action => 'show'}, {:path => 'users/unlock', :method => :get})
67
+ assert_recognizes({controller: 'devise/unlocks', action: 'show'}, {path: 'users/unlock', method: :get})
66
68
  end
67
69
 
68
70
  test 'map new user registration' do
69
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, 'users/sign_up')
71
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, 'users/sign_up')
70
72
  assert_named_route "/users/sign_up", :new_user_registration_path
71
73
  end
72
74
 
73
75
  test 'map create user registration' do
74
- assert_recognizes({:controller => 'devise/registrations', :action => 'create'}, {:path => 'users', :method => :post})
76
+ assert_recognizes({controller: 'devise/registrations', action: 'create'}, {path: 'users', method: :post})
75
77
  assert_named_route "/users", :user_registration_path
76
78
  end
77
79
 
78
80
  test 'map edit user registration' do
79
- assert_recognizes({:controller => 'devise/registrations', :action => 'edit'}, {:path => 'users/edit', :method => :get})
81
+ assert_recognizes({controller: 'devise/registrations', action: 'edit'}, {path: 'users/edit', method: :get})
80
82
  assert_named_route "/users/edit", :edit_user_registration_path
81
83
  end
82
84
 
83
85
  test 'map update user registration' do
84
- assert_recognizes({:controller => 'devise/registrations', :action => 'update'}, {:path => 'users', :method => :put})
86
+ assert_recognizes({controller: 'devise/registrations', action: 'update'}, {path: 'users', method: :put})
85
87
  end
86
88
 
87
89
  test 'map destroy user registration' do
88
- assert_recognizes({:controller => 'devise/registrations', :action => 'destroy'}, {:path => 'users', :method => :delete})
90
+ assert_recognizes({controller: 'devise/registrations', action: 'destroy'}, {path: 'users', method: :delete})
89
91
  end
90
92
 
91
93
  test 'map cancel user registration' do
92
- assert_recognizes({:controller => 'devise/registrations', :action => 'cancel'}, {:path => 'users/cancel', :method => :get})
94
+ assert_recognizes({controller: 'devise/registrations', action: 'cancel'}, {path: 'users/cancel', method: :get})
93
95
  assert_named_route "/users/cancel", :cancel_user_registration_path
94
96
  end
95
97
 
96
98
  test 'map omniauth callbacks' do
97
- assert_recognizes({:controller => 'users/omniauth_callbacks', :action => 'facebook'}, {:path => 'users/auth/facebook/callback', :method => :get})
98
- assert_recognizes({:controller => 'users/omniauth_callbacks', :action => 'facebook'}, {:path => 'users/auth/facebook/callback', :method => :post})
99
- assert_named_route "/users/auth/facebook/callback", :user_omniauth_callback_path, :facebook
99
+ assert_recognizes({controller: 'users/omniauth_callbacks', action: 'facebook'}, {path: 'users/auth/facebook/callback', method: :get})
100
+ assert_recognizes({controller: 'users/omniauth_callbacks', action: 'facebook'}, {path: 'users/auth/facebook/callback', method: :post})
101
+ assert_named_route "/users/auth/facebook/callback", :user_facebook_omniauth_callback_path
100
102
 
101
103
  # named open_id
102
- assert_recognizes({:controller => 'users/omniauth_callbacks', :action => 'google'}, {:path => 'users/auth/google/callback', :method => :get})
103
- assert_recognizes({:controller => 'users/omniauth_callbacks', :action => 'google'}, {:path => 'users/auth/google/callback', :method => :post})
104
- assert_named_route "/users/auth/google/callback", :user_omniauth_callback_path, :google
104
+ assert_recognizes({controller: 'users/omniauth_callbacks', action: 'google'}, {path: 'users/auth/google/callback', method: :get})
105
+ assert_recognizes({controller: 'users/omniauth_callbacks', action: 'google'}, {path: 'users/auth/google/callback', method: :post})
106
+ assert_named_route "/users/auth/google/callback", :user_google_omniauth_callback_path
105
107
 
106
108
  assert_raise ExpectedRoutingError do
107
- assert_recognizes({:controller => 'ysers/omniauth_callbacks', :action => 'twitter'}, {:path => 'users/auth/twitter/callback', :method => :get})
109
+ assert_recognizes({controller: 'ysers/omniauth_callbacks', action: 'twitter'}, {path: 'users/auth/twitter/callback', method: :get})
108
110
  end
109
111
  end
110
112
 
@@ -117,134 +119,163 @@ end
117
119
 
118
120
  class CustomizedRoutingTest < ActionController::TestCase
119
121
  test 'map admin with :path option' do
120
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => 'admin_area/sign_up', :method => :get})
122
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, {path: 'admin_area/sign_up', method: :get})
121
123
  end
122
124
 
123
125
  test 'map admin with :controllers option' do
124
- assert_recognizes({:controller => 'admins/sessions', :action => 'new'}, {:path => 'admin_area/sign_in', :method => :get})
126
+ assert_recognizes({controller: 'admins/sessions', action: 'new'}, {path: 'admin_area/sign_in', method: :get})
125
127
  end
126
128
 
127
129
  test 'does not map admin password' do
128
130
  assert_raise ExpectedRoutingError do
129
- assert_recognizes({:controller => 'devise/passwords', :action => 'new'}, 'admin_area/password/new')
131
+ assert_recognizes({controller: 'devise/passwords', action: 'new'}, 'admin_area/password/new')
130
132
  end
131
133
  end
132
134
 
133
135
  test 'subdomain admin' do
134
- assert_recognizes({"host"=>"sub.example.com", :controller => 'devise/sessions', :action => 'new'}, {:host => "sub.example.com", :path => '/sub_admin/sign_in', :method => :get})
136
+ assert_recognizes({"host"=>"sub.example.com", controller: 'devise/sessions', action: 'new'}, {host: "sub.example.com", path: '/sub_admin/sign_in', method: :get})
135
137
  end
136
138
 
137
139
  test 'does only map reader password' do
138
140
  assert_raise ExpectedRoutingError do
139
- assert_recognizes({:controller => 'devise/sessions', :action => 'new'}, 'reader/sessions/new')
141
+ assert_recognizes({controller: 'devise/sessions', action: 'new'}, 'reader/sessions/new')
140
142
  end
141
- assert_recognizes({:controller => 'devise/passwords', :action => 'new'}, 'reader/password/new')
143
+ assert_recognizes({controller: 'devise/passwords', action: 'new'}, 'reader/password/new')
142
144
  end
143
145
 
144
146
  test 'map account with custom path name for session sign in' do
145
- assert_recognizes({:controller => 'devise/sessions', :action => 'new', :locale => 'en'}, '/en/accounts/login')
147
+ assert_recognizes({controller: 'devise/sessions', action: 'new', locale: 'en'}, '/en/accounts/login')
146
148
  end
147
149
 
148
150
  test 'map account with custom path name for session sign out' do
149
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy', :locale => 'en'}, '/en/accounts/logout')
151
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy', locale: 'en'}, {path: '/en/accounts/logout', method: :delete })
150
152
  end
151
153
 
152
154
  test 'map account with custom path name for password' do
153
- assert_recognizes({:controller => 'devise/passwords', :action => 'new', :locale => 'en'}, '/en/accounts/secret/new')
155
+ assert_recognizes({controller: 'devise/passwords', action: 'new', locale: 'en'}, '/en/accounts/secret/new')
154
156
  end
155
157
 
156
158
  test 'map account with custom path name for registration' do
157
- assert_recognizes({:controller => 'devise/registrations', :action => 'new', :locale => 'en'}, '/en/accounts/management/register')
159
+ assert_recognizes({controller: 'devise/registrations', action: 'new', locale: 'en'}, '/en/accounts/management/register')
160
+ end
161
+
162
+ test 'map account with custom path name for edit registration' do
163
+ assert_recognizes({controller: 'devise/registrations', action: 'edit', locale: 'en'}, '/en/accounts/management/edit/profile')
158
164
  end
159
165
 
160
166
  test 'map account with custom path name for cancel registration' do
161
- assert_recognizes({:controller => 'devise/registrations', :action => 'cancel', :locale => 'en'}, '/en/accounts/management/giveup')
167
+ assert_recognizes({controller: 'devise/registrations', action: 'cancel', locale: 'en'}, '/en/accounts/management/giveup')
162
168
  end
163
169
 
164
170
  test 'map deletes with :sign_out_via option' do
165
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/deletes/sign_out', :method => :delete})
171
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/deletes/sign_out', method: :delete})
166
172
  assert_raise ExpectedRoutingError do
167
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/deletes/sign_out', :method => :get})
173
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/deletes/sign_out', method: :get})
168
174
  end
169
175
  end
170
176
 
171
177
  test 'map posts with :sign_out_via option' do
172
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/posts/sign_out', :method => :post})
178
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/posts/sign_out', method: :post})
173
179
  assert_raise ExpectedRoutingError do
174
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/posts/sign_out', :method => :get})
180
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/posts/sign_out', method: :get})
175
181
  end
176
182
  end
177
183
 
178
184
  test 'map delete_or_posts with :sign_out_via option' do
179
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/delete_or_posts/sign_out', :method => :post})
180
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/delete_or_posts/sign_out', :method => :delete})
185
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/delete_or_posts/sign_out', method: :post})
186
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/delete_or_posts/sign_out', method: :delete})
181
187
  assert_raise ExpectedRoutingError do
182
- assert_recognizes({:controller => 'devise/sessions', :action => 'destroy'}, {:path => '/sign_out_via/delete_or_posts/sign_out', :method => :get})
188
+ assert_recognizes({controller: 'devise/sessions', action: 'destroy'}, {path: '/sign_out_via/delete_or_posts/sign_out', method: :get})
183
189
  end
184
190
  end
185
191
 
186
192
  test 'map with constraints defined in hash' do
187
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => 'http://192.168.1.100/headquarters/sign_up', :method => :get})
193
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, {path: 'http://192.168.1.100/headquarters/sign_up', method: :get})
188
194
  assert_raise ExpectedRoutingError do
189
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => 'http://10.0.0.100/headquarters/sign_up', :method => :get})
195
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, {path: 'http://10.0.0.100/headquarters/sign_up', method: :get})
190
196
  end
191
197
  end
192
198
 
193
199
  test 'map with constraints defined in block' do
194
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => 'http://192.168.1.100/homebase/sign_up', :method => :get})
200
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, {path: 'http://192.168.1.100/homebase/sign_up', method: :get})
195
201
  assert_raise ExpectedRoutingError do
196
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => 'http://10.0.0.100//homebase/sign_up', :method => :get})
202
+ assert_recognizes({controller: 'devise/registrations', action: 'new'}, {path: 'http://10.0.0.100//homebase/sign_up', method: :get})
197
203
  end
198
204
  end
199
205
 
200
206
  test 'map with format false for sessions' do
201
- assert_recognizes({:controller => 'devise/sessions', :action => 'new'}, {:path => '/htmlonly_admin/sign_in', :method => :get})
207
+ expected_params = {controller: 'devise/sessions', action: 'new'}
208
+ expected_params[:format] = false if Devise::Test.rails5?
209
+
210
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/sign_in', method: :get})
202
211
  assert_raise ExpectedRoutingError do
203
- assert_recognizes({:controller => 'devise/sessions', :action => 'new'}, {:path => '/htmlonly_admin/sign_in.xml', :method => :get})
212
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/sign_in.xml', method: :get})
204
213
  end
205
214
  end
206
215
 
207
216
  test 'map with format false for passwords' do
208
- assert_recognizes({:controller => 'devise/passwords', :action => 'create'}, {:path => '/htmlonly_admin/password', :method => :post})
217
+ expected_params = {controller: 'devise/passwords', action: 'create'}
218
+ expected_params[:format] = false if Devise::Test.rails5?
219
+
220
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/password', method: :post})
209
221
  assert_raise ExpectedRoutingError do
210
- assert_recognizes({:controller => 'devise/passwords', :action => 'create'}, {:path => '/htmlonly_admin/password.xml', :method => :post})
222
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/password.xml', method: :post})
211
223
  end
212
224
  end
213
225
 
214
226
  test 'map with format false for registrations' do
215
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => '/htmlonly_admin/sign_up', :method => :get})
227
+ expected_params = {controller: 'devise/registrations', action: 'new'}
228
+ expected_params[:format] = false if Devise::Test.rails5?
229
+
230
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/sign_up', method: :get})
216
231
  assert_raise ExpectedRoutingError do
217
- assert_recognizes({:controller => 'devise/registrations', :action => 'new'}, {:path => '/htmlonly_admin/sign_up.xml', :method => :get})
232
+ assert_recognizes(expected_params, {path: '/htmlonly_admin/sign_up.xml', method: :get})
218
233
  end
219
234
  end
220
235
 
221
236
  test 'map with format false for confirmations' do
222
- assert_recognizes({:controller => 'devise/confirmations', :action => 'show'}, {:path => '/htmlonly_users/confirmation', :method => :get})
237
+ expected_params = {controller: 'devise/confirmations', action: 'show'}
238
+ expected_params[:format] = false if Devise::Test.rails5?
239
+
240
+ assert_recognizes(expected_params, {path: '/htmlonly_users/confirmation', method: :get})
223
241
  assert_raise ExpectedRoutingError do
224
- assert_recognizes({:controller => 'devise/confirmations', :action => 'show'}, {:path => '/htmlonly_users/confirmation.xml', :method => :get})
242
+ assert_recognizes(expected_params, {path: '/htmlonly_users/confirmation.xml', method: :get})
225
243
  end
226
244
  end
227
245
 
228
246
  test 'map with format false for unlocks' do
229
- assert_recognizes({:controller => 'devise/unlocks', :action => 'show'}, {:path => '/htmlonly_users/unlock', :method => :get})
247
+ expected_params = {controller: 'devise/unlocks', action: 'show'}
248
+ expected_params[:format] = false if Devise::Test.rails5?
249
+
250
+ assert_recognizes(expected_params, {path: '/htmlonly_users/unlock', method: :get})
230
251
  assert_raise ExpectedRoutingError do
231
- assert_recognizes({:controller => 'devise/unlocks', :action => 'show'}, {:path => '/htmlonly_users/unlock.xml', :method => :get})
252
+ assert_recognizes(expected_params, {path: '/htmlonly_users/unlock.xml', method: :get})
232
253
  end
233
254
  end
234
255
 
235
256
  test 'map with format false is not permanent' do
236
257
  assert_equal "/set.xml", @routes.url_helpers.set_path(:xml)
237
258
  end
259
+
260
+ test 'checks if mapping has proper configuration for omniauth callback' do
261
+ e = assert_raise ArgumentError do
262
+ routes = ActionDispatch::Routing::RouteSet.new
263
+ routes.draw do
264
+ devise_for :not_omniauthable, class_name: 'Admin', controllers: {omniauth_callbacks: "users/omniauth_callbacks"}
265
+ end
266
+ end
267
+ assert_match "Mapping omniauth_callbacks on a resource that is not omniauthable", e.message
268
+ end
238
269
  end
239
270
 
240
271
  class ScopedRoutingTest < ActionController::TestCase
241
272
  test 'map publisher account' do
242
- assert_recognizes({:controller => 'publisher/registrations', :action => 'new'}, {:path => '/publisher/accounts/sign_up', :method => :get})
273
+ assert_recognizes({controller: 'publisher/registrations', action: 'new'}, {path: '/publisher/accounts/sign_up', method: :get})
243
274
  assert_equal '/publisher/accounts/sign_up', @routes.url_helpers.new_publisher_account_registration_path
244
275
  end
245
276
 
246
277
  test 'map publisher account merges path names' do
247
- assert_recognizes({:controller => 'publisher/sessions', :action => 'new'}, {:path => '/publisher/accounts/get_in', :method => :get})
278
+ assert_recognizes({controller: 'publisher/sessions', action: 'new'}, {path: '/publisher/accounts/get_in', method: :get})
248
279
  assert_equal '/publisher/accounts/get_in', @routes.url_helpers.new_publisher_account_session_path
249
280
  end
250
281
  end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class Rails52Credentials
6
+ def credentials
7
+ OpenStruct.new(secret_key_base: 'credentials')
8
+ end
9
+ end
10
+
11
+ class Rails52Secrets
12
+ def credentials
13
+ OpenStruct.new(secret_key_base: nil)
14
+ end
15
+
16
+ def secrets
17
+ OpenStruct.new(secret_key_base: 'secrets')
18
+ end
19
+ end
20
+
21
+ class Rails52Config
22
+ def credentials
23
+ OpenStruct.new(secret_key_base: nil)
24
+ end
25
+
26
+ def secrets
27
+ OpenStruct.new(secret_key_base: nil)
28
+ end
29
+
30
+ def config
31
+ OpenStruct.new(secret_key_base: 'config')
32
+ end
33
+ end
34
+
35
+ class Rails41Secrets
36
+ def secrets
37
+ OpenStruct.new(secret_key_base: 'secrets')
38
+ end
39
+
40
+ def config
41
+ OpenStruct.new(secret_key_base: nil)
42
+ end
43
+ end
44
+
45
+ class Rails41Config
46
+ def secrets
47
+ OpenStruct.new(secret_key_base: nil)
48
+ end
49
+
50
+ def config
51
+ OpenStruct.new(secret_key_base: 'config')
52
+ end
53
+ end
54
+
55
+ class Rails40Config
56
+ def config
57
+ OpenStruct.new(secret_key_base: 'config')
58
+ end
59
+ end
60
+
61
+ class SecretKeyFinderTest < ActiveSupport::TestCase
62
+ test "rails 5.2 uses credentials when they're available" do
63
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails52Credentials.new)
64
+
65
+ assert_equal 'credentials', secret_key_finder.find
66
+ end
67
+
68
+ test "rails 5.2 uses secrets when credentials are empty" do
69
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails52Secrets.new)
70
+
71
+ assert_equal 'secrets', secret_key_finder.find
72
+ end
73
+
74
+ test "rails 5.2 uses config when secrets are empty" do
75
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails52Config.new)
76
+
77
+ assert_equal 'config', secret_key_finder.find
78
+ end
79
+
80
+ test "rails 4.1 uses secrets" do
81
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails41Secrets.new)
82
+
83
+ assert_equal 'secrets', secret_key_finder.find
84
+ end
85
+
86
+ test "rails 4.1 uses config when secrets are empty" do
87
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails41Config.new)
88
+
89
+ assert_equal 'config', secret_key_finder.find
90
+ end
91
+
92
+ test "rails 4.0 uses config" do
93
+ secret_key_finder = Devise::SecretKeyFinder.new(Rails40Config.new)
94
+
95
+ assert_equal 'config', secret_key_finder.find
96
+ end
97
+ end