@@ -10,6 +10,14 @@ def perform(job_result)
1010 end
1111 end
1212
13+ class DiscardedNonOverlappingJob < NonOverlappingJob
14+ limits_concurrency key : -> ( job_result , **) { job_result } , on_duplicate : :discard
15+ end
16+
17+ class DiscardedOverlappingJob < NonOverlappingJob
18+ limits_concurrency to : 2 , key : -> ( job_result , **) { job_result } , on_duplicate : :discard
19+ end
20+
1321 class NonOverlappingGroupedJob1 < NonOverlappingJob
1422 limits_concurrency key : -> ( job_result , **) { job_result } , group : "MyGroup"
1523 end
@@ -98,6 +106,40 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
98106 assert_equal active_job . concurrency_key , job . concurrency_key
99107 end
100108
109+ test "enqueue jobs with discarding concurrency controls" do
110+ assert_ready do
111+ active_job = DiscardedNonOverlappingJob . perform_later ( @result , name : "A" )
112+ assert_equal 1 , active_job . concurrency_limit
113+ assert_equal "SolidQueue::JobTest::DiscardedNonOverlappingJob/JobResult/#{ @result . id } " , active_job . concurrency_key
114+ end
115+
116+ assert_discarded do
117+ active_job = DiscardedNonOverlappingJob . perform_later ( @result , name : "A" )
118+ assert_equal 1 , active_job . concurrency_limit
119+ assert_equal "SolidQueue::JobTest::DiscardedNonOverlappingJob/JobResult/#{ @result . id } " , active_job . concurrency_key
120+ end
121+ end
122+
123+ test "enqueue jobs with discarding concurrency controls when below limit" do
124+ assert_ready do
125+ active_job = DiscardedOverlappingJob . perform_later ( @result , name : "A" )
126+ assert_equal 2 , active_job . concurrency_limit
127+ assert_equal "SolidQueue::JobTest::DiscardedOverlappingJob/JobResult/#{ @result . id } " , active_job . concurrency_key
128+ end
129+
130+ assert_ready do
131+ active_job = DiscardedOverlappingJob . perform_later ( @result , name : "A" )
132+ assert_equal 2 , active_job . concurrency_limit
133+ assert_equal "SolidQueue::JobTest::DiscardedOverlappingJob/JobResult/#{ @result . id } " , active_job . concurrency_key
134+ end
135+
136+ assert_discarded do
137+ active_job = DiscardedOverlappingJob . perform_later ( @result , name : "A" )
138+ assert_equal 2 , active_job . concurrency_limit
139+ assert_equal "SolidQueue::JobTest::DiscardedOverlappingJob/JobResult/#{ @result . id } " , active_job . concurrency_key
140+ end
141+ end
142+
101143 test "enqueue jobs with concurrency controls in the same concurrency group" do
102144 assert_ready do
103145 active_job = NonOverlappingGroupedJob1 . perform_later ( @result , name : "A" )
@@ -289,8 +331,12 @@ def assert_blocked(&block)
289331 assert SolidQueue ::Job . last . blocked?
290332 end
291333
292- def assert_job_counts ( ready : 0 , scheduled : 0 , blocked : 0 , &block )
293- assert_difference -> { SolidQueue ::Job . count } , +( ready + scheduled + blocked ) do
334+ def assert_discarded ( &block )
335+ assert_job_counts ( discarded : 1 , &block )
336+ end
337+
338+ def assert_job_counts ( ready : 0 , scheduled : 0 , blocked : 0 , discarded : 0 , &block )
339+ assert_difference -> { SolidQueue ::Job . count } , +( ready + scheduled + blocked + discarded ) do
294340 assert_difference -> { SolidQueue ::ReadyExecution . count } , +ready do
295341 assert_difference -> { SolidQueue ::ScheduledExecution . count } , +scheduled do
296342 assert_difference -> { SolidQueue ::BlockedExecution . count } , +blocked , &block
0 commit comments