aboutsummaryrefslogtreecommitdiffstats
path: root/activejob/lib/active_job/test_case.rb
blob: 0b76fdb5a7c3e0ae0ffc5b3104699fe7ba526a60 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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