devise 4.2.0 → 4.4.3

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.

Potentially problematic release.


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

Files changed (225) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +27 -5
  3. data/CHANGELOG.md +65 -0
  4. data/CONTRIBUTING.md +68 -28
  5. data/Gemfile +3 -1
  6. data/Gemfile.lock +79 -83
  7. data/ISSUE_TEMPLATE.md +19 -0
  8. data/MIT-LICENSE +1 -1
  9. data/README.md +108 -11
  10. data/Rakefile +1 -0
  11. data/app/controllers/devise/confirmations_controller.rb +2 -0
  12. data/app/controllers/devise/omniauth_callbacks_controller.rb +4 -2
  13. data/app/controllers/devise/passwords_controller.rb +2 -0
  14. data/app/controllers/devise/registrations_controller.rb +6 -3
  15. data/app/controllers/devise/sessions_controller.rb +3 -1
  16. data/app/controllers/devise/unlocks_controller.rb +2 -0
  17. data/app/controllers/devise_controller.rb +2 -0
  18. data/app/helpers/devise_helper.rb +2 -0
  19. data/app/mailers/devise/mailer.rb +6 -0
  20. data/app/views/devise/confirmations/new.html.erb +1 -1
  21. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  22. data/app/views/devise/passwords/new.html.erb +1 -1
  23. data/app/views/devise/registrations/edit.html.erb +1 -1
  24. data/app/views/devise/registrations/new.html.erb +1 -1
  25. data/app/views/devise/sessions/new.html.erb +1 -1
  26. data/app/views/devise/unlocks/new.html.erb +1 -1
  27. data/config/locales/en.yml +2 -0
  28. data/devise.gemspec +3 -1
  29. data/gemfiles/Gemfile.rails-4.1-stable +3 -1
  30. data/gemfiles/Gemfile.rails-4.1-stable.lock +67 -70
  31. data/gemfiles/Gemfile.rails-4.2-stable +3 -1
  32. data/gemfiles/Gemfile.rails-4.2-stable.lock +69 -73
  33. data/gemfiles/Gemfile.rails-5.0-stable +33 -0
  34. data/gemfiles/Gemfile.rails-5.0-stable.lock +192 -0
  35. data/gemfiles/Gemfile.rails-5.2-rc1 +26 -0
  36. data/gemfiles/Gemfile.rails-5.2-rc1.lock +201 -0
  37. data/guides/bug_report_templates/integration_test.rb +2 -0
  38. data/lib/devise/controllers/helpers.rb +2 -0
  39. data/lib/devise/controllers/rememberable.rb +2 -0
  40. data/lib/devise/controllers/scoped_views.rb +2 -0
  41. data/lib/devise/controllers/sign_in_out.rb +6 -1
  42. data/lib/devise/controllers/store_location.rb +25 -7
  43. data/lib/devise/controllers/url_helpers.rb +2 -0
  44. data/lib/devise/delegator.rb +2 -0
  45. data/lib/devise/encryptor.rb +2 -0
  46. data/lib/devise/failure_app.rb +14 -12
  47. data/lib/devise/hooks/activatable.rb +2 -0
  48. data/lib/devise/hooks/csrf_cleaner.rb +2 -0
  49. data/lib/devise/hooks/forgetable.rb +2 -0
  50. data/lib/devise/hooks/lockable.rb +6 -1
  51. data/lib/devise/hooks/proxy.rb +2 -0
  52. data/lib/devise/hooks/rememberable.rb +2 -0
  53. data/lib/devise/hooks/timeoutable.rb +2 -0
  54. data/lib/devise/hooks/trackable.rb +2 -0
  55. data/lib/devise/mailers/helpers.rb +6 -3
  56. data/lib/devise/mapping.rb +2 -0
  57. data/lib/devise/models/authenticatable.rb +4 -2
  58. data/lib/devise/models/confirmable.rb +53 -17
  59. data/lib/devise/models/database_authenticatable.rb +40 -4
  60. data/lib/devise/models/lockable.rb +8 -2
  61. data/lib/devise/models/omniauthable.rb +2 -0
  62. data/lib/devise/models/recoverable.rb +26 -9
  63. data/lib/devise/models/registerable.rb +2 -0
  64. data/lib/devise/models/rememberable.rb +4 -2
  65. data/lib/devise/models/timeoutable.rb +2 -0
  66. data/lib/devise/models/trackable.rb +7 -0
  67. data/lib/devise/models/validatable.rb +10 -3
  68. data/lib/devise/models.rb +3 -1
  69. data/lib/devise/modules.rb +2 -0
  70. data/lib/devise/omniauth/config.rb +2 -0
  71. data/lib/devise/omniauth/url_helpers.rb +2 -0
  72. data/lib/devise/omniauth.rb +2 -0
  73. data/lib/devise/orm/active_record.rb +2 -0
  74. data/lib/devise/orm/mongoid.rb +2 -0
  75. data/lib/devise/parameter_filter.rb +2 -0
  76. data/lib/devise/parameter_sanitizer.rb +2 -0
  77. data/lib/devise/rails/routes.rb +3 -1
  78. data/lib/devise/rails/warden_compat.rb +2 -0
  79. data/lib/devise/rails.rb +3 -5
  80. data/lib/devise/secret_key_finder.rb +25 -0
  81. data/lib/devise/strategies/authenticatable.rb +2 -0
  82. data/lib/devise/strategies/base.rb +2 -0
  83. data/lib/devise/strategies/database_authenticatable.rb +2 -0
  84. data/lib/devise/strategies/rememberable.rb +2 -0
  85. data/lib/devise/test/controller_helpers.rb +4 -1
  86. data/lib/devise/test/integration_helpers.rb +2 -0
  87. data/lib/devise/test_helpers.rb +3 -1
  88. data/lib/devise/time_inflector.rb +2 -0
  89. data/lib/devise/token_generator.rb +2 -0
  90. data/lib/devise/version.rb +3 -1
  91. data/lib/devise.rb +17 -2
  92. data/lib/generators/active_record/devise_generator.rb +15 -2
  93. data/lib/generators/active_record/templates/migration.rb +3 -1
  94. data/lib/generators/active_record/templates/migration_existing.rb +2 -0
  95. data/lib/generators/devise/controllers_generator.rb +2 -0
  96. data/lib/generators/devise/devise_generator.rb +4 -2
  97. data/lib/generators/devise/install_generator.rb +2 -0
  98. data/lib/generators/devise/orm_helpers.rb +7 -1
  99. data/lib/generators/devise/views_generator.rb +7 -8
  100. data/lib/generators/mongoid/devise_generator.rb +2 -0
  101. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  102. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +2 -0
  103. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  104. data/lib/generators/templates/controllers/registrations_controller.rb +4 -2
  105. data/lib/generators/templates/controllers/sessions_controller.rb +3 -1
  106. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  107. data/lib/generators/templates/devise.rb +10 -1
  108. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  109. data/lib/generators/templates/markerb/password_change.markerb +2 -2
  110. data/test/controllers/custom_registrations_controller_test.rb +2 -0
  111. data/test/controllers/custom_strategy_test.rb +2 -0
  112. data/test/controllers/helper_methods_test.rb +2 -0
  113. data/test/controllers/helpers_test.rb +5 -3
  114. data/test/controllers/inherited_controller_i18n_messages_test.rb +2 -0
  115. data/test/controllers/internal_helpers_test.rb +2 -0
  116. data/test/controllers/load_hooks_controller_test.rb +2 -0
  117. data/test/controllers/passwords_controller_test.rb +2 -0
  118. data/test/controllers/sessions_controller_test.rb +2 -0
  119. data/test/controllers/url_helpers_test.rb +2 -0
  120. data/test/delegator_test.rb +2 -0
  121. data/test/devise_test.rb +2 -0
  122. data/test/failure_app_test.rb +2 -0
  123. data/test/generators/active_record_generator_test.rb +47 -0
  124. data/test/generators/controllers_generator_test.rb +2 -0
  125. data/test/generators/devise_generator_test.rb +2 -0
  126. data/test/generators/install_generator_test.rb +2 -0
  127. data/test/generators/mongoid_generator_test.rb +2 -0
  128. data/test/generators/views_generator_test.rb +2 -0
  129. data/test/helpers/devise_helper_test.rb +2 -0
  130. data/test/integration/authenticatable_test.rb +10 -2
  131. data/test/integration/confirmable_test.rb +2 -0
  132. data/test/integration/database_authenticatable_test.rb +2 -0
  133. data/test/integration/http_authenticatable_test.rb +8 -0
  134. data/test/integration/lockable_test.rb +5 -3
  135. data/test/integration/mounted_engine_test.rb +2 -0
  136. data/test/integration/omniauthable_test.rb +13 -0
  137. data/test/integration/recoverable_test.rb +2 -0
  138. data/test/integration/registerable_test.rb +2 -0
  139. data/test/integration/rememberable_test.rb +9 -1
  140. data/test/integration/timeoutable_test.rb +2 -0
  141. data/test/integration/trackable_test.rb +7 -0
  142. data/test/mailers/confirmation_instructions_test.rb +2 -0
  143. data/test/mailers/email_changed_test.rb +132 -0
  144. data/test/mailers/mailer_test.rb +20 -0
  145. data/test/mailers/reset_password_instructions_test.rb +2 -0
  146. data/test/mailers/unlock_instructions_test.rb +2 -0
  147. data/test/mapping_test.rb +2 -0
  148. data/test/models/authenticatable_test.rb +2 -0
  149. data/test/models/confirmable_test.rb +30 -0
  150. data/test/models/database_authenticatable_test.rb +15 -1
  151. data/test/models/lockable_test.rb +2 -0
  152. data/test/models/omniauthable_test.rb +2 -0
  153. data/test/models/recoverable_test.rb +13 -1
  154. data/test/models/registerable_test.rb +2 -0
  155. data/test/models/rememberable_test.rb +2 -0
  156. data/test/models/serializable_test.rb +6 -0
  157. data/test/models/timeoutable_test.rb +2 -0
  158. data/test/models/trackable_test.rb +21 -0
  159. data/test/models/validatable_test.rb +4 -2
  160. data/test/models_test.rb +2 -0
  161. data/test/omniauth/config_test.rb +11 -7
  162. data/test/omniauth/url_helpers_test.rb +2 -0
  163. data/test/orm/active_record.rb +9 -2
  164. data/test/orm/mongoid.rb +3 -1
  165. data/test/parameter_sanitizer_test.rb +2 -0
  166. data/test/rails_app/app/active_record/admin.rb +2 -0
  167. data/test/rails_app/app/active_record/shim.rb +2 -0
  168. data/test/rails_app/app/active_record/user.rb +14 -1
  169. data/test/rails_app/app/active_record/user_on_engine.rb +2 -0
  170. data/test/rails_app/app/active_record/user_on_main_app.rb +2 -0
  171. data/test/rails_app/app/active_record/user_with_validations.rb +12 -0
  172. data/test/rails_app/app/active_record/user_without_email.rb +2 -0
  173. data/test/rails_app/app/controllers/admins/sessions_controller.rb +2 -0
  174. data/test/rails_app/app/controllers/admins_controller.rb +2 -0
  175. data/test/rails_app/app/controllers/application_controller.rb +2 -0
  176. data/test/rails_app/app/controllers/application_with_fake_engine.rb +2 -0
  177. data/test/rails_app/app/controllers/custom/registrations_controller.rb +2 -0
  178. data/test/rails_app/app/controllers/home_controller.rb +3 -1
  179. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  180. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  181. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +3 -1
  182. data/test/rails_app/app/controllers/users_controller.rb +5 -3
  183. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  184. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +2 -0
  185. data/test/rails_app/app/mailers/users/mailer.rb +2 -0
  186. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +2 -0
  187. data/test/rails_app/app/mongoid/admin.rb +2 -0
  188. data/test/rails_app/app/mongoid/shim.rb +2 -0
  189. data/test/rails_app/app/mongoid/user.rb +11 -0
  190. data/test/rails_app/app/mongoid/user_on_engine.rb +2 -0
  191. data/test/rails_app/app/mongoid/user_on_main_app.rb +2 -0
  192. data/test/rails_app/app/mongoid/user_with_validations.rb +37 -0
  193. data/test/rails_app/app/mongoid/user_without_email.rb +2 -0
  194. data/test/rails_app/config/application.rb +6 -2
  195. data/test/rails_app/config/boot.rb +16 -3
  196. data/test/rails_app/config/environment.rb +2 -0
  197. data/test/rails_app/config/environments/development.rb +2 -0
  198. data/test/rails_app/config/environments/production.rb +2 -0
  199. data/test/rails_app/config/environments/test.rb +2 -0
  200. data/test/rails_app/config/initializers/backtrace_silencers.rb +2 -0
  201. data/test/rails_app/config/initializers/devise.rb +2 -0
  202. data/test/rails_app/config/initializers/inflections.rb +2 -0
  203. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  204. data/test/rails_app/config/initializers/session_store.rb +2 -0
  205. data/test/rails_app/config/routes.rb +2 -0
  206. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +2 -0
  207. data/test/rails_app/db/schema.rb +2 -0
  208. data/test/rails_app/lib/shared_admin.rb +7 -1
  209. data/test/rails_app/lib/shared_user.rb +2 -0
  210. data/test/rails_app/lib/shared_user_without_email.rb +2 -0
  211. data/test/rails_app/lib/shared_user_without_omniauth.rb +2 -0
  212. data/test/rails_test.rb +2 -0
  213. data/test/routes_test.rb +7 -5
  214. data/test/secret_key_finder_test.rb +97 -0
  215. data/test/support/action_controller/record_identifier.rb +2 -0
  216. data/test/support/assertions.rb +2 -0
  217. data/test/support/helpers.rb +6 -0
  218. data/test/support/http_method_compatibility.rb +2 -0
  219. data/test/support/integration.rb +3 -0
  220. data/test/support/webrat/integrations/rails.rb +2 -0
  221. data/test/test/controller_helpers_test.rb +16 -1
  222. data/test/test/integration_helpers_test.rb +2 -0
  223. data/test/test_helper.rb +2 -0
  224. data/test/test_models.rb +2 -0
  225. metadata +23 -5
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  if DEVISE_ORM == :active_record
@@ -13,6 +15,20 @@ if DEVISE_ORM == :active_record
13
15
  assert_migration "db/migrate/devise_create_monsters.rb", /def change/
14
16
  end
15
17
 
18
+ test "all files are properly created with changed db/migrate path in application configuration" do
19
+ old_paths = Rails.application.config.paths["db/migrate"]
20
+ Rails.application.config.paths.add "db/migrate", with: "db2/migrate"
21
+
22
+ run_generator %w(monster)
23
+ if Rails.version >= '5.0.3'
24
+ assert_migration "db2/migrate/devise_create_monsters.rb", /def change/
25
+ else
26
+ assert_migration "db/migrate/devise_create_monsters.rb", /def change/
27
+ end
28
+
29
+ Rails.application.config.paths["db/migrate"] = old_paths
30
+ end
31
+
16
32
  test "all files for namespaced model are properly created" do
17
33
  run_generator %w(admin/monster)
18
34
  assert_migration "db/migrate/devise_create_admin_monsters.rb", /def change/
@@ -25,6 +41,23 @@ if DEVISE_ORM == :active_record
25
41
  assert_migration "db/migrate/add_devise_to_monsters.rb"
26
42
  end
27
43
 
44
+ test "update model migration when model exists with changed db/migrate path in application configuration" do
45
+ old_paths = Rails.application.config.paths["db/migrate"]
46
+ Rails.application.config.paths.add "db/migrate", with: "db2/migrate"
47
+
48
+ run_generator %w(monster)
49
+ assert_file "app/models/monster.rb"
50
+ run_generator %w(monster)
51
+
52
+ if Rails.version >= '5.0.3'
53
+ assert_migration "db2/migrate/add_devise_to_monsters.rb"
54
+ else
55
+ assert_migration "db/migrate/add_devise_to_monsters.rb"
56
+ end
57
+
58
+ Rails.application.config.paths["db/migrate"] = old_paths
59
+ end
60
+
28
61
  test "all files are properly deleted" do
29
62
  run_generator %w(monster)
30
63
  run_generator %w(monster)
@@ -43,6 +76,20 @@ if DEVISE_ORM == :active_record
43
76
  assert_migration "db/migrate/devise_create_monsters.rb", /t.string :current_sign_in_ip/
44
77
  assert_migration "db/migrate/devise_create_monsters.rb", /t.string :last_sign_in_ip/
45
78
  end
79
+
80
+ test "do NOT add primary key type when NOT specified in rails generator" do
81
+ run_generator %w(monster)
82
+ assert_migration "db/migrate/devise_create_monsters.rb", /create_table :monsters do/
83
+ end
84
+
85
+ test "add primary key type with rails 5 when specified in rails generator" do
86
+ run_generator ["monster", "--primary_key_type=uuid"]
87
+ if Rails.version.start_with? '5'
88
+ assert_migration "db/migrate/devise_create_monsters.rb", /create_table :monsters, id: :uuid do/
89
+ else
90
+ assert_migration "db/migrate/devise_create_monsters.rb", /create_table :monsters do/
91
+ end
92
+ end
46
93
  end
47
94
 
48
95
  module RailsEngine
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ControllersGeneratorTest < Rails::Generators::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  require "generators/devise/devise_generator"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class InstallGeneratorTest < Rails::Generators::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  if DEVISE_ORM == :mongoid
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ViewsGeneratorTest < Rails::Generators::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class DeviseHelperTest < Devise::IntegrationTest
@@ -1,6 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class AuthenticationSanityTest < Devise::IntegrationTest
6
+ test 'sign in should not run model validations' do
7
+ sign_in_as_user
8
+
9
+ refute User.validations_performed
10
+ end
11
+
4
12
  test 'home should be accessible without sign in' do
5
13
  visit '/'
6
14
  assert_response :success
@@ -245,7 +253,7 @@ class AuthenticationRoutesRestrictions < Devise::IntegrationTest
245
253
  end
246
254
  end
247
255
 
248
- test 'not signed in users should see unautheticated page (unauthenticated accepted)' do
256
+ test 'not signed in users should see unauthenticated page (unauthenticated accepted)' do
249
257
  get join_path
250
258
 
251
259
  assert_response :success
@@ -369,7 +377,7 @@ class AuthenticationWithScopedViewsTest < Devise::IntegrationTest
369
377
  end
370
378
  end
371
379
 
372
- test 'renders the scoped view if turned on in an specific controller' do
380
+ test 'renders the scoped view if turned on in a specific controller' do
373
381
  begin
374
382
  Devise::SessionsController.scoped_views = true
375
383
  assert_raise Webrat::NotFoundError do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ConfirmationTest < Devise::IntegrationTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class DatabaseAuthenticationTest < Devise::IntegrationTest
@@ -1,6 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class HttpAuthenticationTest < Devise::IntegrationTest
6
+ test 'sign in with HTTP should not run model validations' do
7
+ sign_in_as_new_user_with_http
8
+
9
+ refute User.validations_performed
10
+ end
11
+
4
12
  test 'handles unverified requests gets rid of caches but continues signed in' do
5
13
  swap ApplicationController, allow_forgery_protection: true do
6
14
  create_user
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class LockTest < Devise::IntegrationTest
@@ -172,7 +174,7 @@ class LockTest < Devise::IntegrationTest
172
174
  assert_equal response.body, {}.to_json
173
175
  end
174
176
 
175
- test "in paranoid mode, when trying to unlock an user that exists it should not say that it exists if it is locked" do
177
+ test "in paranoid mode, when trying to unlock a user that exists it should not say that it exists if it is locked" do
176
178
  swap Devise, paranoid: true do
177
179
  user = create_user(locked: true)
178
180
 
@@ -187,7 +189,7 @@ class LockTest < Devise::IntegrationTest
187
189
  end
188
190
  end
189
191
 
190
- test "in paranoid mode, when trying to unlock an user that exists it should not say that it exists if it is not locked" do
192
+ test "in paranoid mode, when trying to unlock a user that exists it should not say that it exists if it is not locked" do
191
193
  swap Devise, paranoid: true do
192
194
  user = create_user(locked: false)
193
195
 
@@ -202,7 +204,7 @@ class LockTest < Devise::IntegrationTest
202
204
  end
203
205
  end
204
206
 
205
- test "in paranoid mode, when trying to unlock an user that does not exists it should not say that it does not exists" do
207
+ test "in paranoid mode, when trying to unlock a user that does not exists it should not say that it does not exists" do
206
208
  swap Devise, paranoid: true do
207
209
  visit new_user_session_path
208
210
  click_link "Didn't receive unlock instructions?"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class MyMountableEngine
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
 
@@ -40,6 +42,17 @@ class OmniauthableIntegrationTest < Devise::IntegrationTest
40
42
  end
41
43
  end
42
44
 
45
+ test "omniauth sign in should not run model validations" do
46
+ stub_action!(:sign_in_facebook) do
47
+ create_user
48
+ visit "/users/sign_in"
49
+ click_link "Sign in with FaceBook"
50
+ assert warden.authenticated?(:user)
51
+
52
+ refute User.validations_performed
53
+ end
54
+ end
55
+
43
56
  test "can access omniauth.auth in the env hash" do
44
57
  visit "/users/sign_in"
45
58
  click_link "Sign in with FaceBook"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class PasswordTest < Devise::IntegrationTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class RegistrationTest < Devise::IntegrationTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class RememberMeTest < Devise::IntegrationTest
@@ -10,7 +12,13 @@ class RememberMeTest < Devise::IntegrationTest
10
12
  end
11
13
 
12
14
  def generate_signed_cookie(raw_cookie)
13
- request = Devise.rails5? ? ActionDispatch::TestRequest.create : ActionDispatch::TestRequest.new
15
+ request = if Devise::Test.rails51? || Devise::Test.rails52?
16
+ ActionController::TestRequest.create(Class.new) # needs a "controller class"
17
+ elsif Devise::Test.rails5?
18
+ ActionController::TestRequest.create
19
+ else
20
+ ActionController::TestRequest.new
21
+ end
14
22
  request.cookie_jar.signed['raw_cookie'] = raw_cookie
15
23
  request.cookie_jar['raw_cookie']
16
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class SessionTimeoutTest < Devise::IntegrationTest
@@ -1,6 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class TrackableHooksTest < Devise::IntegrationTest
6
+ test "trackable should not run model validations" do
7
+ sign_in_as_user
8
+
9
+ refute User.validations_performed
10
+ end
4
11
 
5
12
  test "current and last sign in timestamps are updated on each sign in" do
6
13
  user = create_user
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ConfirmationInstructionsTest < ActionMailer::TestCase
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class EmailChangedTest < ActionMailer::TestCase
6
+ def setup
7
+ setup_mailer
8
+ Devise.mailer = 'Devise::Mailer'
9
+ Devise.mailer_sender = 'test@example.com'
10
+ Devise.send_email_changed_notification = true
11
+ end
12
+
13
+ def teardown
14
+ Devise.mailer = 'Devise::Mailer'
15
+ Devise.mailer_sender = 'please-change-me@config-initializers-devise.com'
16
+ Devise.send_email_changed_notification = false
17
+ end
18
+
19
+ def user
20
+ @user ||= create_user.tap { |u|
21
+ @original_user_email = u.email
22
+ u.update_attributes!(email: 'new-email@example.com')
23
+ }
24
+ end
25
+
26
+ def mail
27
+ @mail ||= begin
28
+ user
29
+ ActionMailer::Base.deliveries.last
30
+ end
31
+ end
32
+
33
+ test 'email sent after changing the user email' do
34
+ assert_not_nil mail
35
+ end
36
+
37
+ test 'content type should be set to html' do
38
+ assert mail.content_type.include?('text/html')
39
+ end
40
+
41
+ test 'send email changed to the original user email' do
42
+ mail
43
+ assert_equal [@original_user_email], mail.to
44
+ end
45
+
46
+ test 'set up sender from configuration' do
47
+ assert_equal ['test@example.com'], mail.from
48
+ end
49
+
50
+ test 'set up sender from custom mailer defaults' do
51
+ Devise.mailer = 'Users::Mailer'
52
+ assert_equal ['custom@example.com'], mail.from
53
+ end
54
+
55
+ test 'set up sender from custom mailer defaults with proc' do
56
+ Devise.mailer = 'Users::FromProcMailer'
57
+ assert_equal ['custom@example.com'], mail.from
58
+ end
59
+
60
+ test 'custom mailer renders parent mailer template' do
61
+ Devise.mailer = 'Users::Mailer'
62
+ assert_present mail.body.encoded
63
+ end
64
+
65
+ test 'set up reply to as copy from sender' do
66
+ assert_equal ['test@example.com'], mail.reply_to
67
+ end
68
+
69
+ test 'set up reply to as different if set in defaults' do
70
+ Devise.mailer = 'Users::ReplyToMailer'
71
+ assert_equal ['custom@example.com'], mail.from
72
+ assert_equal ['custom_reply_to@example.com'], mail.reply_to
73
+ end
74
+
75
+ test 'set up subject from I18n' do
76
+ store_translations :en, devise: { mailer: { email_changed: { subject: 'Email Has Changed' } } } do
77
+ assert_equal 'Email Has Changed', mail.subject
78
+ end
79
+ end
80
+
81
+ test 'subject namespaced by model' do
82
+ store_translations :en, devise: { mailer: { email_changed: { user_subject: 'User Email Has Changed' } } } do
83
+ assert_equal 'User Email Has Changed', mail.subject
84
+ end
85
+ end
86
+
87
+ test 'body should have user info' do
88
+ body = mail.body.encoded
89
+ assert_match "Hello #{@original_user_email}", body
90
+ assert_match "has been changed to #{user.email}", body
91
+ end
92
+ end
93
+
94
+ class EmailChangedReconfirmationTest < ActionMailer::TestCase
95
+ def setup
96
+ setup_mailer
97
+ Devise.mailer = 'Devise::Mailer'
98
+ Devise.mailer_sender = 'test@example.com'
99
+ Devise.send_email_changed_notification = true
100
+ end
101
+
102
+ def teardown
103
+ Devise.mailer = 'Devise::Mailer'
104
+ Devise.mailer_sender = 'please-change-me@config-initializers-devise.com'
105
+ Devise.send_email_changed_notification = false
106
+ end
107
+
108
+ def admin
109
+ @admin ||= create_admin.tap { |u|
110
+ @original_admin_email = u.email
111
+ u.update_attributes!(email: 'new-email@example.com')
112
+ }
113
+ end
114
+
115
+ def mail
116
+ @mail ||= begin
117
+ admin
118
+ ActionMailer::Base.deliveries[-2]
119
+ end
120
+ end
121
+
122
+ test 'send email changed to the original user email' do
123
+ mail
124
+ assert_equal [@original_admin_email], mail.to
125
+ end
126
+
127
+ test 'body should have unconfirmed user info' do
128
+ body = mail.body.encoded
129
+ assert_match admin.email, body
130
+ assert_match "is being changed to #{admin.unconfirmed_email}", body
131
+ end
132
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class MailerTest < ActionMailer::TestCase
6
+ test "pass given block to #mail call" do
7
+ class TestMailer < Devise::Mailer
8
+ def confirmation_instructions(record, token, opts = {})
9
+ @token = token
10
+ devise_mail(record, :confirmation_instructions, opts) do |format|
11
+ format.html(content_transfer_encoding: "7bit")
12
+ end
13
+ end
14
+ end
15
+
16
+ mail = TestMailer.confirmation_instructions(create_user, "confirmation-token")
17
+
18
+ assert mail.content_transfer_encoding, "7bit"
19
+ end
20
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ResetPasswordInstructionsTest < ActionMailer::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class UnlockInstructionsTest < ActionMailer::TestCase
data/test/mapping_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class FakeRequest < Struct.new(:path_info, :params)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class AuthenticatableTest < ActiveSupport::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ConfirmableTest < ActiveSupport::TestCase
@@ -6,6 +8,17 @@ class ConfirmableTest < ActiveSupport::TestCase
6
8
  setup_mailer
7
9
  end
8
10
 
11
+ test 'should set callbacks to send the mail' do
12
+ if DEVISE_ORM == :active_record
13
+ defined_callbacks = User._commit_callbacks.map(&:filter)
14
+ assert_includes defined_callbacks, :send_on_create_confirmation_instructions
15
+ assert_includes defined_callbacks, :send_reconfirmation_instructions
16
+ elsif DEVISE_ORM == :mongoid
17
+ assert_includes User._create_callbacks.map(&:filter), :send_on_create_confirmation_instructions
18
+ assert_includes User._update_callbacks.map(&:filter), :send_reconfirmation_instructions
19
+ end
20
+ end
21
+
9
22
  test 'should generate confirmation token after creating a record' do
10
23
  assert_nil new_user.confirmation_token
11
24
  assert_not_nil create_user.confirmation_token
@@ -516,4 +529,21 @@ class ReconfirmableTest < ActiveSupport::TestCase
516
529
  admin.save
517
530
  assert admin.pending_reconfirmation?
518
531
  end
532
+
533
+ test 'should notify previous email on email change when configured' do
534
+ swap Devise, send_email_changed_notification: true do
535
+ admin = create_admin
536
+ original_email = admin.email
537
+
538
+ assert_difference 'ActionMailer::Base.deliveries.size', 2 do
539
+ assert admin.update_attributes(email: 'new-email@example.com')
540
+ end
541
+ assert_equal original_email, ActionMailer::Base.deliveries[-2]['to'].to_s
542
+ assert_equal 'new-email@example.com', ActionMailer::Base.deliveries[-1]['to'].to_s
543
+
544
+ assert_email_not_sent do
545
+ assert admin.confirm
546
+ end
547
+ end
548
+ end
519
549
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'test_models'
3
5
  require 'digest/sha1'
@@ -236,12 +238,24 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
236
238
  end
237
239
  end
238
240
 
239
- test 'should email on password change when configured' do
241
+ test 'should notify previous email on email change when configured' do
242
+ swap Devise, send_email_changed_notification: true do
243
+ user = create_user
244
+ original_email = user.email
245
+ assert_email_sent original_email do
246
+ assert user.update_attributes(email: 'new-email@example.com')
247
+ end
248
+ assert_match original_email, ActionMailer::Base.deliveries.last.body.encoded
249
+ end
250
+ end
251
+
252
+ test 'should notify email on password change when configured' do
240
253
  swap Devise, send_password_change_notification: true do
241
254
  user = create_user
242
255
  assert_email_sent user.email do
243
256
  assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
244
257
  end
258
+ assert_match user.email, ActionMailer::Base.deliveries.last.body.encoded
245
259
  end
246
260
  end
247
261
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class LockableTest < ActiveSupport::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class OmniauthableTest < ActiveSupport::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class RecoverableTest < ActiveSupport::TestCase
@@ -184,6 +186,16 @@ class RecoverableTest < ActiveSupport::TestCase
184
186
  assert_equal raw, reset_password_user.reset_password_token
185
187
  end
186
188
 
189
+ test 'should return a new record with errors if password is not provided' do
190
+ user = create_user
191
+ raw = user.send_reset_password_instructions
192
+
193
+ reset_password_user = User.reset_password_by_token(reset_password_token: raw)
194
+ refute reset_password_user.errors.empty?
195
+ assert_match "can't be blank", reset_password_user.errors[:password].join
196
+ assert_equal raw, reset_password_user.reset_password_token
197
+ end
198
+
187
199
  test 'should reset successfully user password given the new password and confirmation' do
188
200
  user = create_user
189
201
  old_password = user.password
@@ -245,7 +257,7 @@ class RecoverableTest < ActiveSupport::TestCase
245
257
  end
246
258
 
247
259
  test 'should return nil if a user based on the raw token is not found' do
248
- assert_equal User.with_reset_password_token('random-token'), nil
260
+ assert_nil User.with_reset_password_token('random-token')
249
261
  end
250
262
 
251
263
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class RegisterableTest < ActiveSupport::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class RememberableTest < ActiveSupport::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class SerializableTest < ActiveSupport::TestCase
@@ -40,6 +42,10 @@ class SerializableTest < ActiveSupport::TestCase
40
42
  assert_no_match(/confirmation_token/, @user.inspect)
41
43
  end
42
44
 
45
+ test 'should accept frozen options' do
46
+ assert_key "username", @user.as_json({only: :username}.freeze)["user"]
47
+ end
48
+
43
49
  def assert_key(key, subject)
44
50
  assert subject.key?(key), "Expected #{subject.inspect} to have key #{key.inspect}"
45
51
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class TimeoutableTest < ActiveSupport::TestCase