mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
cdb16ac576
- That feature is useful to enqueue or assert that jobs got enqueued or performed based on dynamic conditions. We will be able to leverage that feature to fix all ActionMailer assertion helper issue when a Mailer define a custom delivery job (see next commit).
81 lines
2.3 KiB
Ruby
81 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ActiveJob
|
|
module QueueAdapters
|
|
# == Test adapter for Active Job
|
|
#
|
|
# The test adapter should be used only in testing. Along with
|
|
# <tt>ActiveJob::TestCase</tt> and <tt>ActiveJob::TestHelper</tt>
|
|
# it makes a great tool to test your Rails application.
|
|
#
|
|
# To use the test adapter set queue_adapter config to +:test+.
|
|
#
|
|
# Rails.application.config.active_job.queue_adapter = :test
|
|
class TestAdapter
|
|
attr_accessor(:perform_enqueued_jobs, :perform_enqueued_at_jobs, :filter, :reject, :queue)
|
|
attr_writer(:enqueued_jobs, :performed_jobs)
|
|
|
|
# Provides a store of all the enqueued jobs with the TestAdapter so you can check them.
|
|
def enqueued_jobs
|
|
@enqueued_jobs ||= []
|
|
end
|
|
|
|
# Provides a store of all the performed jobs with the TestAdapter so you can check them.
|
|
def performed_jobs
|
|
@performed_jobs ||= []
|
|
end
|
|
|
|
def enqueue(job) #:nodoc:
|
|
return if filtered?(job)
|
|
|
|
job_data = job_to_hash(job)
|
|
perform_or_enqueue(perform_enqueued_jobs, job, job_data)
|
|
end
|
|
|
|
def enqueue_at(job, timestamp) #:nodoc:
|
|
return if filtered?(job)
|
|
|
|
job_data = job_to_hash(job, at: timestamp)
|
|
perform_or_enqueue(perform_enqueued_at_jobs, job, job_data)
|
|
end
|
|
|
|
private
|
|
def job_to_hash(job, extras = {})
|
|
{ job: job.class, args: job.serialize.fetch("arguments"), queue: job.queue_name }.merge!(extras)
|
|
end
|
|
|
|
def perform_or_enqueue(perform, job, job_data)
|
|
if perform
|
|
performed_jobs << job_data
|
|
Base.execute job.serialize
|
|
else
|
|
enqueued_jobs << job_data
|
|
end
|
|
end
|
|
|
|
def filtered?(job)
|
|
filtered_queue?(job) || filtered_job_class?(job)
|
|
end
|
|
|
|
def filtered_queue?(job)
|
|
if queue
|
|
job.queue_name != queue.to_s
|
|
end
|
|
end
|
|
|
|
def filtered_job_class?(job)
|
|
if filter
|
|
!filter_as_proc(filter).call(job)
|
|
elsif reject
|
|
filter_as_proc(reject).call(job)
|
|
end
|
|
end
|
|
|
|
def filter_as_proc(filter)
|
|
return filter if filter.is_a?(Proc)
|
|
|
|
->(job) { Array(filter).include?(job.class) }
|
|
end
|
|
end
|
|
end
|
|
end
|