diff options
Diffstat (limited to 'activejob/lib/active_job/test_case.rb')
-rw-r--r-- | activejob/lib/active_job/test_case.rb | 103 |
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 |