aboutsummaryrefslogtreecommitdiffstats
path: root/activejob/test/cases/exceptions_test.rb
blob: 5f56d47e8e48bf7b516f408c7608b2b21a67d3c1 (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
104
105
106
107
108
# frozen_string_literal: true
require "helper"
require "jobs/retry_job"

class ExceptionsTest < ActiveJob::TestCase
  setup do
    JobBuffer.clear
    skip if ActiveJob::Base.queue_adapter.is_a?(ActiveJob::QueueAdapters::InlineAdapter)
  end

  test "successfully retry job throwing exception against defaults" do
    perform_enqueued_jobs do
      RetryJob.perform_later "DefaultsError", 5

      assert_equal [
        "Raised DefaultsError for the 1st time",
        "Raised DefaultsError for the 2nd time",
        "Raised DefaultsError for the 3rd time",
        "Raised DefaultsError for the 4th time",
        "Successfully completed job" ], JobBuffer.values
    end
  end

  test "successfully retry job throwing exception against higher limit" do
    perform_enqueued_jobs do
      RetryJob.perform_later "ShortWaitTenAttemptsError", 9
      assert_equal 9, JobBuffer.values.count
    end
  end

  test "failed retry job when exception kept occurring against defaults" do
    perform_enqueued_jobs do
      begin
        RetryJob.perform_later "DefaultsError", 6
        assert_equal "Raised DefaultsError for the 5th time", JobBuffer.last_value
      rescue DefaultsError
        pass
      end
    end
  end

  test "failed retry job when exception kept occurring against higher limit" do
    perform_enqueued_jobs do
      begin
        RetryJob.perform_later "ShortWaitTenAttemptsError", 11
        assert_equal "Raised ShortWaitTenAttemptsError for the 10th time", JobBuffer.last_value
      rescue ShortWaitTenAttemptsError
        pass
      end
    end
  end

  test "discard job" do
    perform_enqueued_jobs do
      RetryJob.perform_later "DiscardableError", 2
      assert_equal "Raised DiscardableError for the 1st time", JobBuffer.last_value
    end
  end

  test "custom handling of job that exceeds retry attempts" do
    perform_enqueued_jobs do
      RetryJob.perform_later "CustomCatchError", 6
      assert_equal "Dealt with a job that failed to retry in a custom way after 6 attempts", JobBuffer.last_value
    end
  end

  test "long wait job" do
    travel_to Time.now

    perform_enqueued_jobs do
      assert_performed_with at: (Time.now + 3600.seconds).to_i do
        RetryJob.perform_later "LongWaitError", 5
      end
    end
  end

  test "exponentially retrying job" do
    travel_to Time.now

    perform_enqueued_jobs do
      assert_performed_with at: (Time.now + 3.seconds).to_i do
        assert_performed_with at: (Time.now + 18.seconds).to_i do
          assert_performed_with at: (Time.now + 83.seconds).to_i do
            assert_performed_with at: (Time.now + 258.seconds).to_i do
              RetryJob.perform_later "ExponentialWaitTenAttemptsError", 5
            end
          end
        end
      end
    end
  end

  test "custom wait retrying job" do
    travel_to Time.now

    perform_enqueued_jobs do
      assert_performed_with at: (Time.now + 2.seconds).to_i do
        assert_performed_with at: (Time.now + 4.seconds).to_i do
          assert_performed_with at: (Time.now + 6.seconds).to_i do
            assert_performed_with at: (Time.now + 8.seconds).to_i do
              RetryJob.perform_later "CustomWaitTenAttemptsError", 5
            end
          end
        end
      end
    end
  end
end