@@ -7,10 +7,14 @@ class BatchLifecycleTest < ActiveSupport::TestCase
7
7
8
8
def assert_finished_in_order ( *finishables )
9
9
finishables . each_cons ( 2 ) do |finished1 , finished2 |
10
- assert_equal finished1 . reload . finished_at < finished2 . reload . finished_at , true
10
+ assert_equal finished1 . finished_at < finished2 . finished_at , true
11
11
end
12
12
end
13
13
14
+ def job! ( active_job )
15
+ SolidQueue ::Job . find_by! ( active_job_id : active_job . job_id )
16
+ end
17
+
14
18
setup do
15
19
@_on_thread_error = SolidQueue . on_thread_error
16
20
SolidQueue . on_thread_error = silent_on_thread_error_for ( [ FailingJobError ] , @_on_thread_error )
@@ -128,17 +132,18 @@ def perform
128
132
expected_values = [ "1: 1 jobs succeeded!" , "1.1: 1 jobs succeeded!" , "2: 1 jobs succeeded!" , "3: 1 jobs succeeded!" ]
129
133
assert_equal expected_values . sort , JobBuffer . values . sort
130
134
assert_equal 4 , SolidQueue ::Batch . finished . count
131
- assert_finished_in_order ( batch4 , batch2 , batch1 )
132
- assert_finished_in_order ( batch3 , batch2 , batch1 )
135
+ assert_finished_in_order ( batch4 . reload , batch2 . reload , batch1 . reload )
136
+ assert_finished_in_order ( batch3 . reload , batch2 , batch1 )
133
137
end
134
138
135
139
test "all jobs are run, including jobs enqueued inside of other jobs" do
136
140
batch2 = nil
141
+ job1 = job2 = job3 = nil
137
142
batch1 = SolidQueue ::Batch . enqueue do
138
- AddToBufferJob . perform_later "hey"
143
+ job1 = AddToBufferJob . perform_later "hey"
139
144
batch2 = SolidQueue ::Batch . enqueue do
140
- AddToBufferJob . perform_later "ho"
141
- AddsMoreJobsJob . perform_later
145
+ job2 = AddToBufferJob . perform_later "ho"
146
+ job3 = AddsMoreJobsJob . perform_later
142
147
end
143
148
end
144
149
@@ -149,25 +154,29 @@ def perform
149
154
150
155
assert_equal [ "added from inside 1" , "added from inside 2" , "added from inside 3" , "hey" , "ho" ] , JobBuffer . values . sort
151
156
assert_equal 3 , SolidQueue ::Batch . finished . count
152
- assert_finished_in_order ( batch2 , batch1 )
157
+ assert_finished_in_order ( batch2 . reload , batch1 . reload )
158
+ assert_finished_in_order ( job! ( job3 ) , batch2 )
159
+ assert_finished_in_order ( job! ( job2 ) , batch2 )
160
+ assert_finished_in_order ( job! ( job1 ) , batch1 )
153
161
end
154
162
155
163
test "when self.enqueue_after_transaction_commit = true" do
156
164
skip if Rails ::VERSION ::MAJOR == 7 && Rails ::VERSION ::MINOR == 1
157
165
158
166
ApplicationJob . enqueue_after_transaction_commit = true
159
167
batch1 = batch2 = batch3 = nil
168
+ job1 = job2 = job3 = nil
160
169
JobResult . transaction do
161
170
JobResult . create! ( queue_name : "default" , status : "" )
162
171
163
172
batch1 = SolidQueue ::Batch . enqueue do
164
- AddToBufferJob . perform_later "hey"
173
+ job1 = AddToBufferJob . perform_later "hey"
165
174
JobResult . transaction ( requires_new : true ) do
166
175
JobResult . create! ( queue_name : "default" , status : "" )
167
176
batch2 = SolidQueue ::Batch . enqueue do
168
- AddToBufferJob . perform_later "ho"
177
+ job2 = AddToBufferJob . perform_later "ho"
169
178
batch3 = SolidQueue ::Batch . enqueue do
170
- AddToBufferJob . perform_later "let's go"
179
+ job3 = AddToBufferJob . perform_later "let's go"
171
180
end
172
181
end
173
182
end
@@ -179,10 +188,14 @@ def perform
179
188
180
189
wait_for_batches_to_finish_for ( 2 . seconds )
181
190
191
+ assert_equal [ "hey" , "ho" , "let's go" ] , JobBuffer . values . sort
182
192
assert_equal 3 , SolidQueue ::Batch . finished . count
183
193
assert_equal 3 , SolidQueue ::Job . finished . count
184
194
assert_equal 3 , SolidQueue ::Job . count
185
- assert_finished_in_order ( batch3 , batch2 , batch1 )
195
+ assert_finished_in_order ( batch3 . reload , batch2 . reload , batch1 . reload )
196
+ assert_finished_in_order ( job! ( job3 ) , batch3 )
197
+ assert_finished_in_order ( job! ( job2 ) , batch2 )
198
+ assert_finished_in_order ( job! ( job1 ) , batch1 )
186
199
end
187
200
188
201
test "failed jobs fire properly" do
@@ -218,7 +231,7 @@ def perform
218
231
219
232
assert_equal [ "failed" , "failed" ] . sort , SolidQueue ::Batch . all . pluck ( :status )
220
233
assert_equal [ "0: 1 jobs failed!" , "1: 1 jobs failed!" ] , JobBuffer . values . sort
221
- assert_finished_in_order ( batch2 , batch1 )
234
+ assert_finished_in_order ( batch2 . reload , batch1 . reload )
222
235
end
223
236
224
237
test "discarded jobs fire properly" do
@@ -254,7 +267,7 @@ def perform
254
267
255
268
assert_equal [ "completed" , "completed" ] . sort , SolidQueue ::Batch . all . pluck ( :status )
256
269
assert_equal [ "0: 1 jobs succeeded!" , "1: 1 jobs succeeded!" ] , JobBuffer . values . sort
257
- assert_finished_in_order ( batch2 , batch1 )
270
+ assert_finished_in_order ( batch2 . reload , batch1 . reload )
258
271
end
259
272
260
273
test "preserve_finished_jobs = false" do
@@ -300,32 +313,6 @@ def perform
300
313
assert_equal 1 , batch . total_jobs
301
314
end
302
315
303
- # test "batch finishes without firing callbacks if no jobs enqueue properly" do
304
- # ApplicationJob.enqueue_after_transaction_commit = true
305
- # batch1 = nil
306
- # JobResult.transaction do
307
- # batch1 = SolidQueue::Batch.enqueue(
308
- # metadata: { source: "test", priority: "high", user_id: 123 },
309
- # on_finish: OnFinishJob,
310
- # on_success: OnSuccessJob,
311
- # on_failure: OnFailureJob
312
- # ) do
313
- # AddToBufferJob.perform_later "hey"
314
- # end
315
-
316
- # raise ActiveRecord::Rollback
317
- # end
318
-
319
- # assert_equal [].sort, JobBuffer.values.sort
320
- # assert_equal 0, batch1.reload.completed_jobs
321
- # assert_equal 0, batch1.failed_jobs
322
- # assert_equal 0, batch1.pending_jobs
323
- # assert_equal 0, batch1.total_jobs
324
- # batch1.reload
325
- # assert_equal true, batch1.finished?
326
- # assert_equal "completed", batch1.status
327
- # end
328
-
329
316
class OnFinishJob < ApplicationJob
330
317
queue_as :background
331
318
0 commit comments