Merge PR #43066
This commit is contained in:
commit
6fb54c00e4
|
@ -1,3 +1,32 @@
|
||||||
|
* Allow testing `discard_on/retry_on ActiveJob::DeserializationError`
|
||||||
|
|
||||||
|
Previously in `perform_enqueued_jobs`, `deserialize_arguments_if_needed`
|
||||||
|
was called before calling `perform_now`. When a record no longer exists
|
||||||
|
and is serialized using GlobalID this led to raising
|
||||||
|
an `ActiveJob::DeserializationError` before reaching `perform_now` call.
|
||||||
|
This behaviour makes difficult testing the job `discard_on/retry_on` logic.
|
||||||
|
|
||||||
|
Now `deserialize_arguments_if_needed` call is postponed to when `perform_now`
|
||||||
|
is called.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class UpdateUserJob < ActiveJob::Base
|
||||||
|
discard_on ActiveJob::DeserializationError
|
||||||
|
|
||||||
|
def perform(user)
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# In the test
|
||||||
|
User.destroy_all
|
||||||
|
assert_nothing_raised do
|
||||||
|
perform_enqueued_jobs only: UpdateUserJob
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
*Jacopo Beschi*
|
||||||
|
|
||||||
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
|
Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activejob/CHANGELOG.md) for previous changes.
|
||||||
|
|
|
@ -688,7 +688,7 @@ module ActiveJob
|
||||||
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.enqueued_jobs.delete(payload)
|
||||||
queue_adapter.performed_jobs << payload
|
queue_adapter.performed_jobs << payload
|
||||||
instantiate_job(payload).perform_now
|
instantiate_job(payload, skip_deserialize_arguments: true).perform_now
|
||||||
end.count
|
end.count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -708,10 +708,10 @@ module ActiveJob
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def instantiate_job(payload)
|
def instantiate_job(payload, skip_deserialize_arguments: false)
|
||||||
job = payload[:job].deserialize(payload)
|
job = payload[:job].deserialize(payload)
|
||||||
job.scheduled_at = Time.at(payload[:at]) if payload.key?(:at)
|
job.scheduled_at = Time.at(payload[:at]) if payload.key?(:at)
|
||||||
job.send(:deserialize_arguments_if_needed)
|
job.send(:deserialize_arguments_if_needed) unless skip_deserialize_arguments
|
||||||
job
|
job
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ require "jobs/logging_job"
|
||||||
require "jobs/nested_job"
|
require "jobs/nested_job"
|
||||||
require "jobs/rescue_job"
|
require "jobs/rescue_job"
|
||||||
require "jobs/raising_job"
|
require "jobs/raising_job"
|
||||||
|
require "jobs/retry_job"
|
||||||
require "jobs/inherited_job"
|
require "jobs/inherited_job"
|
||||||
require "jobs/multiple_kwargs_job"
|
require "jobs/multiple_kwargs_job"
|
||||||
require "models/person"
|
require "models/person"
|
||||||
|
@ -2027,6 +2028,14 @@ class PerformedJobsTest < ActiveJob::TestCase
|
||||||
assert_equal 2, queue_adapter.performed_jobs.count
|
assert_equal 2, queue_adapter.performed_jobs.count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "perform_enqueued_jobs doesn't raise if discard_on ActiveJob::DeserializationError" do
|
||||||
|
RetryJob.perform_later Person.new(404), 1
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
perform_enqueued_jobs(only: RetryJob)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
test "TestAdapter respect max attempts" do
|
test "TestAdapter respect max attempts" do
|
||||||
perform_enqueued_jobs(only: RaisingJob) do
|
perform_enqueued_jobs(only: RaisingJob) do
|
||||||
assert_raises(RaisingJob::MyError) do
|
assert_raises(RaisingJob::MyError) do
|
||||||
|
|
Loading…
Reference in New Issue