@@ -116,7 +116,7 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
116
116
NonOverlappingGroupedJob2 . new ( @result )
117
117
]
118
118
119
- assert_multi ( ready : 5 , scheduled : 2 , blocked : 2 ) do
119
+ assert_job_counts ( ready : 5 , scheduled : 2 , blocked : 2 ) do
120
120
ActiveJob . perform_all_later ( active_jobs )
121
121
end
122
122
@@ -138,6 +138,73 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
138
138
assert blocked_execution . expires_at <= SolidQueue . default_concurrency_control_period . from_now
139
139
end
140
140
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
+ job . discard
174
+ end
175
+
176
+ worker . stop
177
+ end
178
+
179
+ test "discard scheduled job" do
180
+ AddToBufferJob . set ( wait : 5 . minutes ) . perform_later
181
+ job = SolidQueue ::Job . last
182
+
183
+ assert_job_counts scheduled : -1 do
184
+ job . discard
185
+ end
186
+ end
187
+
188
+ test "release blocked locks when discarding a ready job" do
189
+ NonOverlappingJob . perform_later ( @result , name : "ready" )
190
+ NonOverlappingJob . perform_later ( @result , name : "blocked" )
191
+ ready_job , blocked_job = SolidQueue ::Job . last ( 2 )
192
+ semaphore = SolidQueue ::Semaphore . last
193
+
194
+ assert ready_job . ready?
195
+ assert blocked_job . blocked?
196
+
197
+ travel_to 10 . minutes . from_now
198
+
199
+ assert_changes -> { semaphore . reload . expires_at } do
200
+ assert_job_counts blocked : -1 do
201
+ ready_job . discard
202
+ end
203
+ end
204
+
205
+ assert blocked_job . reload . ready?
206
+ end
207
+
141
208
if ENV [ "SEPARATE_CONNECTION" ] && ENV [ "TARGET_DB" ] != "sqlite"
142
209
test "uses a different connection and transaction than the one in use when connects_to is specified" do
143
210
assert_difference -> { SolidQueue ::Job . count } do
@@ -157,22 +224,18 @@ class NonOverlappingGroupedJob2 < NonOverlappingJob
157
224
158
225
private
159
226
def assert_ready ( &block )
160
- assert_difference -> { SolidQueue :: Job . count } => + 1 , -> { SolidQueue :: ReadyExecution . count } => + 1 , &block
227
+ assert_job_counts ( ready : 1 , &block )
161
228
end
162
229
163
230
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
231
+ assert_job_counts ( scheduled : 1 , &block )
167
232
end
168
233
169
234
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
235
+ assert_job_counts ( blocked : 1 , &block )
173
236
end
174
237
175
- def assert_multi ( ready : 0 , scheduled : 0 , blocked : 0 , &block )
238
+ def assert_job_counts ( ready : 0 , scheduled : 0 , blocked : 0 , &block )
176
239
assert_difference -> { SolidQueue ::Job . count } , +( ready + scheduled + blocked ) do
177
240
assert_difference -> { SolidQueue ::ReadyExecution . count } , +ready do
178
241
assert_difference -> { SolidQueue ::ScheduledExecution . count } , +scheduled do
0 commit comments