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`.
This commit is contained in:
Étienne Barrié 2020-03-16 14:40:48 -04:00
parent 78aa157d79
commit c6d621d132
3 changed files with 34 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -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