|
3 | 3 | require 'spec_helper' |
4 | 4 |
|
5 | 5 | if defined?(::ActiveJob) |
6 | | - describe "running jobs via ActiveJob" do |
| 6 | + describe "enqueueing/running jobs via ActiveJob" do |
7 | 7 | before do |
8 | 8 | class TestJobClass < ActiveJob::Base |
9 | 9 | def perform(*args, **kwargs) |
10 | 10 | $args = args |
11 | 11 | $kwargs = kwargs |
12 | 12 | end |
13 | 13 | end |
| 14 | + class OtherTestJobClass < ActiveJob::Base; end |
14 | 15 | end |
15 | 16 |
|
16 | 17 | after do |
17 | 18 | Object.send :remove_const, :TestJobClass |
18 | 19 | $args = nil |
19 | 20 | $kwargs = nil |
| 21 | + Object.send :remove_const, :OtherTestJobClass |
20 | 22 | end |
21 | 23 |
|
22 | 24 | def execute(&perform_later_block) |
@@ -173,27 +175,96 @@ def perform(*args) |
173 | 175 | end |
174 | 176 | end |
175 | 177 |
|
176 | | - describe 'with bulk_enqueue' do |
177 | | - describe 'ActiveJobClass.perform_later' do |
178 | | - it "is not supported" do |
179 | | - assert_raises_with_message( |
180 | | - Que::Error, |
181 | | - /Que\.bulk_enqueue does not support ActiveJob\./ |
182 | | - ) do |
183 | | - Que.bulk_enqueue { TestJobClass.perform_later(1, 2) } |
| 178 | + def assert_enqueue_active_job( |
| 179 | + expected_queues:, |
| 180 | + expected_priorities:, |
| 181 | + expected_run_ats:, |
| 182 | + expected_active_job_classes:, |
| 183 | + expected_active_job_arguments:, |
| 184 | + expected_count:, |
| 185 | + assert_results:, |
| 186 | + &enqueue_block |
| 187 | + ) |
| 188 | + |
| 189 | + assert_equal 0, jobs_dataset.count |
| 190 | + |
| 191 | + results = enqueue_block.call |
| 192 | + |
| 193 | + assert_equal expected_count, jobs_dataset.count |
| 194 | + |
| 195 | + if assert_results |
| 196 | + results.each_with_index do |result, i| |
| 197 | + assert_kind_of Que::Job, result |
| 198 | + assert_instance_of ActiveJob::QueueAdapters::QueAdapter::JobWrapper, result |
| 199 | + |
| 200 | + assert_equal expected_priorities[i], result.que_attrs[:priority] |
| 201 | + assert_equal expected_active_job_classes[i], result.que_attrs[:args].first[:job_class] |
| 202 | + assert_equal expected_active_job_arguments[i], result.que_attrs[:args].first[:arguments] |
| 203 | + assert_equal ({}), result.que_attrs[:kwargs] |
| 204 | + assert_equal ({}), result.que_attrs[:data] |
| 205 | + end |
| 206 | + end |
| 207 | + |
| 208 | + jobs_dataset.order(:id).each_with_index do |job, i| |
| 209 | + assert_equal expected_queues[i], job[:queue] |
| 210 | + assert_equal expected_priorities[i], job[:priority] |
| 211 | + assert_equal expected_active_job_classes[i], job[:args].first[:job_class] |
| 212 | + assert_equal expected_active_job_arguments[i], job[:args].first[:arguments] |
| 213 | + assert_in_delta job[:run_at], expected_run_ats[i], QueSpec::TIME_SKEW |
| 214 | + assert_equal 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper', job[:job_class] |
| 215 | + assert_equal ({}), job[:kwargs] |
| 216 | + assert_equal ({}), job[:data] |
| 217 | + end |
| 218 | + |
| 219 | + jobs_dataset.delete |
| 220 | + end |
| 221 | + |
| 222 | + describe "with Que.bulk_enqueue" do |
| 223 | + it "should be able to queue multiple jobs with different classes and job options" do |
| 224 | + assert_enqueue_active_job( |
| 225 | + expected_count: 2, |
| 226 | + expected_queues: ['default', 'custom'], |
| 227 | + expected_priorities: [100, 200], |
| 228 | + expected_run_ats: [Time.now, Time.now + 60], |
| 229 | + expected_active_job_classes: ['TestJobClass', 'OtherTestJobClass'], |
| 230 | + expected_active_job_arguments: [[1, 2], [3, 4]], |
| 231 | + assert_results: true, |
| 232 | + ) do |
| 233 | + Que.bulk_enqueue do |
| 234 | + TestJobClass.perform_later(1, 2) |
| 235 | + OtherTestJobClass.set(wait: 1.minute, queue: 'custom', priority: 200).perform_later(3, 4) |
184 | 236 | end |
185 | 237 | end |
186 | 238 | end |
| 239 | + end |
187 | 240 |
|
188 | | - describe 'active_job#enqueue' do |
189 | | - it "is not supported" do |
190 | | - assert_raises_with_message( |
191 | | - Que::Error, |
192 | | - /Que\.bulk_enqueue does not support ActiveJob\./ |
| 241 | + if ActiveJob.gem_version >= Gem::Version.new('7.1') |
| 242 | + describe "with ActiveJob.perform_all_later" do |
| 243 | + it "should be able to queue multiple jobs with different classes and job options" do |
| 244 | + assert_enqueue_active_job( |
| 245 | + expected_count: 2, |
| 246 | + expected_queues: ['default', 'custom'], |
| 247 | + expected_priorities: [100, 200], |
| 248 | + expected_run_ats: [Time.now, Time.now + 60], |
| 249 | + expected_active_job_classes: ['TestJobClass', 'OtherTestJobClass'], |
| 250 | + expected_active_job_arguments: [[1, 2], [3, 4]], |
| 251 | + assert_results: false, |
193 | 252 | ) do |
194 | | - Que.bulk_enqueue { TestJobClass.new.enqueue } |
| 253 | + ActiveJob.perform_all_later([ |
| 254 | + TestJobClass.new(1, 2), |
| 255 | + OtherTestJobClass.new(3, 4).set(wait: 1.minute, queue: 'custom', priority: 200), |
| 256 | + ]) |
195 | 257 | end |
196 | 258 | end |
| 259 | + |
| 260 | + it "should set provider_job_id on job instances" do |
| 261 | + jobs = [TestJobClass.new, TestJobClass.new] |
| 262 | + ActiveJob.perform_all_later(jobs) |
| 263 | + que_jobs = jobs_dataset.order(:id).to_a |
| 264 | + |
| 265 | + assert_equal jobs[0].provider_job_id, que_jobs[0][:id] |
| 266 | + assert_equal jobs[1].provider_job_id, que_jobs[1][:id] |
| 267 | + end |
197 | 268 | end |
198 | 269 | end |
199 | 270 | end |
|
0 commit comments