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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ConfirmationInstructionsTest < ActionMailer::TestCase
@@ -37,43 +39,43 @@ class ConfirmationInstructionsTest < ActionMailer::TestCase
37
39
  assert_equal [user.email], mail.to
38
40
  end
39
41
 
40
- test 'setup sender from configuration' do
42
+ test 'set up sender from configuration' do
41
43
  assert_equal ['test@example.com'], mail.from
42
44
  end
43
45
 
44
- test 'setup sender from custom mailer defaults' do
46
+ test 'set up sender from custom mailer defaults' do
45
47
  Devise.mailer = 'Users::Mailer'
46
48
  assert_equal ['custom@example.com'], mail.from
47
49
  end
48
50
 
49
- test 'setup sender from custom mailer defaults with proc' do
51
+ test 'set up sender from custom mailer defaults with proc' do
50
52
  Devise.mailer = 'Users::FromProcMailer'
51
53
  assert_equal ['custom@example.com'], mail.from
52
54
  end
53
55
 
54
56
  test 'custom mailer renders parent mailer template' do
55
57
  Devise.mailer = 'Users::Mailer'
56
- assert_not_blank mail.body.encoded
58
+ assert_present mail.body.encoded
57
59
  end
58
60
 
59
- test 'setup reply to as copy from sender' do
61
+ test 'set up reply to as copy from sender' do
60
62
  assert_equal ['test@example.com'], mail.reply_to
61
63
  end
62
64
 
63
- test 'setup reply to as different if set in defaults' do
65
+ test 'set up reply to as different if set in defaults' do
64
66
  Devise.mailer = 'Users::ReplyToMailer'
65
67
  assert_equal ['custom@example.com'], mail.from
66
68
  assert_equal ['custom_reply_to@example.com'], mail.reply_to
67
69
  end
68
70
 
69
- test 'setup subject from I18n' do
70
- store_translations :en, :devise => { :mailer => { :confirmation_instructions => { :subject => 'Account Confirmation' } } } do
71
+ test 'set up subject from I18n' do
72
+ store_translations :en, devise: { mailer: { confirmation_instructions: { subject: 'Account Confirmation' } } } do
71
73
  assert_equal 'Account Confirmation', mail.subject
72
74
  end
73
75
  end
74
76
 
75
77
  test 'subject namespaced by model' do
76
- store_translations :en, :devise => { :mailer => { :confirmation_instructions => { :user_subject => 'User Account Confirmation' } } } do
78
+ store_translations :en, devise: { mailer: { confirmation_instructions: { user_subject: 'User Account Confirmation' } } } do
77
79
  assert_equal 'User Account Confirmation', mail.subject
78
80
  end
79
81
  end
@@ -83,17 +85,17 @@ class ConfirmationInstructionsTest < ActionMailer::TestCase
83
85
  end
84
86
 
85
87
  test 'body should have link to confirm the account' do
86
- host = ActionMailer::Base.default_url_options[:host]
88
+ host, port = ActionMailer::Base.default_url_options.values_at :host, :port
87
89
 
88
- if mail.body.encoded =~ %r{<a href=\"http://#{host}/users/confirmation\?confirmation_token=([^"]+)">}
89
- assert_equal Devise.token_generator.digest(user.class, :confirmation_token, $1), user.confirmation_token
90
+ if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/confirmation\?confirmation_token=([^"]+)">}
91
+ assert_equal $1, user.confirmation_token
90
92
  else
91
93
  flunk "expected confirmation url regex to match"
92
94
  end
93
95
  end
94
96
 
95
97
  test 'renders a scoped if scoped_views is set to true' do
96
- swap Devise, :scoped_views => true do
98
+ swap Devise, scoped_views: true do
97
99
  assert_equal user.email, mail.body.decoded
98
100
  end
99
101
  end
@@ -108,7 +110,7 @@ class ConfirmationInstructionsTest < ActionMailer::TestCase
108
110
  end
109
111
 
110
112
  test 'mailer sender accepts a proc' do
111
- swap Devise, :mailer_sender => proc { "another@example.com" } do
113
+ swap Devise, mailer_sender: proc { "another@example.com" } do
112
114
  assert_equal ['another@example.com'], mail.from
113
115
  end
114
116
  end
@@ -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
@@ -39,37 +41,37 @@ class ResetPasswordInstructionsTest < ActionMailer::TestCase
39
41
  assert_equal [user.email], mail.to
40
42
  end
41
43
 
42
- test 'setup sender from configuration' do
44
+ test 'set up sender from configuration' do
43
45
  assert_equal ['test@example.com'], mail.from
44
46
  end
45
47
 
46
- test 'setup sender from custom mailer defaults' do
48
+ test 'set up sender from custom mailer defaults' do
47
49
  Devise.mailer = 'Users::Mailer'
48
50
  assert_equal ['custom@example.com'], mail.from
49
51
  end
50
52
 
51
- test 'setup sender from custom mailer defaults with proc' do
53
+ test 'set up sender from custom mailer defaults with proc' do
52
54
  Devise.mailer = 'Users::FromProcMailer'
53
55
  assert_equal ['custom@example.com'], mail.from
54
56
  end
55
57
 
56
58
  test 'custom mailer renders parent mailer template' do
57
59
  Devise.mailer = 'Users::Mailer'
58
- assert_not_blank mail.body.encoded
60
+ assert_present mail.body.encoded
59
61
  end
60
62
 
61
- test 'setup reply to as copy from sender' do
63
+ test 'set up reply to as copy from sender' do
62
64
  assert_equal ['test@example.com'], mail.reply_to
63
65
  end
64
66
 
65
- test 'setup subject from I18n' do
66
- store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :subject => 'Reset instructions' } } } do
67
+ test 'set up subject from I18n' do
68
+ store_translations :en, devise: { mailer: { reset_password_instructions: { subject: 'Reset instructions' } } } do
67
69
  assert_equal 'Reset instructions', mail.subject
68
70
  end
69
71
  end
70
72
 
71
73
  test 'subject namespaced by model' do
72
- store_translations :en, :devise => { :mailer => { :reset_password_instructions => { :user_subject => 'User Reset Instructions' } } } do
74
+ store_translations :en, devise: { mailer: { reset_password_instructions: { user_subject: 'User Reset Instructions' } } } do
73
75
  assert_equal 'User Reset Instructions', mail.subject
74
76
  end
75
77
  end
@@ -79,9 +81,9 @@ class ResetPasswordInstructionsTest < ActionMailer::TestCase
79
81
  end
80
82
 
81
83
  test 'body should have link to confirm the account' do
82
- host = ActionMailer::Base.default_url_options[:host]
84
+ host, port = ActionMailer::Base.default_url_options.values_at :host, :port
83
85
 
84
- if mail.body.encoded =~ %r{<a href=\"http://#{host}/users/password/edit\?reset_password_token=([^"]+)">}
86
+ if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/password/edit\?reset_password_token=([^"]+)">}
85
87
  assert_equal Devise.token_generator.digest(user.class, :reset_password_token, $1), user.reset_password_token
86
88
  else
87
89
  flunk "expected reset password url regex to match"
@@ -89,7 +91,7 @@ class ResetPasswordInstructionsTest < ActionMailer::TestCase
89
91
  end
90
92
 
91
93
  test 'mailer sender accepts a proc' do
92
- swap Devise, :mailer_sender => proc { "another@example.com" } do
94
+ swap Devise, mailer_sender: proc { "another@example.com" } do
93
95
  assert_equal ['another@example.com'], mail.from
94
96
  end
95
97
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class UnlockInstructionsTest < ActionMailer::TestCase
@@ -40,37 +42,37 @@ class UnlockInstructionsTest < ActionMailer::TestCase
40
42
  assert_equal [user.email], mail.to
41
43
  end
42
44
 
43
- test 'setup sender from configuration' do
45
+ test 'set up sender from configuration' do
44
46
  assert_equal ['test@example.com'], mail.from
45
47
  end
46
48
 
47
- test 'setup sender from custom mailer defaults' do
49
+ test 'set up sender from custom mailer defaults' do
48
50
  Devise.mailer = 'Users::Mailer'
49
51
  assert_equal ['custom@example.com'], mail.from
50
52
  end
51
53
 
52
- test 'setup sender from custom mailer defaults with proc' do
54
+ test 'set up sender from custom mailer defaults with proc' do
53
55
  Devise.mailer = 'Users::FromProcMailer'
54
56
  assert_equal ['custom@example.com'], mail.from
55
57
  end
56
58
 
57
59
  test 'custom mailer renders parent mailer template' do
58
60
  Devise.mailer = 'Users::Mailer'
59
- assert_not_blank mail.body.encoded
61
+ assert_present mail.body.encoded
60
62
  end
61
63
 
62
- test 'setup reply to as copy from sender' do
64
+ test 'set up reply to as copy from sender' do
63
65
  assert_equal ['test@example.com'], mail.reply_to
64
66
  end
65
67
 
66
- test 'setup subject from I18n' do
67
- store_translations :en, :devise => { :mailer => { :unlock_instructions => { :subject => 'Yo unlock instructions' } } } do
68
+ test 'set up subject from I18n' do
69
+ store_translations :en, devise: { mailer: { unlock_instructions: { subject: 'Yo unlock instructions' } } } do
68
70
  assert_equal 'Yo unlock instructions', mail.subject
69
71
  end
70
72
  end
71
73
 
72
74
  test 'subject namespaced by model' do
73
- store_translations :en, :devise => { :mailer => { :unlock_instructions => { :user_subject => 'User Unlock Instructions' } } } do
75
+ store_translations :en, devise: { mailer: { unlock_instructions: { user_subject: 'User Unlock Instructions' } } } do
74
76
  assert_equal 'User Unlock Instructions', mail.subject
75
77
  end
76
78
  end
@@ -80,9 +82,9 @@ class UnlockInstructionsTest < ActionMailer::TestCase
80
82
  end
81
83
 
82
84
  test 'body should have link to unlock the account' do
83
- host = ActionMailer::Base.default_url_options[:host]
85
+ host, port = ActionMailer::Base.default_url_options.values_at :host, :port
84
86
 
85
- if mail.body.encoded =~ %r{<a href=\"http://#{host}/users/unlock\?unlock_token=([^"]+)">}
87
+ if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/unlock\?unlock_token=([^"]+)">}
86
88
  assert_equal Devise.token_generator.digest(user.class, :unlock_token, $1), user.unlock_token
87
89
  else
88
90
  flunk "expected unlock url regex to match"
@@ -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)
@@ -35,8 +37,8 @@ class MappingTest < ActiveSupport::TestCase
35
37
  assert_equal [], Devise.mappings[:skip_admin].used_routes
36
38
  end
37
39
 
38
- test 'sign_out_via defaults to :get' do
39
- assert_equal :get, Devise.mappings[:user].sign_out_via
40
+ test 'sign_out_via defaults to :delete' do
41
+ assert_equal :delete, Devise.mappings[:user].sign_out_via
40
42
  end
41
43
 
42
44
  test 'allows custom sign_out_via to be given' do
@@ -62,6 +64,7 @@ class MappingTest < ActiveSupport::TestCase
62
64
  test 'find scope for a given object' do
63
65
  assert_equal :user, Devise::Mapping.find_scope!(User)
64
66
  assert_equal :user, Devise::Mapping.find_scope!(:user)
67
+ assert_equal :user, Devise::Mapping.find_scope!("user")
65
68
  assert_equal :user, Devise::Mapping.find_scope!(User.new)
66
69
  end
67
70
 
@@ -70,6 +73,12 @@ class MappingTest < ActiveSupport::TestCase
70
73
  assert_equal :user, Devise::Mapping.find_scope!(Class.new(User).new)
71
74
  end
72
75
 
76
+ test 'find scope uses devise_scope' do
77
+ user = User.new
78
+ def user.devise_scope; :special_scope; end
79
+ assert_equal :special_scope, Devise::Mapping.find_scope!(user)
80
+ end
81
+
73
82
  test 'find scope raises an error if cannot be found' do
74
83
  assert_raise RuntimeError do
75
84
  Devise::Mapping.find_scope!(String)
@@ -108,14 +117,14 @@ class MappingTest < ActiveSupport::TestCase
108
117
  assert mapping.authenticatable?
109
118
  assert mapping.recoverable?
110
119
  assert mapping.lockable?
111
- assert_not mapping.omniauthable?
120
+ refute mapping.omniauthable?
112
121
  end
113
-
122
+
114
123
  test 'find mapping by path' do
115
124
  assert_raise RuntimeError do
116
125
  Devise::Mapping.find_by_path!('/accounts/facebook/callback')
117
126
  end
118
-
127
+
119
128
  assert_nothing_raised do
120
129
  Devise::Mapping.find_by_path!('/:locale/accounts/login')
121
130
  end
@@ -123,5 +132,5 @@ class MappingTest < ActiveSupport::TestCase
123
132
  assert_nothing_raised do
124
133
  Devise::Mapping.find_by_path!('/accounts/facebook/callback', :path)
125
134
  end
126
- end
135
+ end
127
136
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class AuthenticatableTest < ActiveSupport::TestCase
@@ -6,8 +8,18 @@ class AuthenticatableTest < ActiveSupport::TestCase
6
8
  end
7
9
 
8
10
  test 'find_first_by_auth_conditions allows custom filtering parameters' do
9
- user = User.create!(:email => "example@example.com", :password => "123456")
10
- assert_equal User.find_first_by_auth_conditions({ :email => "example@example.com" }), user
11
- assert_nil User.find_first_by_auth_conditions({ :email => "example@example.com" }, :id => user.id.to_s.next)
11
+ user = User.create!(email: "example@example.com", password: "1234567")
12
+ assert_equal User.find_first_by_auth_conditions({ email: "example@example.com" }), user
13
+ assert_nil User.find_first_by_auth_conditions({ email: "example@example.com" }, id: user.id.to_s.next)
14
+ end
15
+
16
+ if defined?(ActionController::Parameters)
17
+ test 'does not passes an ActionController::Parameters to find_first_by_auth_conditions through find_or_initialize_with_errors' do
18
+ user = create_user(email: 'example@example.com')
19
+ attributes = ActionController::Parameters.new(email: 'example@example.com')
20
+
21
+ User.expects(:find_first_by_auth_conditions).with('email' => 'example@example.com').returns(user)
22
+ User.find_or_initialize_with_errors([:email], attributes)
23
+ end
12
24
  end
13
25
  end