diff --git a/activejob/CHANGELOG.md b/activejob/CHANGELOG.md index a5f7291062..61691842d7 100644 --- a/activejob/CHANGELOG.md +++ b/activejob/CHANGELOG.md @@ -1,3 +1,16 @@ +* `ActiveJob::TestCase#perform_enqueued_jobs` without a block removes performed jobs from the queue. + + That way the helper can be called multiple times and not perform a job invocation multiple times. + + ```ruby + def test_jobs + HelloJob.perform_later("rafael") + perform_enqueued_jobs + HelloJob.perform_later("david") + perform_enqueued_jobs # only runs with "david" + end + ``` + * `ActiveJob::TestCase#perform_enqueued_jobs` will no longer perform retries: When calling `perform_enqueued_jobs` without a block, the adapter will diff --git a/activejob/lib/active_job/test_helper.rb b/activejob/lib/active_job/test_helper.rb index b21993283e..a3af643f3a 100644 --- a/activejob/lib/active_job/test_helper.rb +++ b/activejob/lib/active_job/test_helper.rb @@ -641,6 +641,7 @@ module ActiveJob def flush_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil) enqueued_jobs_with(only: only, except: except, queue: queue, at: at) do |payload| + queue_adapter.enqueued_jobs.delete(payload) queue_adapter.performed_jobs << payload instantiate_job(payload).perform_now end diff --git a/activejob/test/cases/test_helper_test.rb b/activejob/test/cases/test_helper_test.rb index 14f7d5ae62..ccb5df3f09 100644 --- a/activejob/test/cases/test_helper_test.rb +++ b/activejob/test/cases/test_helper_test.rb @@ -927,7 +927,24 @@ class PerformedJobsTest < ActiveJob::TestCase end assert_equal(1, performed_jobs.size) - assert_equal(2, enqueued_jobs.size) + assert_equal(1, enqueued_jobs.size) + end + + def test_perform_enqueued_jobs_without_block_removes_from_enqueued_jobs + HelloJob.perform_later("rafael") + assert_equal(0, performed_jobs.size) + assert_equal(1, enqueued_jobs.size) + perform_enqueued_jobs + assert_equal(1, performed_jobs.size) + assert_equal(0, enqueued_jobs.size) + end + + def test_perform_enqueued_jobs_without_block_only_performs_once + JobBuffer.clear + RescueJob.perform_later("no exception") + perform_enqueued_jobs + perform_enqueued_jobs + assert_equal(1, JobBuffer.values.size) end def test_assert_performed_jobs @@ -1881,11 +1898,11 @@ class PerformedJobsTest < ActiveJob::TestCase perform_enqueued_jobs assert_performed_with(job: HelloJob) - perform_enqueued_jobs HelloJob.perform_later + perform_enqueued_jobs assert_performed_with(job: HelloJob) - assert_equal 2, queue_adapter.enqueued_jobs.count + assert_equal 0, queue_adapter.enqueued_jobs.count assert_equal 2, queue_adapter.performed_jobs.count end