From c6d621d132b8075698e451581e36381fee610e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 16 Mar 2020 14:40:48 -0400 Subject: [PATCH] Remove jobs from queue when performing in tests This makes sure jobs don't run twice if `perform_enqueued_jobs` is called twice without a block. This also mimics the behavior of using `perform_enqueued_jobs` with a block, where at the end of the block performed jobs are not in `enqueued_jobs` but instead in `performed_jobs`. --- activejob/CHANGELOG.md | 13 +++++++++++++ activejob/lib/active_job/test_helper.rb | 1 + activejob/test/cases/test_helper_test.rb | 23 ++++++++++++++++++++--- 3 files changed, 34 insertions(+), 3 deletions(-) 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