Skip to content

Commit 3c1c5d7

Browse files
committed
Write some more tests for jobs that fail, retrying and discarding
1 parent ffa7028 commit 3c1c5d7

File tree

3 files changed

+58
-9
lines changed

3 files changed

+58
-9
lines changed

test/dummy/app/jobs/raising_job.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
class DefaultsError < StandardError; end
2-
class DiscardableError < StandardError; end
3-
41
class RaisingJob < ApplicationJob
2+
class DefaultError < StandardError; end
3+
class DiscardableError < StandardError; end
4+
55
queue_as :background
66

7-
retry_on DefaultsError
7+
retry_on DefaultError, attempts: 3, wait: 0.1.seconds
88
discard_on DiscardableError
99

10-
def perform(raising, attempts, *)
10+
def perform(raising, identifier, attempts = 1)
1111
raising = raising.shift if raising.is_a?(Array)
12-
if raising && executions < attempts
13-
JobBuffer.add("Raised #{raising} for the #{executions.ordinalize} time")
12+
13+
if raising && executions <= attempts
14+
JobBuffer.add("#{identifier}: raised #{raising} for the #{executions.ordinalize} time")
1415
raise raising, "This is a #{raising} exception"
1516
else
1617
JobBuffer.add("Successfully completed job")

test/integration/jobs_lifecycle_test.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,54 @@ class JobsLifecycleTest < ActiveSupport::TestCase
2727
assert_equal 2, SolidQueue::Job.finished.count
2828
end
2929

30+
test "enqueue and run jobs that fail without retries" do
31+
RaisingJob.perform_later(RuntimeError, "A")
32+
RaisingJob.perform_later(RuntimeError, "B")
33+
jobs = SolidQueue::Job.last(2)
34+
35+
@dispatcher.start
36+
@worker.start
37+
38+
wait_for_jobs_to_finish_for(3.seconds)
39+
40+
message = "raised RuntimeError for the 1st time"
41+
assert_equal [ "A: #{message}", "B: #{message}" ], JobBuffer.values.sort
42+
43+
assert_empty SolidQueue::Job.finished
44+
end
45+
46+
test "enqueue and run jobs that fail and succeed after retrying" do
47+
RaisingJob.perform_later(RaisingJob::DefaultError, "A", 5) # this will fail after being retried
48+
RaisingJob.perform_later(RaisingJob::DefaultError, "B")
49+
50+
@dispatcher.start
51+
@worker.start
52+
53+
wait_for_jobs_to_finish_for(3.seconds)
54+
55+
messages_from_a = 1.upto(3).collect { |i| "A: raised RaisingJob::DefaultError for the #{i.ordinalize} time" }
56+
messages_from_b = [ "B: raised RaisingJob::DefaultError for the 1st time", "Successfully completed job" ]
57+
58+
assert_equal messages_from_a + messages_from_b, JobBuffer.values.sort
59+
60+
assert_equal 4, SolidQueue::Job.finished.count # B + its retry + 2 retries of A
61+
assert_equal 1, SolidQueue::FailedExecution.count
62+
end
63+
64+
test "enqueue and run jobs that fail and it's discarded" do
65+
RaisingJob.perform_later(RaisingJob::DiscardableError, "A")
66+
67+
@dispatcher.start
68+
@worker.start
69+
70+
wait_for_jobs_to_finish_for(1.seconds)
71+
72+
assert_equal [ "A: raised RaisingJob::DiscardableError for the 1st time" ], JobBuffer.values.sort
73+
74+
assert_equal 1, SolidQueue::Job.finished.count
75+
assert_equal 0, SolidQueue::FailedExecution.count
76+
end
77+
3078
test "schedule and run jobs" do
3179
AddToBufferJob.set(wait: 1.day).perform_later("I'm scheduled")
3280
AddToBufferJob.set(wait: 3.days).perform_later("I'm scheduled later")

test/models/solid_queue/claimed_execution_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class SolidQueue::ClaimedExecutionTest < ActiveSupport::TestCase
1818
end
1919

2020
test "perform job that fails" do
21-
claimed_execution = prepare_and_claim_job RaisingJob.perform_later(RuntimeError, 2)
21+
claimed_execution = prepare_and_claim_job RaisingJob.perform_later(RuntimeError, "A")
2222
job = claimed_execution.job
2323

2424
assert_difference -> { SolidQueue::ClaimedExecution.count } => -1, -> { SolidQueue::FailedExecution.count } => 1 do
@@ -38,7 +38,7 @@ class SolidQueue::ClaimedExecutionTest < ActiveSupport::TestCase
3838
subscriber = ErrorBuffer.new
3939

4040
with_error_subscriber(subscriber) do
41-
claimed_execution = prepare_and_claim_job RaisingJob.perform_later(RuntimeError, 2)
41+
claimed_execution = prepare_and_claim_job RaisingJob.perform_later(RuntimeError, "B")
4242

4343
claimed_execution.perform
4444
end

0 commit comments

Comments
 (0)