lib/active_job/test_helper.rb in activejob-5.1.7 vs lib/active_job/test_helper.rb in activejob-5.2.0.beta1
- old
+ new
@@ -1,5 +1,7 @@
+# frozen_string_literal: true
+
require "active_support/core_ext/class/subclasses"
require "active_support/core_ext/hash/keys"
module ActiveJob
# Provides helper methods for testing Active Job
@@ -85,35 +87,44 @@
# HelloJob.perform_later('aaron')
# HelloJob.perform_later('rafael')
# end
# end
#
- # The number of times a specific job is enqueued can be asserted.
+ # The number of times a specific job was enqueued can be asserted.
#
# def test_logging_job
# assert_enqueued_jobs 1, only: LoggingJob do
# LoggingJob.perform_later
# HelloJob.perform_later('jeremy')
# end
# end
#
+ # The number of times a job except specific class was enqueued can be asserted.
+ #
+ # def test_logging_job
+ # assert_enqueued_jobs 1, except: HelloJob do
+ # LoggingJob.perform_later
+ # HelloJob.perform_later('jeremy')
+ # end
+ # end
+ #
# The number of times a job is enqueued to a specific queue can also be asserted.
#
# def test_logging_job
# assert_enqueued_jobs 2, queue: 'default' do
# LoggingJob.perform_later
# HelloJob.perform_later('elfassy')
# end
# end
- def assert_enqueued_jobs(number, only: nil, queue: nil)
+ def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil)
if block_given?
- original_count = enqueued_jobs_size(only: only, queue: queue)
+ original_count = enqueued_jobs_size(only: only, except: except, queue: queue)
yield
- new_count = enqueued_jobs_size(only: only, queue: queue)
+ new_count = enqueued_jobs_size(only: only, except: except, queue: queue)
assert_equal number, new_count - original_count, "#{number} jobs expected, but #{new_count - original_count} were enqueued"
else
- actual_count = enqueued_jobs_size(only: only, queue: queue)
+ actual_count = enqueued_jobs_size(only: only, except: except, queue: queue)
assert_equal number, actual_count, "#{number} jobs expected, but #{actual_count} were enqueued"
end
end
# Asserts that no jobs have been enqueued.
@@ -138,15 +149,23 @@
# assert_no_enqueued_jobs only: LoggingJob do
# HelloJob.perform_later('jeremy')
# end
# end
#
+ # It can be asserted that no jobs except specific class are enqueued:
+ #
+ # def test_no_logging
+ # assert_no_enqueued_jobs except: HelloJob do
+ # HelloJob.perform_later('jeremy')
+ # end
+ # end
+ #
# Note: This assertion is simply a shortcut for:
#
# assert_enqueued_jobs 0, &block
- def assert_no_enqueued_jobs(only: nil, &block)
- assert_enqueued_jobs 0, only: only, &block
+ def assert_no_enqueued_jobs(only: nil, except: nil, &block)
+ assert_enqueued_jobs 0, only: only, except: except, &block
end
# Asserts that the number of performed jobs matches the given number.
# If no block is passed, <tt>perform_enqueued_jobs</tt>
# must be called around the job call.
@@ -187,10 +206,20 @@
# HelloJob.perform_later('jeremy')
# LoggingJob.perform_later
# end
# end
#
+ # Also if the :except option is specified,
+ # then the job(s) except specific class will be performed.
+ #
+ # def test_hello_job
+ # assert_performed_jobs 1, except: LoggingJob do
+ # HelloJob.perform_later('jeremy')
+ # LoggingJob.perform_later
+ # end
+ # end
+ #
# An array may also be specified, to support testing multiple jobs.
#
# def test_hello_and_logging_jobs
# assert_nothing_raised do
# assert_performed_jobs 2, only: [HelloJob, LoggingJob] do
@@ -198,14 +227,14 @@
# LoggingJob.perform_later('stewie')
# RescueJob.perform_later('david')
# end
# end
# end
- def assert_performed_jobs(number, only: nil)
+ def assert_performed_jobs(number, only: nil, except: nil)
if block_given?
original_count = performed_jobs.size
- perform_enqueued_jobs(only: only) { yield }
+ perform_enqueued_jobs(only: only, except: except) { yield }
new_count = performed_jobs.size
assert_equal number, new_count - original_count,
"#{number} jobs expected, but #{new_count - original_count} were performed"
else
performed_jobs_size = performed_jobs.size
@@ -239,15 +268,24 @@
# assert_no_performed_jobs only: LoggingJob do
# HelloJob.perform_later('jeremy')
# end
# end
#
+ # Also if the :except option is specified,
+ # then the job(s) except specific class will not be performed.
+ #
+ # def test_no_logging
+ # assert_no_performed_jobs except: HelloJob do
+ # HelloJob.perform_later('jeremy')
+ # end
+ # end
+ #
# Note: This assertion is simply a shortcut for:
#
# assert_performed_jobs 0, &block
- def assert_no_performed_jobs(only: nil, &block)
- assert_performed_jobs 0, only: only, &block
+ def assert_no_performed_jobs(only: nil, except: nil, &block)
+ assert_performed_jobs 0, only: only, except: except, &block
end
# Asserts that the job passed in the block has been enqueued with the given arguments.
#
# def test_assert_enqueued_with
@@ -313,24 +351,40 @@
# MyJob.perform_later(1, 2, 3) # will be performed
# HelloJob.perform_later(1, 2, 3) # will not be performed
# end
# assert_performed_jobs 1
# end
- def perform_enqueued_jobs(only: nil)
+ #
+ # Also if the +:except+ option is specified,
+ # then the job(s) except specific class will be performed.
+ #
+ # def test_perform_enqueued_jobs_with_except
+ # perform_enqueued_jobs(except: HelloJob) do
+ # MyJob.perform_later(1, 2, 3) # will be performed
+ # HelloJob.perform_later(1, 2, 3) # will not be performed
+ # end
+ # assert_performed_jobs 1
+ # end
+ #
+ def perform_enqueued_jobs(only: nil, except: nil)
+ validate_option(only: only, except: except)
old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
old_filter = queue_adapter.filter
+ old_reject = queue_adapter.reject
begin
queue_adapter.perform_enqueued_jobs = true
queue_adapter.perform_enqueued_at_jobs = true
queue_adapter.filter = only
+ queue_adapter.reject = except
yield
ensure
queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
queue_adapter.filter = old_filter
+ queue_adapter.reject = old_reject
end
end
# Accesses the queue_adapter set by ActiveJob::Base.
#
@@ -348,15 +402,18 @@
def clear_performed_jobs
performed_jobs.clear
end
- def enqueued_jobs_size(only: nil, queue: nil)
+ def enqueued_jobs_size(only: nil, except: nil, queue: nil)
+ validate_option(only: only, except: except)
enqueued_jobs.count do |job|
job_class = job.fetch(:job)
if only
next false unless Array(only).include?(job_class)
+ elsif except
+ next false if Array(except).include?(job_class)
end
if queue
next false unless queue.to_s == job.fetch(:queue, job_class.queue_name)
end
true
@@ -380,8 +437,12 @@
def queue_adapter_changed_jobs
(ActiveJob::Base.descendants << ActiveJob::Base).select do |klass|
# only override explicitly set adapters, a quirk of `class_attribute`
klass.singleton_class.public_instance_methods(false).include?(:_queue_adapter)
end
+ end
+
+ def validate_option(only: nil, except: nil)
+ raise ArgumentError, "Cannot specify both `:only` and `:except` options." if only && except
end
end
end