Skip to content

Commit a86f9b3

Browse files
committed
Clean up tests after unifying discard behaviour
1 parent bd2b655 commit a86f9b3

File tree

6 files changed

+73
-167
lines changed

6 files changed

+73
-167
lines changed

test/dummy/app/jobs/discard_on_conflict_job.rb

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class DiscardableUpdateResultJob < UpdateResultJob
2+
limits_concurrency key: ->(job_result, **) { job_result }, on_conflict: :discard
3+
end

test/dummy/app/jobs/limited_discard_job.rb

Lines changed: 0 additions & 8 deletions
This file was deleted.

test/integration/concurrency_controls_test.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,61 @@ class ConcurrencyControlsTest < ActiveSupport::TestCase
196196
end
197197
end
198198

199+
test "discard jobs when concurrency limit is reached with on_conflict: :discard" do
200+
# Enqueue first job - should be executed
201+
job1 = DiscardableUpdateResultJob.perform_later(@result, name: "1", pause: 0.2)
202+
# Enqueue second job - should be discarded due to concurrency limit
203+
job2 = DiscardableUpdateResultJob.perform_later(@result, name: "2")
204+
# Enqueue third job - should also be discarded
205+
job3 = DiscardableUpdateResultJob.perform_later(@result, name: "3")
206+
207+
wait_for_jobs_to_finish_for(5.seconds)
208+
assert_no_unfinished_jobs
209+
210+
# Only the first job did something
211+
assert_stored_sequence(@result, [ "1" ])
212+
213+
# All jobs have finished and have no blocked executions
214+
jobs = SolidQueue::Job.where(active_job_id: [ job1, job2, job3 ].map(&:job_id))
215+
assert_equal 3, jobs.count
216+
217+
jobs.each do |job|
218+
assert job.finished?
219+
assert_nil job.blocked_execution
220+
end
221+
end
222+
223+
test "discard on conflict across different concurrency keys" do
224+
another_result = JobResult.create!(queue_name: "default", status: "seq: ")
225+
DiscardableUpdateResultJob.perform_later(@result, name: "1", pause: 0.2)
226+
DiscardableUpdateResultJob.perform_later(another_result, name: "2", pause: 0.2)
227+
DiscardableUpdateResultJob.perform_later(@result, name: "3") # Should be discarded
228+
DiscardableUpdateResultJob.perform_later(another_result, name: "4") # Should be discarded
229+
230+
wait_for_jobs_to_finish_for(5.seconds)
231+
assert_no_unfinished_jobs
232+
233+
# Only the first 2 jobs did something
234+
assert_stored_sequence(@result, [ "1" ])
235+
assert_stored_sequence(another_result, [ "2" ])
236+
end
237+
238+
test "discard on conflict and release semaphore" do
239+
DiscardableUpdateResultJob.perform_later(@result, name: "1", pause: 0.1)
240+
# will be discarded
241+
DiscardableUpdateResultJob.perform_later(@result, name: "2")
242+
243+
wait_for_jobs_to_finish_for(5.seconds)
244+
assert_no_unfinished_jobs
245+
246+
# Enqueue another job that shouldn't be discarded or blocked
247+
DiscardableUpdateResultJob.perform_later(@result, name: "3")
248+
wait_for_jobs_to_finish_for(5.seconds)
249+
assert_no_unfinished_jobs
250+
251+
assert_stored_sequence(@result, [ "1", "3" ])
252+
end
253+
199254
private
200255
def assert_stored_sequence(result, *sequences)
201256
expected = sequences.map { |sequence| "seq: " + sequence.map { |name| "s#{name}c#{name}" }.join }

test/integration/concurrency_discard_test.rb

Lines changed: 0 additions & 137 deletions
This file was deleted.

test/models/solid_queue/job_test.rb

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ def perform(job_result)
1010
end
1111
end
1212

13-
class DiscardedNonOverlappingJob < NonOverlappingJob
13+
class DiscardableNonOverlappingJob < NonOverlappingJob
1414
limits_concurrency key: ->(job_result, **) { job_result }, on_conflict: :discard
1515
end
1616

17-
class DiscardedOverlappingJob < NonOverlappingJob
17+
class DiscardableThrottledJob < NonOverlappingJob
1818
limits_concurrency to: 2, key: ->(job_result, **) { job_result }, on_conflict: :discard
1919
end
2020

@@ -26,11 +26,11 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
2626
limits_concurrency key: ->(job_result, **) { job_result }, group: "MyGroup"
2727
end
2828

29-
class DiscardedNonOverlappingGroupedJob1 < NonOverlappingJob
29+
class DiscardableNonOverlappingGroupedJob1 < NonOverlappingJob
3030
limits_concurrency key: ->(job_result, **) { job_result }, group: "DiscardingGroup", on_conflict: :discard
3131
end
3232

33-
class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
33+
class DiscardableNonOverlappingGroupedJob2 < NonOverlappingJob
3434
limits_concurrency key: ->(job_result, **) { job_result }, group: "DiscardingGroup", on_conflict: :discard
3535
end
3636

@@ -195,10 +195,10 @@ class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
195195

196196
test "enqueue jobs with discarding concurrency controls" do
197197
assert_ready do
198-
active_job = DiscardedNonOverlappingJob.perform_later(@result, name: "A")
198+
active_job = DiscardableNonOverlappingJob.perform_later(@result, name: "A")
199199
assert active_job.successfully_enqueued?
200200

201-
assert_not DiscardedNonOverlappingJob.perform_later(@result, name: "B") do |overlapping_active_job|
201+
assert_not DiscardableNonOverlappingJob.perform_later(@result, name: "B") do |overlapping_active_job|
202202
assert_not overlapping_active_job.successfully_enqueued?
203203
assert_equal @discarded_concurrent_error, overlapping_active_job.enqueue_error
204204
end
@@ -207,14 +207,14 @@ class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
207207

208208
test "enqueue scheduled job with discarding concurrency controls" do
209209
assert_ready do
210-
active_job = DiscardedNonOverlappingJob.perform_later(@result, name: "A")
210+
active_job = DiscardableNonOverlappingJob.perform_later(@result, name: "A")
211211
assert active_job.successfully_enqueued?
212212
end
213213

214214
scheduled_job_id = nil
215215

216216
assert_scheduled do
217-
scheduled_active_job = DiscardedNonOverlappingJob.set(wait: 0.5.seconds).perform_later(@result, name: "B")
217+
scheduled_active_job = DiscardableNonOverlappingJob.set(wait: 0.5.seconds).perform_later(@result, name: "B")
218218
assert scheduled_active_job.successfully_enqueued?
219219
assert_nil scheduled_active_job.enqueue_error
220220

@@ -231,8 +231,8 @@ class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
231231

232232
test "enqueues jobs in bulk with discarding concurrency controls" do
233233
jobs = [
234-
job_1 = DiscardedNonOverlappingJob.new(@result, name: "A"),
235-
job_2 = DiscardedNonOverlappingJob.new(@result, name: "B")
234+
job_1 = DiscardableNonOverlappingJob.new(@result, name: "A"),
235+
job_2 = DiscardableNonOverlappingJob.new(@result, name: "B")
236236
]
237237

238238
assert_job_counts(ready: 1, discarded: 1) do
@@ -249,16 +249,16 @@ class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
249249
test "enqueue jobs with discarding concurrency controls when below limit" do
250250
assert_job_counts(ready: 2) do
251251
assert_ready do
252-
active_job = DiscardedOverlappingJob.perform_later(@result, name: "A")
252+
active_job = DiscardableThrottledJob.perform_later(@result, name: "A")
253253
assert active_job.successfully_enqueued?
254254
end
255255

256256
assert_ready do
257-
active_job = DiscardedOverlappingJob.perform_later(@result, name: "B")
257+
active_job = DiscardableThrottledJob.perform_later(@result, name: "B")
258258
assert active_job.successfully_enqueued?
259259
end
260260

261-
assert_not DiscardedOverlappingJob.perform_later(@result, name: "C") do |overlapping_active_job|
261+
assert_not DiscardableThrottledJob.perform_later(@result, name: "C") do |overlapping_active_job|
262262
assert_not overlapping_active_job.successfully_enqueued?
263263
assert_equal @discarded_concurrent_error, overlapping_active_job.enqueue_error
264264
end
@@ -282,13 +282,13 @@ class DiscardedNonOverlappingGroupedJob2 < NonOverlappingJob
282282
test "enqueue jobs with discarding concurrency controls in the same concurrency group" do
283283
assert_job_counts(ready: 1) do
284284
assert_ready do
285-
active_job = DiscardedNonOverlappingGroupedJob1.perform_later(@result, name: "A")
285+
active_job = DiscardableNonOverlappingGroupedJob1.perform_later(@result, name: "A")
286286
assert active_job.successfully_enqueued?
287287
assert_equal 1, active_job.concurrency_limit
288288
assert_equal "DiscardingGroup/JobResult/#{@result.id}", active_job.concurrency_key
289289
end
290290

291-
assert_not DiscardedNonOverlappingGroupedJob2.perform_later(@result, name: "B") do |blocked_active_job|
291+
assert_not DiscardableNonOverlappingGroupedJob2.perform_later(@result, name: "B") do |blocked_active_job|
292292
assert_not blocked_active_job.successfully_enqueued?
293293
assert_equal 1, blocked_active_job.concurrency_limit
294294
assert_equal "DiscardingGroup/JobResult/#{@result.id}", blocked_active_job.concurrency_key

0 commit comments

Comments
 (0)