-
Notifications
You must be signed in to change notification settings - Fork 21.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add MailDeliveryJob for unified mail delivery
Add `MailDeliveryJob` for delivering both regular and parameterized mail. Deprecate using `DeliveryJob` and `Parameterized::DeliveryJob`.
- Loading branch information
Showing
12 changed files
with
179 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# frozen_string_literal: true | ||
|
||
require "active_job" | ||
|
||
module ActionMailer | ||
# The <tt>ActionMailer::NewDeliveryJob</tt> class is used when you | ||
# want to send emails outside of the request-response cycle. It supports | ||
# sending either parameterized or normal mail. | ||
# | ||
# Exceptions are rescued and handled by the mailer class. | ||
class MailDeliveryJob < ActiveJob::Base # :nodoc: | ||
queue_as { ActionMailer::Base.deliver_later_queue_name } | ||
|
||
rescue_from StandardError, with: :handle_exception_with_mailer_class | ||
|
||
def perform(mailer, mail_method, delivery_method, args:, params: nil) #:nodoc: | ||
mailer_class = params ? mailer.constantize.with(params) : mailer.constantize | ||
mailer_class.public_send(mail_method, *args).send(delivery_method) | ||
end | ||
|
||
private | ||
# "Deserialize" the mailer class name by hand in case another argument | ||
# (like a Global ID reference) raised DeserializationError. | ||
def mailer_class | ||
if mailer = Array(@serialized_arguments).first || Array(arguments).first | ||
mailer.constantize | ||
end | ||
end | ||
|
||
def handle_exception_with_mailer_class(exception) | ||
if klass = mailer_class | ||
klass.handle_exception exception | ||
else | ||
raise exception | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
# frozen_string_literal: true | ||
|
||
require "abstract_unit" | ||
require "active_job" | ||
require "mailers/params_mailer" | ||
require "mailers/delayed_mailer" | ||
|
||
class LegacyDeliveryJobTest < ActiveSupport::TestCase | ||
include ActiveJob::TestHelper | ||
|
||
class LegacyDeliveryJob < ActionMailer::DeliveryJob | ||
end | ||
|
||
class LegacyParmeterizedDeliveryJob < ActionMailer::Parameterized::DeliveryJob | ||
end | ||
|
||
setup do | ||
@previous_logger = ActiveJob::Base.logger | ||
ActiveJob::Base.logger = Logger.new(nil) | ||
|
||
@previous_delivery_method = ActionMailer::Base.delivery_method | ||
ActionMailer::Base.delivery_method = :test | ||
|
||
@previous_deliver_later_queue_name = ActionMailer::Base.deliver_later_queue_name | ||
ActionMailer::Base.deliver_later_queue_name = :test_queue | ||
end | ||
|
||
teardown do | ||
ActiveJob::Base.logger = @previous_logger | ||
ParamsMailer.deliveries.clear | ||
|
||
ActionMailer::Base.delivery_method = @previous_delivery_method | ||
ActionMailer::Base.deliver_later_queue_name = @previous_deliver_later_queue_name | ||
end | ||
|
||
test "should send parameterized mail correctly" do | ||
mail = ParamsMailer.with(inviter: "david@basecamp.com", invitee: "jason@basecamp.com").invitation | ||
args = [ | ||
"ParamsMailer", | ||
"invitation", | ||
"deliver_now", | ||
{ inviter: "david@basecamp.com", invitee: "jason@basecamp.com" }, | ||
] | ||
|
||
with_delivery_job(LegacyParmeterizedDeliveryJob) do | ||
assert_deprecated do | ||
assert_performed_with(job: LegacyParmeterizedDeliveryJob, args: args) do | ||
mail.deliver_later | ||
end | ||
end | ||
end | ||
end | ||
|
||
test "should send mail correctly" do | ||
mail = DelayedMailer.test_message(1, 2, 3) | ||
args = [ | ||
"DelayedMailer", | ||
"test_message", | ||
"deliver_now", | ||
1, | ||
2, | ||
3, | ||
] | ||
|
||
with_delivery_job(LegacyDeliveryJob) do | ||
assert_deprecated do | ||
assert_performed_with(job: LegacyDeliveryJob, args: args) do | ||
mail.deliver_later | ||
end | ||
end | ||
end | ||
end | ||
|
||
private | ||
|
||
def with_delivery_job(job) | ||
old_params_delivery_job = ParamsMailer.delivery_job | ||
old_regular_delivery_job = DelayedMailer.delivery_job | ||
ParamsMailer.delivery_job = job | ||
DelayedMailer.delivery_job = job | ||
yield | ||
ensure | ||
ParamsMailer.delivery_job = old_params_delivery_job | ||
DelayedMailer.delivery_job = old_regular_delivery_job | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters