aboutsummaryrefslogtreecommitdiffstats
path: root/activejob/lib/active_job/test_case.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activejob/lib/active_job/test_case.rb')
-rw-r--r--activejob/lib/active_job/test_case.rb103
1 files changed, 103 insertions, 0 deletions
diff --git a/activejob/lib/active_job/test_case.rb b/activejob/lib/active_job/test_case.rb
new file mode 100644
index 0000000000..0b76fdb5a7
--- /dev/null
+++ b/activejob/lib/active_job/test_case.rb
@@ -0,0 +1,103 @@
+# encoding: utf-8
+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