@@ -116,7 +116,7 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
116116 NonOverlappingGroupedJob2 . new ( @result )
117117 ]
118118
119- assert_multi ( ready : 5 , scheduled : 2 , blocked : 2 ) do
119+ assert_job_counts ( ready : 5 , scheduled : 2 , blocked : 2 ) do
120120 ActiveJob . perform_all_later ( active_jobs )
121121 end
122122
@@ -138,6 +138,75 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
138138 assert blocked_execution . expires_at <= SolidQueue . default_concurrency_control_period . from_now
139139 end
140140
141+ test "discard ready job" do
142+ AddToBufferJob . perform_later ( 1 )
143+ job = SolidQueue ::Job . last
144+
145+ assert_job_counts ready : -1 do
146+ job . discard
147+ end
148+ end
149+
150+ test "discard blocked job" do
151+ NonOverlappingJob . perform_later ( @result , name : "ready" )
152+ NonOverlappingJob . perform_later ( @result , name : "blocked" )
153+ ready_job , blocked_job = SolidQueue ::Job . last ( 2 )
154+ semaphore = SolidQueue ::Semaphore . last
155+
156+ travel_to 10 . minutes . from_now
157+
158+ assert_no_changes -> { semaphore . value } , -> { semaphore . expires_at } do
159+ assert_job_counts blocked : -1 do
160+ blocked_job . discard
161+ end
162+ end
163+ end
164+
165+ test "try to discard claimed job" do
166+ StoreResultJob . perform_later ( 42 , pause : 2 . seconds )
167+ job = SolidQueue ::Job . last
168+
169+ worker = SolidQueue ::Worker . new ( queues : "background" ) . tap ( &:start )
170+ sleep ( 0.2 )
171+
172+ assert_no_difference -> { SolidQueue ::Job . count } , -> { SolidQueue ::ClaimedExecution . count } do
173+ assert_raises SolidQueue ::Execution ::UndiscardableError do
174+ job . discard
175+ end
176+ end
177+
178+ worker . stop
179+ end
180+
181+ test "discard scheduled job" do
182+ AddToBufferJob . set ( wait : 5 . minutes ) . perform_later
183+ job = SolidQueue ::Job . last
184+
185+ assert_job_counts scheduled : -1 do
186+ job . discard
187+ end
188+ end
189+
190+ test "release blocked locks when discarding a ready job" do
191+ NonOverlappingJob . perform_later ( @result , name : "ready" )
192+ NonOverlappingJob . perform_later ( @result , name : "blocked" )
193+ ready_job , blocked_job = SolidQueue ::Job . last ( 2 )
194+ semaphore = SolidQueue ::Semaphore . last
195+
196+ assert ready_job . ready?
197+ assert blocked_job . blocked?
198+
199+ travel_to 10 . minutes . from_now
200+
201+ assert_changes -> { semaphore . reload . expires_at } do
202+ assert_job_counts blocked : -1 do
203+ ready_job . discard
204+ end
205+ end
206+
207+ assert blocked_job . reload . ready?
208+ end
209+
141210 if ENV [ "SEPARATE_CONNECTION" ] && ENV [ "TARGET_DB" ] != "sqlite"
142211 test "uses a different connection and transaction than the one in use when connects_to is specified" do
143212 assert_difference -> { SolidQueue ::Job . count } do
@@ -157,22 +226,20 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
157226
158227 private
159228 def assert_ready ( &block )
160- assert_difference -> { SolidQueue ::Job . count } => +1 , -> { SolidQueue ::ReadyExecution . count } => +1 , &block
229+ assert_job_counts ( ready : 1 , &block )
230+ assert SolidQueue ::Job . last . ready?
161231 end
162232
163233 def assert_scheduled ( &block )
164- assert_no_difference -> { SolidQueue ::ReadyExecution . count } do
165- assert_difference -> { SolidQueue ::Job . count } => +1 , -> { SolidQueue ::ScheduledExecution . count } => +1 , &block
166- end
234+ assert_job_counts ( scheduled : 1 , &block )
167235 end
168236
169237 def assert_blocked ( &block )
170- assert_no_difference -> { SolidQueue ::ReadyExecution . count } do
171- assert_difference -> { SolidQueue ::Job . count } => +1 , -> { SolidQueue ::BlockedExecution . count } => +1 , &block
172- end
238+ assert_job_counts ( blocked : 1 , &block )
239+ assert SolidQueue ::Job . last . blocked?
173240 end
174241
175- def assert_multi ( ready : 0 , scheduled : 0 , blocked : 0 , &block )
242+ def assert_job_counts ( ready : 0 , scheduled : 0 , blocked : 0 , &block )
176243 assert_difference -> { SolidQueue ::Job . count } , +( ready + scheduled + blocked ) do
177244 assert_difference -> { SolidQueue ::ReadyExecution . count } , +ready do
178245 assert_difference -> { SolidQueue ::ScheduledExecution . count } , +scheduled do
0 commit comments