95b6fbd00f
It's possible since Rails 6 (3ea2857943dc294d7809930b4cc5b318b9c39577) to let the framework create Event objects, but the guides and docs weren't updated to lead with this example. Manually instantiating an Event doesn't record CPU time and allocations, I've seen it more than once that people copy-pasting the example code get confused about these stats returning 0. The tests here show that - just like the apps I've worked on - the old pattern keeps getting copy-pasted.
106 lines
3.3 KiB
Ruby
106 lines
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "helper"
|
|
require "jobs/hello_job"
|
|
require "jobs/enqueue_error_job"
|
|
require "jobs/multiple_kwargs_job"
|
|
require "active_support/core_ext/numeric/time"
|
|
require "minitest/mock"
|
|
|
|
class QueuingTest < ActiveSupport::TestCase
|
|
setup do
|
|
JobBuffer.clear
|
|
end
|
|
|
|
test "run queued job" do
|
|
HelloJob.perform_later
|
|
assert_equal "David says hello", JobBuffer.last_value
|
|
end
|
|
|
|
test "run queued job with arguments" do
|
|
HelloJob.perform_later "Jamie"
|
|
assert_equal "Jamie says hello", JobBuffer.last_value
|
|
end
|
|
|
|
test "run queued job later" do
|
|
result = HelloJob.set(wait_until: 1.second.ago).perform_later "Jamie"
|
|
assert result
|
|
rescue NotImplementedError
|
|
skip
|
|
end
|
|
|
|
test "job returned by enqueue has the arguments available" do
|
|
job = HelloJob.perform_later "Jamie"
|
|
assert_equal [ "Jamie" ], job.arguments
|
|
end
|
|
|
|
test "job returned by perform_at has the timestamp available" do
|
|
job = HelloJob.set(wait_until: Time.utc(2014, 1, 1)).perform_later
|
|
assert_equal Time.utc(2014, 1, 1), job.scheduled_at
|
|
rescue NotImplementedError
|
|
skip
|
|
end
|
|
|
|
test "job is yielded to block after enqueue with successfully_enqueued property set" do
|
|
HelloJob.perform_later "John" do |job|
|
|
assert_equal "John says hello", JobBuffer.last_value
|
|
assert_equal [ "John" ], job.arguments
|
|
assert_equal true, job.successfully_enqueued?
|
|
assert_nil job.enqueue_error
|
|
end
|
|
end
|
|
|
|
test "when enqueuing raises an EnqueueError job is yielded to block with error set on job" do
|
|
EnqueueErrorJob.perform_later do |job|
|
|
assert_equal false, job.successfully_enqueued?
|
|
assert_equal ActiveJob::EnqueueError, job.enqueue_error.class
|
|
end
|
|
end
|
|
|
|
test "run multiple queued jobs" do
|
|
ActiveJob.perform_all_later(HelloJob.new("Jamie"), HelloJob.new("John"))
|
|
assert_equal ["Jamie says hello", "John says hello"], JobBuffer.values.sort
|
|
end
|
|
|
|
test "run multiple queued jobs passed as array" do
|
|
ActiveJob.perform_all_later([HelloJob.new("Jamie"), HelloJob.new("John")])
|
|
assert_equal ["Jamie says hello", "John says hello"], JobBuffer.values.sort
|
|
end
|
|
|
|
test "run multiple queued jobs of different classes" do
|
|
ActiveJob.perform_all_later([HelloJob.new("Jamie"), MultipleKwargsJob.new(argument1: "John", argument2: 42)])
|
|
assert_equal ["Jamie says hello", "Job with argument1: John, argument2: 42"], JobBuffer.values.sort
|
|
end
|
|
|
|
test "perform_all_later enqueues jobs with schedules" do
|
|
scheduled_job_1 = HelloJob.new("Scheduled 2014")
|
|
scheduled_job_1.set(wait_until: Time.utc(2014, 1, 1))
|
|
|
|
scheduled_job_2 = HelloJob.new("Scheduled 2015")
|
|
scheduled_job_2.scheduled_at = Time.utc(2015, 1, 1)
|
|
|
|
ActiveJob.perform_all_later(scheduled_job_1, scheduled_job_2)
|
|
assert_equal ["Scheduled 2014 says hello", "Scheduled 2015 says hello"], JobBuffer.values.sort
|
|
rescue NotImplementedError
|
|
skip
|
|
end
|
|
|
|
test "perform_all_later instrumentation" do
|
|
jobs = HelloJob.new("Jamie"), HelloJob.new("John")
|
|
called = false
|
|
|
|
subscriber = proc do |_, _, _, _, payload|
|
|
called = true
|
|
assert payload[:adapter]
|
|
assert_equal jobs, payload[:jobs]
|
|
assert_equal 2, payload[:enqueued_count]
|
|
end
|
|
|
|
ActiveSupport::Notifications.subscribed(subscriber, "enqueue_all.active_job") do
|
|
ActiveJob.perform_all_later(jobs)
|
|
end
|
|
|
|
assert called
|
|
end
|
|
end
|