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.
- checksums.yaml +5 -5
- data/.travis.yml +27 -5
- data/CHANGELOG.md +65 -0
- data/CONTRIBUTING.md +68 -28
- data/Gemfile +3 -1
- data/Gemfile.lock +79 -83
- data/ISSUE_TEMPLATE.md +19 -0
- data/MIT-LICENSE +1 -1
- data/README.md +108 -11
- data/Rakefile +1 -0
- data/app/controllers/devise/confirmations_controller.rb +2 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +4 -2
- data/app/controllers/devise/passwords_controller.rb +2 -0
- data/app/controllers/devise/registrations_controller.rb +6 -3
- data/app/controllers/devise/sessions_controller.rb +3 -1
- data/app/controllers/devise/unlocks_controller.rb +2 -0
- data/app/controllers/devise_controller.rb +2 -0
- data/app/helpers/devise_helper.rb +2 -0
- data/app/mailers/devise/mailer.rb +6 -0
- data/app/views/devise/confirmations/new.html.erb +1 -1
- data/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/devise/passwords/new.html.erb +1 -1
- data/app/views/devise/registrations/edit.html.erb +1 -1
- data/app/views/devise/registrations/new.html.erb +1 -1
- data/app/views/devise/sessions/new.html.erb +1 -1
- data/app/views/devise/unlocks/new.html.erb +1 -1
- data/config/locales/en.yml +2 -0
- data/devise.gemspec +3 -1
- data/gemfiles/Gemfile.rails-4.1-stable +3 -1
- data/gemfiles/Gemfile.rails-4.1-stable.lock +67 -70
- data/gemfiles/Gemfile.rails-4.2-stable +3 -1
- data/gemfiles/Gemfile.rails-4.2-stable.lock +69 -73
- data/gemfiles/Gemfile.rails-5.0-stable +33 -0
- data/gemfiles/Gemfile.rails-5.0-stable.lock +192 -0
- data/gemfiles/Gemfile.rails-5.2-rc1 +26 -0
- data/gemfiles/Gemfile.rails-5.2-rc1.lock +201 -0
- data/guides/bug_report_templates/integration_test.rb +2 -0
- data/lib/devise/controllers/helpers.rb +2 -0
- data/lib/devise/controllers/rememberable.rb +2 -0
- data/lib/devise/controllers/scoped_views.rb +2 -0
- data/lib/devise/controllers/sign_in_out.rb +6 -1
- data/lib/devise/controllers/store_location.rb +25 -7
- data/lib/devise/controllers/url_helpers.rb +2 -0
- data/lib/devise/delegator.rb +2 -0
- data/lib/devise/encryptor.rb +2 -0
- data/lib/devise/failure_app.rb +14 -12
- data/lib/devise/hooks/activatable.rb +2 -0
- data/lib/devise/hooks/csrf_cleaner.rb +2 -0
- data/lib/devise/hooks/forgetable.rb +2 -0
- data/lib/devise/hooks/lockable.rb +6 -1
- data/lib/devise/hooks/proxy.rb +2 -0
- data/lib/devise/hooks/rememberable.rb +2 -0
- data/lib/devise/hooks/timeoutable.rb +2 -0
- data/lib/devise/hooks/trackable.rb +2 -0
- data/lib/devise/mailers/helpers.rb +6 -3
- data/lib/devise/mapping.rb +2 -0
- data/lib/devise/models/authenticatable.rb +4 -2
- data/lib/devise/models/confirmable.rb +53 -17
- data/lib/devise/models/database_authenticatable.rb +40 -4
- data/lib/devise/models/lockable.rb +8 -2
- data/lib/devise/models/omniauthable.rb +2 -0
- data/lib/devise/models/recoverable.rb +26 -9
- data/lib/devise/models/registerable.rb +2 -0
- data/lib/devise/models/rememberable.rb +4 -2
- data/lib/devise/models/timeoutable.rb +2 -0
- data/lib/devise/models/trackable.rb +7 -0
- data/lib/devise/models/validatable.rb +10 -3
- data/lib/devise/models.rb +3 -1
- data/lib/devise/modules.rb +2 -0
- data/lib/devise/omniauth/config.rb +2 -0
- data/lib/devise/omniauth/url_helpers.rb +2 -0
- data/lib/devise/omniauth.rb +2 -0
- data/lib/devise/orm/active_record.rb +2 -0
- data/lib/devise/orm/mongoid.rb +2 -0
- data/lib/devise/parameter_filter.rb +2 -0
- data/lib/devise/parameter_sanitizer.rb +2 -0
- data/lib/devise/rails/routes.rb +3 -1
- data/lib/devise/rails/warden_compat.rb +2 -0
- data/lib/devise/rails.rb +3 -5
- data/lib/devise/secret_key_finder.rb +25 -0
- data/lib/devise/strategies/authenticatable.rb +2 -0
- data/lib/devise/strategies/base.rb +2 -0
- data/lib/devise/strategies/database_authenticatable.rb +2 -0
- data/lib/devise/strategies/rememberable.rb +2 -0
- data/lib/devise/test/controller_helpers.rb +4 -1
- data/lib/devise/test/integration_helpers.rb +2 -0
- data/lib/devise/test_helpers.rb +3 -1
- data/lib/devise/time_inflector.rb +2 -0
- data/lib/devise/token_generator.rb +2 -0
- data/lib/devise/version.rb +3 -1
- data/lib/devise.rb +17 -2
- data/lib/generators/active_record/devise_generator.rb +15 -2
- data/lib/generators/active_record/templates/migration.rb +3 -1
- data/lib/generators/active_record/templates/migration_existing.rb +2 -0
- data/lib/generators/devise/controllers_generator.rb +2 -0
- data/lib/generators/devise/devise_generator.rb +4 -2
- data/lib/generators/devise/install_generator.rb +2 -0
- data/lib/generators/devise/orm_helpers.rb +7 -1
- data/lib/generators/devise/views_generator.rb +7 -8
- data/lib/generators/mongoid/devise_generator.rb +2 -0
- data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +2 -0
- data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +4 -2
- data/lib/generators/templates/controllers/sessions_controller.rb +3 -1
- data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
- data/lib/generators/templates/devise.rb +10 -1
- data/lib/generators/templates/markerb/email_changed.markerb +7 -0
- data/lib/generators/templates/markerb/password_change.markerb +2 -2
- data/test/controllers/custom_registrations_controller_test.rb +2 -0
- data/test/controllers/custom_strategy_test.rb +2 -0
- data/test/controllers/helper_methods_test.rb +2 -0
- data/test/controllers/helpers_test.rb +5 -3
- data/test/controllers/inherited_controller_i18n_messages_test.rb +2 -0
- data/test/controllers/internal_helpers_test.rb +2 -0
- data/test/controllers/load_hooks_controller_test.rb +2 -0
- data/test/controllers/passwords_controller_test.rb +2 -0
- data/test/controllers/sessions_controller_test.rb +2 -0
- data/test/controllers/url_helpers_test.rb +2 -0
- data/test/delegator_test.rb +2 -0
- data/test/devise_test.rb +2 -0
- data/test/failure_app_test.rb +2 -0
- data/test/generators/active_record_generator_test.rb +47 -0
- data/test/generators/controllers_generator_test.rb +2 -0
- data/test/generators/devise_generator_test.rb +2 -0
- data/test/generators/install_generator_test.rb +2 -0
- data/test/generators/mongoid_generator_test.rb +2 -0
- data/test/generators/views_generator_test.rb +2 -0
- data/test/helpers/devise_helper_test.rb +2 -0
- data/test/integration/authenticatable_test.rb +10 -2
- data/test/integration/confirmable_test.rb +2 -0
- data/test/integration/database_authenticatable_test.rb +2 -0
- data/test/integration/http_authenticatable_test.rb +8 -0
- data/test/integration/lockable_test.rb +5 -3
- data/test/integration/mounted_engine_test.rb +2 -0
- data/test/integration/omniauthable_test.rb +13 -0
- data/test/integration/recoverable_test.rb +2 -0
- data/test/integration/registerable_test.rb +2 -0
- data/test/integration/rememberable_test.rb +9 -1
- data/test/integration/timeoutable_test.rb +2 -0
- data/test/integration/trackable_test.rb +7 -0
- data/test/mailers/confirmation_instructions_test.rb +2 -0
- data/test/mailers/email_changed_test.rb +132 -0
- data/test/mailers/mailer_test.rb +20 -0
- data/test/mailers/reset_password_instructions_test.rb +2 -0
- data/test/mailers/unlock_instructions_test.rb +2 -0
- data/test/mapping_test.rb +2 -0
- data/test/models/authenticatable_test.rb +2 -0
- data/test/models/confirmable_test.rb +30 -0
- data/test/models/database_authenticatable_test.rb +15 -1
- data/test/models/lockable_test.rb +2 -0
- data/test/models/omniauthable_test.rb +2 -0
- data/test/models/recoverable_test.rb +13 -1
- data/test/models/registerable_test.rb +2 -0
- data/test/models/rememberable_test.rb +2 -0
- data/test/models/serializable_test.rb +6 -0
- data/test/models/timeoutable_test.rb +2 -0
- data/test/models/trackable_test.rb +21 -0
- data/test/models/validatable_test.rb +4 -2
- data/test/models_test.rb +2 -0
- data/test/omniauth/config_test.rb +11 -7
- data/test/omniauth/url_helpers_test.rb +2 -0
- data/test/orm/active_record.rb +9 -2
- data/test/orm/mongoid.rb +3 -1
- data/test/parameter_sanitizer_test.rb +2 -0
- data/test/rails_app/app/active_record/admin.rb +2 -0
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +14 -1
- data/test/rails_app/app/active_record/user_on_engine.rb +2 -0
- data/test/rails_app/app/active_record/user_on_main_app.rb +2 -0
- data/test/rails_app/app/active_record/user_with_validations.rb +12 -0
- data/test/rails_app/app/active_record/user_without_email.rb +2 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/admins_controller.rb +2 -0
- data/test/rails_app/app/controllers/application_controller.rb +2 -0
- data/test/rails_app/app/controllers/application_with_fake_engine.rb +2 -0
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/home_controller.rb +3 -1
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +3 -1
- data/test/rails_app/app/controllers/users_controller.rb +5 -3
- data/test/rails_app/app/helpers/application_helper.rb +2 -0
- data/test/rails_app/app/mailers/users/from_proc_mailer.rb +2 -0
- data/test/rails_app/app/mailers/users/mailer.rb +2 -0
- data/test/rails_app/app/mailers/users/reply_to_mailer.rb +2 -0
- data/test/rails_app/app/mongoid/admin.rb +2 -0
- data/test/rails_app/app/mongoid/shim.rb +2 -0
- data/test/rails_app/app/mongoid/user.rb +11 -0
- data/test/rails_app/app/mongoid/user_on_engine.rb +2 -0
- data/test/rails_app/app/mongoid/user_on_main_app.rb +2 -0
- data/test/rails_app/app/mongoid/user_with_validations.rb +37 -0
- data/test/rails_app/app/mongoid/user_without_email.rb +2 -0
- data/test/rails_app/config/application.rb +6 -2
- data/test/rails_app/config/boot.rb +16 -3
- data/test/rails_app/config/environment.rb +2 -0
- data/test/rails_app/config/environments/development.rb +2 -0
- data/test/rails_app/config/environments/production.rb +2 -0
- data/test/rails_app/config/environments/test.rb +2 -0
- data/test/rails_app/config/initializers/backtrace_silencers.rb +2 -0
- data/test/rails_app/config/initializers/devise.rb +2 -0
- data/test/rails_app/config/initializers/inflections.rb +2 -0
- data/test/rails_app/config/initializers/secret_token.rb +2 -0
- data/test/rails_app/config/initializers/session_store.rb +2 -0
- data/test/rails_app/config/routes.rb +2 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +2 -0
- data/test/rails_app/db/schema.rb +2 -0
- data/test/rails_app/lib/shared_admin.rb +7 -1
- data/test/rails_app/lib/shared_user.rb +2 -0
- data/test/rails_app/lib/shared_user_without_email.rb +2 -0
- data/test/rails_app/lib/shared_user_without_omniauth.rb +2 -0
- data/test/rails_test.rb +2 -0
- data/test/routes_test.rb +7 -5
- data/test/secret_key_finder_test.rb +97 -0
- data/test/support/action_controller/record_identifier.rb +2 -0
- data/test/support/assertions.rb +2 -0
- data/test/support/helpers.rb +6 -0
- data/test/support/http_method_compatibility.rb +2 -0
- data/test/support/integration.rb +3 -0
- data/test/support/webrat/integrations/rails.rb +2 -0
- data/test/test/controller_helpers_test.rb +16 -1
- data/test/test/integration_helpers_test.rb +2 -0
- data/test/test_helper.rb +2 -0
- data/test/test_models.rb +2 -0
- 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,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
|
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
|
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,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
|
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
|
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
|
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
|
|
@@ -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 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.
|
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,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
|
@@ -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
|
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 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
|
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 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
|
-
|
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 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
|