aboutsummaryrefslogtreecommitdiffstats
path: root/activejob/lib/active_job
diff options
context:
space:
mode:
authorAbdelkader Boudih <terminale@gmail.com>2014-08-29 20:11:17 +0000
committerAbdelkader Boudih <terminale@gmail.com>2014-09-02 07:50:16 +0000
commitfccf3d0b6304a7b8dacad05b63f24cdf41e652df (patch)
tree50450c272fe7264af1f1f12c1ad03225298b20e6 /activejob/lib/active_job
parenteb4245dd17ba66c0551f3d4ed841b471bcf01b91 (diff)
downloadrails-fccf3d0b6304a7b8dacad05b63f24cdf41e652df.tar.gz
rails-fccf3d0b6304a7b8dacad05b63f24cdf41e652df.tar.bz2
rails-fccf3d0b6304a7b8dacad05b63f24cdf41e652df.zip
[ActiveJob] TestCase
Diffstat (limited to 'activejob/lib/active_job')
-rw-r--r--activejob/lib/active_job/queue_adapter.rb5
-rw-r--r--activejob/lib/active_job/queue_adapters/test_adapter.rb118
-rw-r--r--activejob/lib/active_job/test_case.rb95
-rw-r--r--activejob/lib/active_job/test_helper.rb327
4 files changed, 235 insertions, 310 deletions
diff --git a/activejob/lib/active_job/queue_adapter.rb b/activejob/lib/active_job/queue_adapter.rb
index c597093458..fb54aec75e 100644
--- a/activejob/lib/active_job/queue_adapter.rb
+++ b/activejob/lib/active_job/queue_adapter.rb
@@ -6,14 +6,13 @@ module ActiveJob
extend ActiveSupport::Concern
module ClassMethods
- delegate :performed_jobs, :performed_jobs=,
- :enqueued_jobs, :enqueued_jobs=,
- to: ActiveJob::QueueAdapters::TestAdapter
mattr_reader(:queue_adapter) { ActiveJob::QueueAdapters::InlineAdapter }
def queue_adapter=(name_or_adapter)
@@queue_adapter = \
case name_or_adapter
+ when :test
+ ActiveJob::QueueAdapters::TestAdapter.new
when Symbol, String
load_adapter(name_or_adapter)
when Class
diff --git a/activejob/lib/active_job/queue_adapters/test_adapter.rb b/activejob/lib/active_job/queue_adapters/test_adapter.rb
index f7c4d19638..2cab9e946d 100644
--- a/activejob/lib/active_job/queue_adapters/test_adapter.rb
+++ b/activejob/lib/active_job/queue_adapters/test_adapter.rb
@@ -1,76 +1,74 @@
module ActiveJob
module QueueAdapters
class TestAdapter
- mattr_accessor(:perform_enqueued_jobs) { false }
- mattr_accessor(:perform_enqueued_at_jobs) { false }
+ attr_accessor(:perform_enqueued_jobs) { false }
+ attr_accessor(:perform_enqueued_at_jobs) { false }
- class << self
- # 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 enqueued jobs with the TestAdapter so you can check them.
+ def enqueued_jobs
+ @@enqueued_jobs ||= []
+ end
- # Allows you to over write the default enqueued jobs store from an array to some
- # other object. If you just want to clear the store,
- # call ActiveJob::QueueAdapters::TestAdapter.enqueued_jobs.clear.
- #
- # If you place another object here, please make sure it responds to:
- #
- # * << (message)
- # * clear
- # * length
- # * size
- # * and other common Array methods
- def enqueued_jobs=(val)
- @@enqueued_jobs = val
- end
+ # Allows you to over write the default enqueued jobs store from an array to some
+ # other object. If you just want to clear the store,
+ # call ActiveJob::QueueAdapters::TestAdapter.enqueued_jobs.clear.
+ #
+ # If you place another object here, please make sure it responds to:
+ #
+ # * << (message)
+ # * clear
+ # * length
+ # * size
+ # * and other common Array methods
+ def enqueued_jobs=(val)
+ @@enqueued_jobs = val
+ end
- # Provides a store of all the performed jobs with the TestAdapter so you can check them.
- def performed_jobs
- @@performed_jobs ||= []
- end
+ # Provides a store of all the performed jobs with the TestAdapter so you can check them.
+ def performed_jobs
+ @@performed_jobs ||= []
+ end
- # Allows you to over write the default performed jobs store from an array to some
- # other object. If you just want to clear the store,
- # call ActiveJob::QueueAdapters::TestAdapter.performed_jobs.clear.
- #
- # If you place another object here, please make sure it responds to:
- #
- # * << (message)
- # * clear
- # * length
- # * size
- # * and other common Array methods
- def performed_jobs=(val)
- @@performed_jobs = val
- end
+ # Allows you to over write the default performed jobs store from an array to some
+ # other object. If you just want to clear the store,
+ # call ActiveJob::QueueAdapters::TestAdapter.performed_jobs.clear.
+ #
+ # If you place another object here, please make sure it responds to:
+ #
+ # * << (message)
+ # * clear
+ # * length
+ # * size
+ # * and other common Array methods
+ def performed_jobs=(val)
+ @@performed_jobs = val
+ end
- def enqueue(job, *args)
- if perform_enqueued_jobs?
- performed_jobs << {job: job, args: args, queue: job.queue_name}
- job.new.execute(*args)
- else
- enqueued_jobs << {job: job, args: args, queue: job.queue_name}
- end
+ def enqueue(job, *args)
+ if perform_enqueued_jobs?
+ performed_jobs << {job: job, args: args, queue: job.queue_name}
+ job.new.execute(*args)
+ else
+ enqueued_jobs << {job: job, args: args, queue: job.queue_name}
end
+ end
- def enqueue_at(job, timestamp, *args)
- if perform_enqueued_at_jobs?
- performed_jobs << {job: job, args: args, queue: job.queue_name, run_at: timestamp}
- job.new.execute(*args)
- else
- enqueued_jobs << {job: job, args: args, queue: job.queue_name, run_at: timestamp}
- end
+ def enqueue_at(job, timestamp, *args)
+ if perform_enqueued_at_jobs?
+ performed_jobs << {job: job, args: args, queue: job.queue_name, run_at: timestamp}
+ job.new.execute(*args)
+ else
+ enqueued_jobs << {job: job, args: args, queue: job.queue_name, run_at: timestamp}
end
+ end
- private
- def perform_enqueued_jobs?
- perform_enqueued_jobs
- end
+ private
+ def perform_enqueued_jobs?
+ perform_enqueued_jobs
+ end
- def perform_enqueued_at_jobs?
- perform_enqueued_at_jobs
- end
+ def perform_enqueued_at_jobs?
+ perform_enqueued_at_jobs
end
end
end
diff --git a/activejob/lib/active_job/test_case.rb b/activejob/lib/active_job/test_case.rb
index 0b76fdb5a7..f22e4e2ead 100644
--- a/activejob/lib/active_job/test_case.rb
+++ b/activejob/lib/active_job/test_case.rb
@@ -2,102 +2,7 @@
require 'active_support/test_case'
module ActiveJob
- class NonInferrableJobError < ::StandardError
- def initialize(name)
- super "Unable to determine the job to test from #{name}. " \
- "You'll need to specify it using 'tests YourJob' in your " \
- 'test case definition'
- end
- end
-
class TestCase < ActiveSupport::TestCase
- module Behavior
- extend ActiveSupport::Concern
-
- include ActiveSupport::Testing::ConstantLookup
include ActiveJob::TestHelper
-
- included do
- class_attribute :_job_class
- setup :initialize_test_adapter
- teardown :restore_previous_adapter
- end
-
- module ClassMethods
- def tests(job)
- case job
- when String, Symbol
- self._job_class = job.to_s.camelize.constantize
- when Module
- self._job_class = job
- else
- fail NonInferrableJobError.new(job)
- end
- end
-
- def job_class
- if job = _job_class
- job
- else
- tests determine_default_job(name)
- end
- end
-
- def determine_default_job(name)
- job = determine_constant_from_test_name(name) do |constant|
- Class === constant && constant < ActiveJob::Base
- end
- fail NonInferrableJobError.new(name) if job.nil?
- job
- end
- end
-
- protected
- def initialize_test_adapter
- @old_adapter = ActiveJob::Base.queue_adapter
- ActiveJob::Base.queue_adapter = :test
- save_test_adapter_behavior
- end
-
- def save_test_adapter_behavior
- @old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
- @old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
- end
-
- def restore_test_adapter_behavior
- queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
- queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
- end
-
- def restore_previous_adapter
- restore_test_adapter_behavior
- ActiveJob::Base.queue_adapter = @old_adapter
- ActiveJob::Base.performed_jobs.clear
- ActiveJob::Base.enqueued_jobs.clear
- end
-
- def perform_enqueued_jobs
- queue_adapter.perform_enqueued_jobs = true
- end
-
- def perform_enqueued_at_jobs
- queue_adapter.perform_enqueued_at_jobs = true
- end
-
- def enqueue_jobs
- queue_adapter.perform_enqueued_jobs = false
- end
-
- def enqueue_at_jobs
- queue_adapter.perform_enqueued_at_jobs = false
- end
-
- private
- def queue_adapter
- ActiveJob::Base.queue_adapter
- end
- end
-
- include Behavior
end
end
diff --git a/activejob/lib/active_job/test_helper.rb b/activejob/lib/active_job/test_helper.rb
index d147e56709..2323ca13db 100644
--- a/activejob/lib/active_job/test_helper.rb
+++ b/activejob/lib/active_job/test_helper.rb
@@ -2,169 +2,192 @@
module ActiveJob
# Provides helper methods for testing Active Job
module TestHelper
- # Asserts that the number of enqueued jobs matches the given number.
- #
- # def test_jobs
- # assert_enqueued_jobs 0
- # HelloJob.enqueue('david')
- # assert_enqueued_jobs 1
- # HelloJob.enqueue('abdelkader')
- # assert_enqueued_jobs 2
- # end
- #
- # If a block is passed, that block should cause the specified number of
- # jobs to be enqueued.
- #
- # def test_jobs_again
- # assert_enqueued_jobs 1 do
- # HelloJob.enqueue('cristian')
- # end
- #
- # assert_enqueued_jobs 2 do
- # HelloJob.enqueue('aaron')
- # HelloJob.enqueue('rafael')
- # end
- # end
- def assert_enqueued_jobs(number)
- if block_given?
- original_count = enqueued_jobs.size
- yield
- new_count = enqueued_jobs.size
- assert_equal original_count + number, new_count,
- "#{number} job expected, but #{new_count - original_count} were enqueued"
- else
- assert_equal number, enqueued_jobs.size
- end
- end
+ extend ActiveSupport::Concern
+ include ActiveSupport::Testing::ConstantLookup
- # Assert that no job have been enqueued.
- #
- # def test_jobs
- # assert_no_enqueued_jobs
- # HelloJob.enqueue('jeremy')
- # assert_enqueued_jobs 1
- # end
- #
- # If a block is passed, that block should not cause any job to be enqueued.
- #
- # def test_jobs_again
- # assert_no_enqueued_jobs do
- # # No job should be enqueued from this block
- # end
- # end
- #
- # Note: This assertion is simply a shortcut for:
- #
- # assert_enqueued_jobs 0
- def assert_no_enqueued_jobs(&block)
- assert_enqueued_jobs 0, &block
- end
+ included do
+ class_attribute :_job_class
+ setup :initialize_queue_test_adapter
- # Asserts that the number of performed jobs matches the given number.
- #
- # def test_jobs
- # assert_performed_jobs 0
- # HelloJob.enqueue('xavier')
- # assert_performed_jobs 1
- # HelloJob.enqueue('yves')
- # assert_performed_jobs 2
- # end
- #
- # If a block is passed, that block should cause the specified number of
- # jobs to be performed.
- #
- # def test_jobs_again
- # assert_performed_jobs 1 do
- # HelloJob.enqueue('robin')
- # end
- #
- # assert_performed_jobs 2 do
- # HelloJob.enqueue('carlos')
- # HelloJob.enqueue('sean')
- # end
- # end
- def assert_performed_jobs(number)
- if block_given?
- original_count = self.class.job_class.performed_jobs.size
- yield
- new_count = performed_jobs.size
- assert_equal original_count + number, new_count,
- "#{number} job expected, but #{new_count - original_count} were performed"
- else
- assert_equal number, performed_jobs.size
+ # Asserts that the number of enqueued jobs matches the given number.
+ #
+ # def test_jobs
+ # assert_enqueued_jobs 0
+ # HelloJob.enqueue('david')
+ # assert_enqueued_jobs 1
+ # HelloJob.enqueue('abdelkader')
+ # assert_enqueued_jobs 2
+ # end
+ #
+ # If a block is passed, that block should cause the specified number of
+ # jobs to be enqueued.
+ #
+ # def test_jobs_again
+ # assert_enqueued_jobs 1 do
+ # HelloJob.enqueue('cristian')
+ # end
+ #
+ # assert_enqueued_jobs 2 do
+ # HelloJob.enqueue('aaron')
+ # HelloJob.enqueue('rafael')
+ # end
+ # end
+ def assert_enqueued_jobs(number)
+ if block_given?
+ original_count = enqueued_jobs.size
+ yield
+ new_count = enqueued_jobs.size
+ assert_equal original_count + number, new_count,
+ "#{number} jobs expected, but #{new_count - original_count} were enqueued"
+ else
+ assert_equal number, enqueued_jobs.size
+ end
end
- end
- # Assert that no job have been performed.
- #
- # def test_jobs
- # assert_no_performed_jobs
- # HelloJob.enqueue('matthew')
- # assert_performed_jobs 1
- # end
- #
- # If a block is passed, that block should not cause any job to be performed.
- #
- # def test_jobs_again
- # assert_no_performed_jobs do
- # # No job should be performed from this block
- # end
- # end
- #
- # Note: This assertion is simply a shortcut for:
- #
- # assert_performed_jobs 0
- def assert_no_performed_jobs(&block)
- assert_performed_jobs 0, &block
- end
+ # Assert that no job have been enqueued.
+ #
+ # def test_jobs
+ # assert_no_enqueued_jobs
+ # HelloJob.enqueue('jeremy')
+ # assert_enqueued_jobs 1
+ # end
+ #
+ # If a block is passed, that block should not cause any job to be enqueued.
+ #
+ # def test_jobs_again
+ # assert_no_enqueued_jobs do
+ # # No job should be enqueued from this block
+ # end
+ # end
+ #
+ # Note: This assertion is simply a shortcut for:
+ #
+ # assert_enqueued_jobs 0
+ def assert_no_enqueued_jobs(&block)
+ assert_enqueued_jobs 0, &block
+ end
- # Assert that a job was enqueued in the block matches the args
- #
- # def assert_enqueued_job
- # assert_enqueued_job(job: MyJob, args: [1,2,3], queue: 'low') do
- # MyJob.enqueue(1,2,3)
- # end
- # end
- def assert_enqueued_job(args = {}, &_block)
- original_enqueued_jobs = enqueued_jobs
- enqueued_jobs.clear
- args.assert_valid_keys(:job, :args, :at, :queue)
- yield
- matching_job = enqueued_jobs.any? do |job|
- args.all? { |key, value| value == job[key] }
+ # Asserts that the number of performed jobs matches the given number.
+ #
+ # def test_jobs
+ # assert_performed_jobs 0
+ # HelloJob.enqueue('xavier')
+ # assert_performed_jobs 1
+ # HelloJob.enqueue('yves')
+ # assert_performed_jobs 2
+ # end
+ #
+ # If a block is passed, that block should cause the specified number of
+ # jobs to be performed.
+ #
+ # def test_jobs_again
+ # assert_performed_jobs 1 do
+ # HelloJob.enqueue('robin')
+ # end
+ #
+ # assert_performed_jobs 2 do
+ # HelloJob.enqueue('carlos')
+ # HelloJob.enqueue('sean')
+ # end
+ # end
+ def assert_performed_jobs(number)
+ if block_given?
+ original_count = performed_jobs.size
+ yield
+ new_count = performed_jobs.size
+ assert_equal original_count + number, new_count,
+ "#{number} jobs expected, but #{new_count - original_count} were performed"
+ else
+ assert_equal number, performed_jobs.size
+ end
end
- assert matching_job
- ensure
- ActiveJob::Base.enqueued_jobs = original_enqueued_jobs + enqueued_jobs
- end
- # Assert that a job was performed in the block matches the args
- #
- # def assert_performed_job
- # assert_performed_job(job: MyJob, args: [1,2,3], queue: 'high') do
- # MyJob.enqueue(1,2,3)
- # end
- # end
- def assert_performed_job(args = {}, &_block)
- original_performed_jobs = performed_jobs
- performed_jobs.clear
- args.assert_valid_keys(:job, :args, :at, :queue)
- yield
- matching_job = performed_jobs.any? do |job|
- args.all? { |key, value| value == job[key] }
+ # Asserts that no jobs have been performed.
+ #
+ # def test_jobs
+ # assert_no_performed_jobs
+ # HelloJob.enqueue('matthew')
+ # assert_performed_jobs 1
+ # end
+ #
+ # If a block is passed, that block should not cause any job to be performed.
+ #
+ # def test_jobs_again
+ # assert_no_performed_jobs do
+ # # No job should be performed from this block
+ # end
+ # end
+ #
+ # Note: This assertion is simply a shortcut for:
+ #
+ # assert_performed_jobs 0
+ def assert_no_performed_jobs(&block)
+ assert_performed_jobs 0, &block
end
- assert matching_job, "No performed job found with #{args}"
- ensure
- ActiveJob::Base.performed_jobs = original_performed_jobs + performed_jobs
- end
- private
- def enqueued_jobs
- ActiveJob::Base.enqueued_jobs
+ # Asserts that the job passed in the block has been enqueued with the given arguments.
+ #
+ # def assert_enqueued_job
+ # assert_enqueued_with(job: MyJob, args: [1,2,3], queue: 'low') do
+ # MyJob.enqueue(1,2,3)
+ # end
+ # end
+ def assert_enqueued_with(args = {}, &_block)
+ original_enqueued_jobs = enqueued_jobs.dup
+ clear_enqueued_jobs
+ args.assert_valid_keys(:job, :args, :at, :queue)
+ yield
+ matching_job = enqueued_jobs.any? do |job|
+ args.all? { |key, value| value == job[key] }
+ end
+ assert matching_job
+ ensure
+ queue_adapter.enqueued_jobs = original_enqueued_jobs + enqueued_jobs
end
- def performed_jobs
- ActiveJob::Base.performed_jobs
+ # Asserts that the job passed in the block has been performed with the given arguments.
+ #
+ # def test_assert_performed_with
+ # assert_performed_with(job: MyJob, args: [1,2,3], queue: 'high') do
+ # MyJob.enqueue(1,2,3)
+ # end
+ # end
+ def assert_performed_with(args = {}, &_block)
+ original_performed_jobs = performed_jobs.dup
+ clear_performed_jobs
+ args.assert_valid_keys(:job, :args, :at, :queue)
+ yield
+ matching_job = performed_jobs.any? do |job|
+ args.all? { |key, value| value == job[key] }
+ end
+ assert matching_job, "No performed job found with #{args}"
+ ensure
+ queue_adapter.performed_jobs = original_performed_jobs + performed_jobs
+ end
+
+
+ def queue_adapter
+ ActiveJob::Base.queue_adapter
end
+
+ delegate :enqueued_jobs, :enqueued_jobs=,
+ :performed_jobs, :performed_jobs=,
+ to: :queue_adapter
+
+ private
+ def initialize_queue_test_adapter
+ ActiveJob::Base.queue_adapter = :test
+ clear_enqueued_jobs
+ clear_performed_jobs
+ end
+
+ def clear_enqueued_jobs
+ enqueued_jobs.clear
+ end
+
+ def clear_performed_jobs
+ performed_jobs.clear
+ end
+ end
end
end