Skip to content

Commit cb1073e

Browse files
Merge pull request rails#46626 from maxim/assert_enqueued_email_with_matchers
Add matcher support to `assert_enqueued_email_with`
2 parents 9796109 + 96f19e9 commit cb1073e

File tree

3 files changed

+82
-7
lines changed

3 files changed

+82
-7
lines changed

actionmailer/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
* Accept procs for args and params in `assert_enqueued_email_with`
2+
3+
```ruby
4+
assert_enqueued_email_with DeliveryJob, params: -> p { p[:token] =~ /\w+/ } do
5+
UserMailer.with(token: user.generate_token).email_verification.deliver_later
6+
end
7+
```
8+
9+
*Max Chernyak*
10+
111
* Added `*_deliver` callbacks to `ActionMailer::Base` that wrap mail message delivery.
212

313
Example:

actionmailer/lib/action_mailer/test_helper.rb

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# frozen_string_literal: true
22

3+
require "active_support/core_ext/array/extract_options"
34
require "active_job"
45

56
module ActionMailer
@@ -153,6 +154,13 @@ def assert_enqueued_emails(number, &block)
153154
# assert_enqueued_email_with ContactMailer.with(greeting: "Hello"), :welcome
154155
# end
155156
#
157+
# def test_email_with_matchers
158+
# ContactMailer.with(greeting: "Hello").welcome("Cheers", "Goodbye").deliver_later
159+
# assert_enqueued_email_with ContactMailer, :welcome,
160+
# params: ->(params) { /hello/i.match?(params[:greeting]) },
161+
# args: ->(args) { /cheers/i.match?(args[0]) }
162+
# end
163+
#
156164
# If a block is passed, that block should cause the specified email
157165
# to be enqueued.
158166
#
@@ -176,17 +184,18 @@ def assert_enqueued_email_with(mailer, method, params: nil, args: nil, queue: ni
176184
mailer = mailer.instance_variable_get(:@mailer)
177185
end
178186

187+
params, args = args, nil if args.is_a?(Hash)
188+
args = Array(args) unless args.is_a?(Proc)
179189
queue ||= mailer.deliver_later_queue_name || ActiveJob::Base.default_queue_name
180190

181-
args = if args.is_a?(Hash)
182-
[mailer.to_s, method.to_s, "deliver_now", params: args, args: []]
183-
elsif params.present?
184-
[mailer.to_s, method.to_s, "deliver_now", params: params, args: Array(args)]
185-
else
186-
[mailer.to_s, method.to_s, "deliver_now", args: Array(args)]
191+
expected = ->(job_args) do
192+
job_kwargs = job_args.extract_options!
193+
194+
[mailer.to_s, method.to_s, "deliver_now"] == job_args &&
195+
params === job_kwargs[:params] && args === job_kwargs[:args]
187196
end
188197

189-
assert_enqueued_with(job: mailer.delivery_job, args: args, queue: queue.to_s, &block)
198+
assert_enqueued_with(job: mailer.delivery_job, args: expected, queue: queue.to_s, &block)
190199
end
191200

192201
# Asserts that no emails are enqueued for later delivery.

actionmailer/test/test_helper_test.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,62 @@ def test_assert_enqueued_email_with_with_no_block_with_parameterized_args
488488
end
489489
end
490490

491+
def test_assert_enqueued_email_with_supports_params_matcher_proc
492+
mail_params = { all: "good" }
493+
494+
silence_stream($stdout) do
495+
TestHelperMailer.with(mail_params).test_parameter_args.deliver_later
496+
end
497+
498+
matcher_params = nil
499+
500+
assert_nothing_raised do
501+
assert_enqueued_email_with TestHelperMailer, :test_parameter_args, params: ->(params) { matcher_params = params }
502+
end
503+
504+
assert_equal mail_params, matcher_params
505+
506+
assert_raises ActiveSupport::TestCase::Assertion do
507+
assert_enqueued_email_with TestHelperMailer, :test_parameter_args, params: ->(_) { false }
508+
end
509+
end
510+
511+
def test_assert_enqueued_email_with_supports_args_matcher_proc
512+
mail_args = ["some_email", "some_name"]
513+
514+
silence_stream($stdout) do
515+
TestHelperMailer.test_args(*mail_args).deliver_later
516+
end
517+
518+
matcher_args = nil
519+
520+
assert_nothing_raised do
521+
assert_enqueued_email_with TestHelperMailer, :test_args, args: ->(args) { matcher_args = args }
522+
end
523+
524+
assert_equal mail_args, matcher_args
525+
526+
assert_raises ActiveSupport::TestCase::Assertion do
527+
assert_enqueued_email_with TestHelperMailer, :test_args, args: ->(_) { false }
528+
end
529+
end
530+
531+
def test_assert_enqueued_email_with_supports_named_args_matcher_proc
532+
mail_args = [{ email: "some_email", name: "some_name" }]
533+
534+
silence_stream($stdout) do
535+
TestHelperMailer.test_named_args(**mail_args[0]).deliver_later
536+
end
537+
538+
matcher_args = nil
539+
540+
assert_nothing_raised do
541+
assert_enqueued_email_with TestHelperMailer, :test_named_args, args: ->(args) { matcher_args = args }
542+
end
543+
544+
assert_equal mail_args, matcher_args
545+
end
546+
491547
def test_deliver_enqueued_emails_with_no_block
492548
assert_nothing_raised do
493549
silence_stream($stdout) do

0 commit comments

Comments
 (0)