File: test_retry_exhausted.rb

package info (click to toggle)
ruby-sidekiq 4.2.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,064 kB
  • ctags: 754
  • sloc: ruby: 7,384; makefile: 26; sh: 4
file content (149 lines) | stat: -rw-r--r-- 3,980 bytes parent folder | download
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# encoding: utf-8
require_relative 'helper'
require 'sidekiq/middleware/server/retry_jobs'

class TestRetryExhausted < Sidekiq::Test
  describe 'sidekiq_retries_exhausted' do
    class NewWorker
      include Sidekiq::Worker

      class_attribute :exhausted_called, :exhausted_job, :exhausted_exception

      sidekiq_retries_exhausted do |job, e|
        self.exhausted_called = true
        self.exhausted_job = job
        self.exhausted_exception = e
      end
    end

    class OldWorker
      include Sidekiq::Worker

      class_attribute :exhausted_called, :exhausted_job, :exhausted_exception

      sidekiq_retries_exhausted do |job|
        self.exhausted_called = true
        self.exhausted_job = job
      end
    end

    def cleanup
      [NewWorker, OldWorker].each do |worker_class|
        worker_class.exhausted_called = nil
        worker_class.exhausted_job = nil
        worker_class.exhausted_exception = nil
      end
    end

    before do
      cleanup
    end

    after do
      cleanup
    end

    def new_worker
      @new_worker ||= NewWorker.new
    end

    def old_worker
      @old_worker ||= OldWorker.new
    end

    def handler(options={})
      @handler ||= Sidekiq::Middleware::Server::RetryJobs.new(options)
    end

    def job(options={})
      @job ||= {'class' => 'Bob', 'args' => [1, 2, 'foo']}.merge(options)
    end

    it 'does not run exhausted block when job successful on first run' do
      handler.call(new_worker, job('retry' => 2), 'default') do
        # successful
      end

      refute NewWorker.exhausted_called?
    end

    it 'does not run exhausted block when job successful on last retry' do
      handler.call(new_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
        # successful
      end

      refute NewWorker.exhausted_called?
    end

    it 'does not run exhausted block when retries not exhausted yet' do
      assert_raises RuntimeError do
        handler.call(new_worker, job('retry' => 1), 'default') do
          raise 'kerblammo!'
        end
      end

      refute NewWorker.exhausted_called?
    end

    it 'runs exhausted block when retries exhausted' do
      assert_raises RuntimeError do
        handler.call(new_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
          raise 'kerblammo!'
        end
      end

      assert NewWorker.exhausted_called?
    end


    it 'passes job and exception to retries exhausted block' do
      raised_error = assert_raises RuntimeError do
        handler.call(new_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
          raise 'kerblammo!'
        end
      end

      assert new_worker.exhausted_called?
      assert_equal raised_error.message, new_worker.exhausted_job['error_message']
      assert_equal raised_error, new_worker.exhausted_exception
    end

    it 'passes job to retries exhausted block' do
      raised_error = assert_raises RuntimeError do
        handler.call(old_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
          raise 'kerblammo!'
        end
      end

      assert old_worker.exhausted_called?
      assert_equal raised_error.message, old_worker.exhausted_job['error_message']
      assert_equal nil, new_worker.exhausted_exception
    end

    it 'allows a global default handler' do
      begin
        class Foobar
          include Sidekiq::Worker
        end

        exhausted_job = nil
        exhausted_exception = nil
        Sidekiq.default_retries_exhausted = lambda do |job, ex|
          exhausted_job = job
          exhausted_exception = ex
        end
        f = Foobar.new
        raised_error = assert_raises RuntimeError do
          handler.call(f, job('retry_count' => 0, 'retry' => 1), 'default') do
            raise 'kerblammo!'
          end
        end

        assert exhausted_job
        assert_equal raised_error, exhausted_exception
      ensure
        Sidekiq.default_retries_exhausted = nil
      end
    end
  end
end