1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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: * `ActiveJob::TestCase#perform_enqueued_jobs` will no longer perform retries:
When calling `perform_enqueued_jobs` without a block, the adapter will 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) 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| enqueued_jobs_with(only: only, except: except, queue: queue, at: at) do |payload|
queue_adapter.enqueued_jobs.delete(payload)
queue_adapter.performed_jobs << payload queue_adapter.performed_jobs << payload
instantiate_job(payload).perform_now instantiate_job(payload).perform_now
end end

View file

@ -927,7 +927,24 @@ class PerformedJobsTest < ActiveJob::TestCase
end end
assert_equal(1, performed_jobs.size) 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 end
def test_assert_performed_jobs def test_assert_performed_jobs
@ -1881,11 +1898,11 @@ class PerformedJobsTest < ActiveJob::TestCase
perform_enqueued_jobs perform_enqueued_jobs
assert_performed_with(job: HelloJob) assert_performed_with(job: HelloJob)
perform_enqueued_jobs
HelloJob.perform_later HelloJob.perform_later
perform_enqueued_jobs
assert_performed_with(job: HelloJob) 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 assert_equal 2, queue_adapter.performed_jobs.count
end end