Skip to content

Commit 0b95524

Browse files
committed
Merge PR rails#47520
2 parents 5d0e443 + c3a288b commit 0b95524

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
lines changed

actionmailer/CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
* Added `deliver_enqueued_emails` to `ActionMailer::TestHelper`. This method
2+
delivers all enqueued email jobs.
3+
4+
Example:
5+
6+
```ruby
7+
def test_deliver_enqueued_emails
8+
deliver_enqueued_emails do
9+
ContactMailer.welcome.deliver_later
10+
end
11+
assert_emails 1
12+
end
13+
```
14+
15+
*Andrew Novoselac*
16+
117
* The `deliver_later_queue_name` used by the default mailer job can now be
218
configured on a per-mailer basis. Previously this was only configurable
319
for all mailers via `ActionMailer::Base`.

actionmailer/lib/action_mailer/test_helper.rb

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ module TestHelper
5050
def assert_emails(number, &block)
5151
if block_given?
5252
original_count = ActionMailer::Base.deliveries.size
53-
perform_enqueued_jobs(only: ->(job) { delivery_job_filter(job) }, &block)
53+
deliver_enqueued_emails(&block)
5454
new_count = ActionMailer::Base.deliveries.size
5555
diff = new_count - original_count
5656
assert_equal number, diff, "#{number} emails expected, but #{diff} were sent"
@@ -208,6 +208,46 @@ def assert_no_enqueued_emails(&block)
208208
assert_enqueued_emails 0, &block
209209
end
210210

211+
# Delivers all enqueued emails. If a block is given, delivers all of the emails
212+
# that were enqueued throughout the duration of the block. If a block is
213+
# not given, delivers all the enqueued emails up to this point in the test.
214+
#
215+
# def test_deliver_enqueued_emails
216+
# deliver_enqueued_emails do
217+
# ContactMailer.welcome.deliver_later
218+
# end
219+
#
220+
# assert_emails 1
221+
# end
222+
#
223+
# def test_deliver_enqueued_emails_without_block
224+
# ContactMailer.welcome.deliver_later
225+
#
226+
# deliver_enqueued_emails
227+
#
228+
# assert_emails 1
229+
# end
230+
#
231+
# If the +:queue+ option is specified,
232+
# then only the emails(s) enqueued to a specific queue will be performed.
233+
#
234+
# def test_deliver_enqueued_emails_with_queue
235+
# deliver_enqueued_emails queue: :external_mailers do
236+
# CustomerMailer.deliver_later_queue_name = :external_mailers
237+
# CustomerMailer.welcome.deliver_later # will be performed
238+
# EmployeeMailer.deliver_later_queue_name = :internal_mailers
239+
# EmployeeMailer.welcome.deliver_later # will not be performed
240+
# end
241+
#
242+
# assert_emails 1
243+
# end
244+
#
245+
# If the +:at+ option is specified, then only delivers emails enqueued to deliver
246+
# immediately or before the given time.
247+
def deliver_enqueued_emails(queue: nil, at: nil, &block)
248+
perform_enqueued_jobs(only: ->(job) { delivery_job_filter(job) }, queue: queue, at: at, &block)
249+
end
250+
211251
private
212252
def delivery_job_filter(job)
213253
job_class = job.is_a?(Hash) ? job.fetch(:job) : job.class

actionmailer/test/test_helper_test.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,68 @@ def test_assert_enqueued_email_with_with_no_block_with_parameterized_args
487487
end
488488
end
489489
end
490+
491+
def test_deliver_enqueued_emails_with_no_block
492+
assert_nothing_raised do
493+
silence_stream($stdout) do
494+
TestHelperMailer.test.deliver_later
495+
deliver_enqueued_emails
496+
end
497+
end
498+
499+
assert_emails(1)
500+
end
501+
502+
def test_deliver_enqueued_emails_with_a_block
503+
assert_nothing_raised do
504+
deliver_enqueued_emails do
505+
silence_stream($stdout) do
506+
TestHelperMailer.test.deliver_later
507+
end
508+
end
509+
end
510+
511+
assert_emails(1)
512+
end
513+
514+
def test_deliver_enqueued_emails_with_custom_delivery_job
515+
assert_nothing_raised do
516+
deliver_enqueued_emails do
517+
silence_stream($stdout) do
518+
CustomDeliveryMailer.test.deliver_later
519+
end
520+
end
521+
end
522+
523+
assert_emails(1)
524+
end
525+
526+
def test_deliver_enqueued_emails_with_custom_queue
527+
assert_nothing_raised do
528+
deliver_enqueued_emails(queue: CustomQueueMailer.deliver_later_queue_name) do
529+
silence_stream($stdout) do
530+
TestHelperMailer.test.deliver_later
531+
CustomQueueMailer.test.deliver_later
532+
end
533+
end
534+
end
535+
536+
assert_emails(1)
537+
assert_enqueued_email_with(TestHelperMailer, :test)
538+
end
539+
540+
def test_deliver_enqueued_emails_with_at
541+
assert_nothing_raised do
542+
deliver_enqueued_emails(at: 1.hour.from_now) do
543+
silence_stream($stdout) do
544+
TestHelperMailer.test.deliver_later
545+
TestHelperMailer.test.deliver_later(wait: 2.hours)
546+
end
547+
end
548+
end
549+
550+
assert_emails(1)
551+
end
490552
end
491553

492554
class AnotherTestHelperMailerTest < ActionMailer::TestCase

0 commit comments

Comments
 (0)