sidekiq-cron 0.6.3 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +145 -0
- data/Gemfile +3 -29
- data/README.md +175 -121
- data/Rakefile +3 -42
- data/lib/sidekiq/cron/job.rb +273 -144
- data/lib/sidekiq/cron/launcher.rb +39 -43
- data/lib/sidekiq/cron/locales/de.yml +2 -2
- data/lib/sidekiq/cron/locales/en.yml +6 -2
- data/lib/sidekiq/cron/locales/it.yml +23 -0
- data/lib/sidekiq/cron/locales/ja.yml +18 -0
- data/lib/sidekiq/cron/locales/pt.yml +22 -0
- data/lib/sidekiq/cron/locales/ru.yml +2 -2
- data/lib/sidekiq/cron/locales/zh-CN.yml +19 -0
- data/lib/sidekiq/cron/poller.rb +22 -12
- data/lib/sidekiq/cron/schedule_loader.rb +22 -0
- data/lib/sidekiq/cron/support.rb +8 -1
- data/lib/sidekiq/cron/version.rb +7 -0
- data/lib/sidekiq/cron/views/cron.erb +38 -28
- data/lib/sidekiq/cron/views/cron_show.erb +88 -0
- data/lib/sidekiq/cron/web.rb +1 -7
- data/lib/sidekiq/cron/web_extension.rb +19 -15
- data/lib/sidekiq/cron.rb +1 -0
- data/lib/sidekiq/options.rb +25 -0
- data/sidekiq-cron.gemspec +23 -108
- data/test/integration/performance_test.rb +13 -19
- data/test/models/person.rb +21 -0
- data/test/test_helper.rb +37 -38
- data/test/unit/fixtures/schedule_array.yml +13 -0
- data/test/unit/fixtures/schedule_erb.yml +6 -0
- data/test/unit/fixtures/schedule_hash.yml +12 -0
- data/test/unit/fixtures/schedule_string.yml +1 -0
- data/test/unit/job_test.rb +450 -35
- data/test/unit/launcher_test.rb +33 -0
- data/test/unit/poller_test.rb +28 -37
- data/test/unit/schedule_loader_test.rb +58 -0
- data/test/unit/web_extension_test.rb +59 -41
- metadata +72 -191
- data/.document +0 -5
- data/.travis.yml +0 -19
- data/Changes.md +0 -50
- data/Dockerfile +0 -32
- data/VERSION +0 -1
- data/config.ru +0 -14
- data/docker-compose.yml +0 -21
- data/examples/web-cron-ui.png +0 -0
- data/lib/sidekiq/cron/views/cron.slim +0 -69
data/test/unit/job_test.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
1
|
require './test/test_helper'
|
2
|
+
require "./test/models/person"
|
3
3
|
|
4
4
|
describe "Cron Job" do
|
5
5
|
before do
|
6
|
-
#
|
6
|
+
# Clear all previous saved data from Redis.
|
7
7
|
Sidekiq.redis do |conn|
|
8
8
|
conn.keys("cron_job*").each do |key|
|
9
9
|
conn.del(key)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
#
|
13
|
+
# Clear all queues.
|
14
14
|
Sidekiq::Queue.all.each do |queue|
|
15
15
|
queue.clear
|
16
16
|
end
|
@@ -76,7 +76,6 @@ describe "Cron Job" do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
describe "invalid job" do
|
79
|
-
|
80
79
|
before do
|
81
80
|
@job = Sidekiq::Cron::Job.new()
|
82
81
|
end
|
@@ -131,6 +130,44 @@ describe "Cron Job" do
|
|
131
130
|
end
|
132
131
|
end
|
133
132
|
|
133
|
+
describe 'cron formats' do
|
134
|
+
before do
|
135
|
+
@args = {
|
136
|
+
name: "Test",
|
137
|
+
klass: "CronTestClass"
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should support natural language format' do
|
142
|
+
@args[:cron] = "every 3 hours"
|
143
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
144
|
+
assert @job.valid?
|
145
|
+
assert_equal Fugit::Cron.new("0 */3 * * *"), @job.send(:parsed_cron)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe 'parse_enqueue_time' do
|
150
|
+
before do
|
151
|
+
@args = {
|
152
|
+
name: "Test",
|
153
|
+
cron: "* * * * *"
|
154
|
+
}
|
155
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should correctly parse new format' do
|
159
|
+
assert_equal @job.send(:parse_enqueue_time, '2017-01-02 15:23:43 UTC'), Time.new(2017, 1, 2, 15, 23, 43, '+00:00')
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should correctly parse new format with different timezone' do
|
163
|
+
assert_equal @job.send(:parse_enqueue_time, '2017-01-02 15:23:43 +01:00'), Time.new(2017, 1, 2, 15, 23, 43, '+01:00')
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should correctly parse old format' do
|
167
|
+
assert_equal @job.send(:parse_enqueue_time, '2017-01-02 15:23:43'), Time.new(2017, 1, 2, 15, 23, 43, '+00:00')
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
134
171
|
describe 'formatted time' do
|
135
172
|
before do
|
136
173
|
@args = {
|
@@ -142,11 +179,11 @@ describe "Cron Job" do
|
|
142
179
|
end
|
143
180
|
|
144
181
|
it 'returns formatted_last_time' do
|
145
|
-
assert_equal '2015-01-02T02:04:00Z', @job.
|
182
|
+
assert_equal '2015-01-02T02:04:00Z', @job.formatted_last_time(@time)
|
146
183
|
end
|
147
184
|
|
148
|
-
it 'returns
|
149
|
-
assert_equal '1420164240.0', @job.
|
185
|
+
it 'returns formatted_enqueue_time' do
|
186
|
+
assert_equal '1420164240.0', @job.formatted_enqueue_time(@time)
|
150
187
|
end
|
151
188
|
end
|
152
189
|
|
@@ -201,6 +238,39 @@ describe "Cron Job" do
|
|
201
238
|
"class"=>"CronTestClassWithQueue",
|
202
239
|
"args"=>[]}
|
203
240
|
end
|
241
|
+
|
242
|
+
it "be initialized with 'class' and date_as_argument" do
|
243
|
+
job = Sidekiq::Cron::Job.new('class' => 'CronTestClassWithQueue', "date_as_argument" => true)
|
244
|
+
|
245
|
+
job_message = job.message
|
246
|
+
job_args = job_message.delete("args")
|
247
|
+
assert_equal job_message, {"retry"=>false,
|
248
|
+
"queue"=>:super,
|
249
|
+
"backtrace"=>true,
|
250
|
+
"class"=>"CronTestClassWithQueue"}
|
251
|
+
assert job_args.empty?
|
252
|
+
|
253
|
+
enqueue_args = job.enqueue_args
|
254
|
+
assert enqueue_args[-1].is_a?(Float)
|
255
|
+
assert enqueue_args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
256
|
+
end
|
257
|
+
|
258
|
+
it "be initialized with 'class', 2 arguments and date_as_argument" do
|
259
|
+
job = Sidekiq::Cron::Job.new('class' => 'CronTestClassWithQueue', "date_as_argument" => true, "args"=> ["arg1", :arg2])
|
260
|
+
|
261
|
+
job_message = job.message
|
262
|
+
job_args = job_message.delete("args")
|
263
|
+
assert_equal job_message, {"retry"=>false,
|
264
|
+
"queue"=>:super,
|
265
|
+
"backtrace"=>true,
|
266
|
+
"class"=>"CronTestClassWithQueue"}
|
267
|
+
assert_equal job_args, ["arg1", :arg2]
|
268
|
+
|
269
|
+
enqueue_args = job.enqueue_args
|
270
|
+
assert_equal enqueue_args[0..-2], ["arg1", :arg2]
|
271
|
+
assert enqueue_args[-1].is_a?(Float)
|
272
|
+
assert enqueue_args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
273
|
+
end
|
204
274
|
end
|
205
275
|
|
206
276
|
describe "cron test" do
|
@@ -210,24 +280,24 @@ describe "Cron Job" do
|
|
210
280
|
|
211
281
|
it "return previous minute" do
|
212
282
|
@job.cron = "* * * * *"
|
213
|
-
time = Time.
|
283
|
+
time = Time.new(2018, 8, 10, 13, 24, 56).utc
|
214
284
|
assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-%H-%M-00")
|
215
285
|
end
|
216
286
|
|
217
287
|
it "return previous hour" do
|
218
288
|
@job.cron = "1 * * * *"
|
219
|
-
time = Time.
|
289
|
+
time = Time.new(2018, 8, 10, 13, 24, 56).utc
|
220
290
|
assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-%H-01-00")
|
221
291
|
end
|
222
292
|
|
223
293
|
it "return previous day" do
|
224
294
|
@job.cron = "1 2 * * * Etc/GMT"
|
225
|
-
time = Time.
|
295
|
+
time = Time.new(2018, 8, 10, 13, 24, 56).utc
|
226
296
|
|
227
297
|
if time.hour >= 2
|
228
298
|
assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-02-01-00")
|
229
299
|
else
|
230
|
-
yesterday =
|
300
|
+
yesterday = time - 1.day
|
231
301
|
assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), yesterday.strftime("%Y-%m-%d-02-01-00")
|
232
302
|
end
|
233
303
|
end
|
@@ -254,6 +324,60 @@ describe "Cron Job" do
|
|
254
324
|
}
|
255
325
|
assert_equal @job.sidekiq_worker_message, payload
|
256
326
|
end
|
327
|
+
|
328
|
+
describe 'with date_as_argument' do
|
329
|
+
before do
|
330
|
+
@args.merge!(date_as_argument: true)
|
331
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
332
|
+
end
|
333
|
+
|
334
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
335
|
+
|
336
|
+
it 'should add timestamp to args' do
|
337
|
+
assert_equal args[0], {foo: 'bar'}
|
338
|
+
assert args[-1].is_a?(Float)
|
339
|
+
assert args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
describe 'with GlobalID::Identification args' do
|
344
|
+
before do
|
345
|
+
@args.merge!(args: Person.new(1))
|
346
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
347
|
+
end
|
348
|
+
|
349
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
350
|
+
|
351
|
+
it 'should add timestamp to args' do
|
352
|
+
assert_equal args[0], Person.new(1)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe 'with GlobalID::Identification args in Array' do
|
357
|
+
before do
|
358
|
+
@args.merge!(args: [Person.new(1)])
|
359
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
360
|
+
end
|
361
|
+
|
362
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
363
|
+
|
364
|
+
it 'should add timestamp to args' do
|
365
|
+
assert_equal args[0], Person.new(1)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
describe 'with GlobalID::Identification args in Hash' do
|
370
|
+
before do
|
371
|
+
@args.merge!(args: {person: Person.new(1)})
|
372
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
373
|
+
end
|
374
|
+
|
375
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
376
|
+
|
377
|
+
it 'should add timestamp to args' do
|
378
|
+
assert_equal args[0], {person: Person.new(1)}
|
379
|
+
end
|
380
|
+
end
|
257
381
|
end
|
258
382
|
|
259
383
|
describe '#sidekiq_worker_message settings overwrite queue name' do
|
@@ -299,6 +423,125 @@ describe "Cron Job" do
|
|
299
423
|
it 'should return valid payload for Sidekiq::Client' do
|
300
424
|
payload = {
|
301
425
|
'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
|
426
|
+
'wrapped' => 'ActiveJobCronTestClass',
|
427
|
+
'queue' => 'super_queue',
|
428
|
+
'description' => nil,
|
429
|
+
'args' => [{
|
430
|
+
'job_class' => 'ActiveJobCronTestClass',
|
431
|
+
'job_id' => 'XYZ',
|
432
|
+
'queue_name' => 'super_queue',
|
433
|
+
'arguments' => [{foo: 'bar'}]
|
434
|
+
}]
|
435
|
+
}
|
436
|
+
assert_equal @job.active_job_message, payload
|
437
|
+
end
|
438
|
+
|
439
|
+
describe 'with date_as_argument' do
|
440
|
+
before do
|
441
|
+
@args.merge!(date_as_argument: true)
|
442
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
443
|
+
end
|
444
|
+
|
445
|
+
let(:args) { @job.active_job_message['args'][0]['arguments'] }
|
446
|
+
|
447
|
+
it 'should add timestamp to args' do
|
448
|
+
args = @job.active_job_message['args'][0]['arguments']
|
449
|
+
assert_equal args[0], {foo: 'bar'}
|
450
|
+
assert args[-1].is_a?(Float)
|
451
|
+
assert args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
describe '#active_job_message - unknown Active Job Worker class' do
|
457
|
+
before do
|
458
|
+
SecureRandom.stubs(:uuid).returns('XYZ')
|
459
|
+
ActiveJob::Base.queue_name_prefix = ''
|
460
|
+
|
461
|
+
@args = {
|
462
|
+
name: 'Test',
|
463
|
+
cron: '* * * * *',
|
464
|
+
klass: 'UnknownActiveJobCronTestClass',
|
465
|
+
active_job: true,
|
466
|
+
queue: 'super_queue',
|
467
|
+
description: nil,
|
468
|
+
args: { foo: 'bar' }
|
469
|
+
}
|
470
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
471
|
+
end
|
472
|
+
|
473
|
+
it 'should return valid payload for Sidekiq::Client' do
|
474
|
+
payload = {
|
475
|
+
'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
|
476
|
+
'wrapped' => 'UnknownActiveJobCronTestClass',
|
477
|
+
'queue' => 'super_queue',
|
478
|
+
'description' => nil,
|
479
|
+
'args' => [{
|
480
|
+
'job_class' => 'UnknownActiveJobCronTestClass',
|
481
|
+
'job_id' => 'XYZ',
|
482
|
+
'queue_name' => 'super_queue',
|
483
|
+
'arguments' => [{foo: 'bar'}]
|
484
|
+
}]
|
485
|
+
}
|
486
|
+
assert_equal @job.active_job_message, payload
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
describe '#active_job_message with symbolize_args (hash)' do
|
491
|
+
before do
|
492
|
+
SecureRandom.stubs(:uuid).returns('XYZ')
|
493
|
+
ActiveJob::Base.queue_name_prefix = ''
|
494
|
+
|
495
|
+
@args = {
|
496
|
+
name: 'Test',
|
497
|
+
cron: '* * * * *',
|
498
|
+
klass: 'ActiveJobCronTestClass',
|
499
|
+
queue: 'super_queue',
|
500
|
+
description: nil,
|
501
|
+
symbolize_args: true,
|
502
|
+
args: { 'foo' => 'bar' }
|
503
|
+
}
|
504
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
505
|
+
end
|
506
|
+
|
507
|
+
it 'should return valid payload for Sidekiq::Client' do
|
508
|
+
payload = {
|
509
|
+
'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
|
510
|
+
'wrapped' => 'ActiveJobCronTestClass',
|
511
|
+
'queue' => 'super_queue',
|
512
|
+
'description' => nil,
|
513
|
+
'args' => [{
|
514
|
+
'job_class' => 'ActiveJobCronTestClass',
|
515
|
+
'job_id' => 'XYZ',
|
516
|
+
'queue_name' => 'super_queue',
|
517
|
+
'arguments' => [{foo: 'bar'}]
|
518
|
+
}]
|
519
|
+
}
|
520
|
+
assert_equal @job.active_job_message, payload
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
describe '#active_job_message with symbolize_args (array)' do
|
525
|
+
before do
|
526
|
+
SecureRandom.stubs(:uuid).returns('XYZ')
|
527
|
+
ActiveJob::Base.queue_name_prefix = ''
|
528
|
+
|
529
|
+
@args = {
|
530
|
+
name: 'Test',
|
531
|
+
cron: '* * * * *',
|
532
|
+
klass: 'ActiveJobCronTestClass',
|
533
|
+
queue: 'super_queue',
|
534
|
+
description: nil,
|
535
|
+
symbolize_args: true,
|
536
|
+
args: [{ 'foo' => 'bar' }]
|
537
|
+
}
|
538
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
539
|
+
end
|
540
|
+
|
541
|
+
it 'should return valid payload for Sidekiq::Client' do
|
542
|
+
payload = {
|
543
|
+
'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
|
544
|
+
'wrapped' => 'ActiveJobCronTestClass',
|
302
545
|
'queue' => 'super_queue',
|
303
546
|
'description' => nil,
|
304
547
|
'args' => [{
|
@@ -330,10 +573,11 @@ describe "Cron Job" do
|
|
330
573
|
|
331
574
|
it 'should return valid payload for Sidekiq::Client' do
|
332
575
|
payload = {
|
333
|
-
'class'
|
334
|
-
'
|
576
|
+
'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
|
577
|
+
'wrapped' => 'ActiveJobCronTestClass',
|
578
|
+
'queue' => 'prefix_super_queue',
|
335
579
|
'description' => nil,
|
336
|
-
'args'
|
580
|
+
'args' => [{
|
337
581
|
'job_class' => 'ActiveJobCronTestClass',
|
338
582
|
'job_id' => 'XYZ',
|
339
583
|
'queue_name' => 'prefix_super_queue',
|
@@ -357,9 +601,56 @@ describe "Cron Job" do
|
|
357
601
|
|
358
602
|
it 'pushes to queue active jobs message' do
|
359
603
|
@job.expects(:enqueue_active_job)
|
360
|
-
.returns(
|
604
|
+
.returns(ActiveJobCronTestClass.new)
|
361
605
|
@job.enque!
|
362
606
|
end
|
607
|
+
|
608
|
+
describe 'with date_as_argument' do
|
609
|
+
before do
|
610
|
+
@args.merge!(date_as_argument: true)
|
611
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
612
|
+
end
|
613
|
+
|
614
|
+
it 'should add timestamp to args' do
|
615
|
+
ActiveJobCronTestClass.expects(:perform_later)
|
616
|
+
.returns(ActiveJobCronTestClass.new)
|
617
|
+
.with { |*args|
|
618
|
+
assert args[-1].is_a?(Float)
|
619
|
+
assert args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
620
|
+
}
|
621
|
+
@job.enque!
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
describe 'with active_job == true' do
|
626
|
+
before do
|
627
|
+
@args.merge!(active_job: true)
|
628
|
+
end
|
629
|
+
|
630
|
+
describe 'with active_job job class' do
|
631
|
+
before do
|
632
|
+
@job = Sidekiq::Cron::Job.new(@args.merge(klass: 'ActiveJobCronTestClass'))
|
633
|
+
end
|
634
|
+
|
635
|
+
it 'enques via active_job interface' do
|
636
|
+
@job.expects(:enqueue_active_job)
|
637
|
+
.returns(ActiveJobCronTestClass.new)
|
638
|
+
@job.enque!
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
describe 'with non sidekiq job class' do
|
643
|
+
before do
|
644
|
+
@job = Sidekiq::Cron::Job.new(@args.merge(klass: 'CronTestClass'))
|
645
|
+
end
|
646
|
+
|
647
|
+
it 'enques via active_job interface' do
|
648
|
+
@job.expects(:enqueue_active_job)
|
649
|
+
.returns(ActiveJobCronTestClass.new)
|
650
|
+
@job.enque!
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
363
654
|
end
|
364
655
|
|
365
656
|
describe 'active job with queue_name_prefix' do
|
@@ -375,7 +666,7 @@ describe "Cron Job" do
|
|
375
666
|
|
376
667
|
it 'pushes to queue active jobs message with queue_name_prefix' do
|
377
668
|
@job.expects(:enqueue_active_job)
|
378
|
-
.returns(
|
669
|
+
.returns(ActiveJobCronTestClass.new)
|
379
670
|
@job.enque!
|
380
671
|
end
|
381
672
|
end
|
@@ -487,6 +778,24 @@ describe "Cron Job" do
|
|
487
778
|
.returns(true)
|
488
779
|
@job.enque!
|
489
780
|
end
|
781
|
+
|
782
|
+
describe 'with date_as_argument' do
|
783
|
+
before do
|
784
|
+
@args.merge!(date_as_argument: true)
|
785
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
786
|
+
end
|
787
|
+
|
788
|
+
it 'should add timestamp to args' do
|
789
|
+
CronTestClass::Setter.any_instance
|
790
|
+
.expects(:perform_async)
|
791
|
+
.returns(true)
|
792
|
+
.with { |*args|
|
793
|
+
assert args[-1].is_a?(Float)
|
794
|
+
assert args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
795
|
+
}
|
796
|
+
@job.enque!
|
797
|
+
end
|
798
|
+
end
|
490
799
|
end
|
491
800
|
|
492
801
|
describe 'sidekiq worker unknown class' do
|
@@ -508,6 +817,58 @@ describe "Cron Job" do
|
|
508
817
|
end
|
509
818
|
end
|
510
819
|
|
820
|
+
# @note sidekiq-cron 1.6.0 cannot process options correctly if any date_as_argument evaluates to true.
|
821
|
+
# This has been tested to resolve issues in environments where multiple sidekiq-cron versions are running when updating from 1.6.0
|
822
|
+
# See https://github.com/sidekiq-cron/sidekiq-cron/issues/350#issuecomment-1409798837 for more information.
|
823
|
+
describe "compat with sidekiq cron 1.6.0" do
|
824
|
+
describe "#to_hash with date_as_argument false" do
|
825
|
+
before do
|
826
|
+
@args = {
|
827
|
+
name: "Test",
|
828
|
+
cron: "* * * * *",
|
829
|
+
klass: "CronTestClass",
|
830
|
+
date_as_argument: false,
|
831
|
+
}
|
832
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
833
|
+
end
|
834
|
+
|
835
|
+
it "should not have date_as_argument property" do
|
836
|
+
assert !@job.to_hash.key?(:date_as_argument)
|
837
|
+
end
|
838
|
+
end
|
839
|
+
|
840
|
+
describe "#to_hash with no date_as_argument option" do
|
841
|
+
before do
|
842
|
+
@args = {
|
843
|
+
name: "Test",
|
844
|
+
cron: "* * * * *",
|
845
|
+
klass: "CronTestClass",
|
846
|
+
}
|
847
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
848
|
+
end
|
849
|
+
|
850
|
+
it "should not have date_as_argument property" do
|
851
|
+
assert !@job.to_hash.key?(:date_as_argument)
|
852
|
+
end
|
853
|
+
end
|
854
|
+
|
855
|
+
describe "#to_hash with date_as_argument" do
|
856
|
+
before do
|
857
|
+
@args = {
|
858
|
+
name: "Test",
|
859
|
+
cron: "* * * * *",
|
860
|
+
klass: "CronTestClass",
|
861
|
+
date_as_argument: true,
|
862
|
+
}
|
863
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
864
|
+
end
|
865
|
+
|
866
|
+
it "should have date_as_argument property with value '1'" do
|
867
|
+
assert_equal @job.to_hash[:date_as_argument], '1'
|
868
|
+
end
|
869
|
+
end
|
870
|
+
end
|
871
|
+
|
511
872
|
describe "save" do
|
512
873
|
before do
|
513
874
|
@args = {
|
@@ -522,7 +883,6 @@ describe "Cron Job" do
|
|
522
883
|
assert @job.save
|
523
884
|
end
|
524
885
|
|
525
|
-
|
526
886
|
it "be saved and found by name" do
|
527
887
|
assert @job.save, "not saved"
|
528
888
|
assert Sidekiq::Cron::Job.find("Test").is_a?(Sidekiq::Cron::Job)
|
@@ -598,15 +958,16 @@ describe "Cron Job" do
|
|
598
958
|
end
|
599
959
|
|
600
960
|
it "last_enqueue_time shouldn't be rewritten after save" do
|
601
|
-
#
|
602
|
-
last_enqueue_time = '2013-01-01 23:59:59'
|
961
|
+
# Adding last_enqueue_time to initialize is only for testing purposes.
|
962
|
+
last_enqueue_time = '2013-01-01 23:59:59 +0000'
|
963
|
+
expected_enqueue_time = DateTime.parse(last_enqueue_time).to_time.utc
|
603
964
|
Sidekiq::Cron::Job.create(@args.merge('last_enqueue_time' => last_enqueue_time))
|
604
965
|
job = Sidekiq::Cron::Job.find(@args)
|
605
|
-
assert_equal job.last_enqueue_time,
|
966
|
+
assert_equal job.last_enqueue_time, expected_enqueue_time
|
606
967
|
|
607
968
|
Sidekiq::Cron::Job.create(@args)
|
608
969
|
job = Sidekiq::Cron::Job.find(@args)
|
609
|
-
assert_equal job.last_enqueue_time,
|
970
|
+
assert_equal job.last_enqueue_time, expected_enqueue_time, "after second create should have same time"
|
610
971
|
end
|
611
972
|
end
|
612
973
|
|
@@ -623,6 +984,7 @@ describe "Cron Job" do
|
|
623
984
|
assert_equal job.name, "Test"
|
624
985
|
end
|
625
986
|
end
|
987
|
+
|
626
988
|
it "from String" do
|
627
989
|
args = {
|
628
990
|
name: "Test",
|
@@ -635,6 +997,7 @@ describe "Cron Job" do
|
|
635
997
|
assert_equal job.name, "Test"
|
636
998
|
end
|
637
999
|
end
|
1000
|
+
|
638
1001
|
it "from Array" do
|
639
1002
|
args = {
|
640
1003
|
name: "Test",
|
@@ -647,6 +1010,42 @@ describe "Cron Job" do
|
|
647
1010
|
assert_equal job.name, "Test"
|
648
1011
|
end
|
649
1012
|
end
|
1013
|
+
|
1014
|
+
it "from GlobalID::Identification" do
|
1015
|
+
args = {
|
1016
|
+
name: "Test",
|
1017
|
+
cron: "* * * * *",
|
1018
|
+
klass: "CronTestClass",
|
1019
|
+
args: Person.new(1)
|
1020
|
+
}
|
1021
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1022
|
+
assert_equal job.args, [{"_sc_globalid"=>"gid://app/Person/1"}]
|
1023
|
+
end
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
it "from GlobalID::Identification in Array" do
|
1027
|
+
args = {
|
1028
|
+
name: "Test",
|
1029
|
+
cron: "* * * * *",
|
1030
|
+
klass: "CronTestClass",
|
1031
|
+
args: [Person.new(1)]
|
1032
|
+
}
|
1033
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1034
|
+
assert_equal job.args, [{"_sc_globalid"=>"gid://app/Person/1"}]
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
it "from GlobalID::Identification in Hash" do
|
1039
|
+
args = {
|
1040
|
+
name: "Test",
|
1041
|
+
cron: "* * * * *",
|
1042
|
+
klass: "CronTestClass",
|
1043
|
+
args: {person: Person.new(1)}
|
1044
|
+
}
|
1045
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1046
|
+
assert_equal job.args, [{person: {"_sc_globalid"=>"gid://app/Person/1"}}]
|
1047
|
+
end
|
1048
|
+
end
|
650
1049
|
end
|
651
1050
|
|
652
1051
|
describe "create & find methods" do
|
@@ -688,7 +1087,7 @@ describe "Cron Job" do
|
|
688
1087
|
Sidekiq::Cron::Job.create(@args.merge(name: "Test3"))
|
689
1088
|
|
690
1089
|
Sidekiq.redis do |conn|
|
691
|
-
conn.sadd Sidekiq::Cron::Job.jobs_key, "some_other_key"
|
1090
|
+
conn.sadd Sidekiq::Cron::Job.jobs_key, ["some_other_key"]
|
692
1091
|
end
|
693
1092
|
|
694
1093
|
assert_equal Sidekiq::Cron::Job.all.size, 3, "All have to return only valid 3 jobs"
|
@@ -706,7 +1105,6 @@ describe "Cron Job" do
|
|
706
1105
|
Sidekiq::Cron::Job.create(@args)
|
707
1106
|
assert Sidekiq::Cron::Job.find('name' => "Test"), "String keys"
|
708
1107
|
end
|
709
|
-
|
710
1108
|
end
|
711
1109
|
|
712
1110
|
describe "destroy" do
|
@@ -743,7 +1141,6 @@ describe "Cron Job" do
|
|
743
1141
|
Sidekiq::Cron::Job.create(@args)
|
744
1142
|
assert Sidekiq::Cron::Job.destroy('name' => "Test"), "String keys"
|
745
1143
|
end
|
746
|
-
|
747
1144
|
end
|
748
1145
|
|
749
1146
|
describe "destroy_removed_jobs" do
|
@@ -775,11 +1172,11 @@ describe "Cron Job" do
|
|
775
1172
|
cron: "* * * * *",
|
776
1173
|
klass: "CronTestClass"
|
777
1174
|
}
|
778
|
-
#
|
779
|
-
#after next cron time!
|
1175
|
+
# First time is always after next cron time!
|
780
1176
|
@time = Time.now.utc + 120
|
781
1177
|
end
|
782
|
-
|
1178
|
+
|
1179
|
+
it "be always false when status is disabled" do
|
783
1180
|
refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time
|
784
1181
|
refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time - 60
|
785
1182
|
refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time - 120
|
@@ -800,7 +1197,6 @@ describe "Cron Job" do
|
|
800
1197
|
assert Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
|
801
1198
|
refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
|
802
1199
|
|
803
|
-
#just for check
|
804
1200
|
refute Sidekiq::Cron::Job.new(@args).should_enque? @time
|
805
1201
|
refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 135
|
806
1202
|
refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
|
@@ -816,7 +1212,7 @@ describe "Cron Job" do
|
|
816
1212
|
assert job.test_and_enque_for_time!(@time), "should enqueue"
|
817
1213
|
|
818
1214
|
future_now = @time + 1 * 60 * 60
|
819
|
-
Time.stubs(:now).returns(future_now) #
|
1215
|
+
Time.stubs(:now).returns(future_now) # Save uses Time.now.utc
|
820
1216
|
job.save
|
821
1217
|
assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time!(future_now + 30), "should enqueue"
|
822
1218
|
end
|
@@ -833,7 +1229,7 @@ describe "Cron Job" do
|
|
833
1229
|
end
|
834
1230
|
assert_equal Sidekiq::Queue.all.first.size, 1, "Sidekiq queue 1 job in queue"
|
835
1231
|
|
836
|
-
# 20 hours after
|
1232
|
+
# 20 hours after.
|
837
1233
|
assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 1 * 60 * 60
|
838
1234
|
refute Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 1 * 60 * 60
|
839
1235
|
|
@@ -842,7 +1238,7 @@ describe "Cron Job" do
|
|
842
1238
|
end
|
843
1239
|
assert_equal Sidekiq::Queue.all.first.size, 2, "Sidekiq queue 2 jobs in queue"
|
844
1240
|
|
845
|
-
# 26 hour after
|
1241
|
+
# 26 hour after.
|
846
1242
|
assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 26 * 60 * 60
|
847
1243
|
refute Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 26 * 60 * 60
|
848
1244
|
|
@@ -854,7 +1250,6 @@ describe "Cron Job" do
|
|
854
1250
|
end
|
855
1251
|
|
856
1252
|
describe "load" do
|
857
|
-
|
858
1253
|
describe "from hash" do
|
859
1254
|
before do
|
860
1255
|
@jobs_hash = {
|
@@ -877,13 +1272,24 @@ describe "Cron Job" do
|
|
877
1272
|
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
|
878
1273
|
end
|
879
1274
|
|
1275
|
+
it "duplicate jobs are not loaded" do
|
1276
|
+
out = Sidekiq::Cron::Job.load_from_hash! @jobs_hash
|
1277
|
+
assert_equal out.size, 0, "should have no errors"
|
1278
|
+
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
|
1279
|
+
|
1280
|
+
out_2 = Sidekiq::Cron::Job.load_from_hash! @jobs_hash
|
1281
|
+
assert_equal out_2.size, 0, "should have no errors"
|
1282
|
+
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after loading again"
|
1283
|
+
end
|
1284
|
+
|
880
1285
|
it "return errors on loaded jobs" do
|
881
1286
|
assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
|
882
|
-
#
|
1287
|
+
# Set something bad to hash.
|
883
1288
|
@jobs_hash['name_of_job']['cron'] = "bad cron"
|
884
1289
|
out = Sidekiq::Cron::Job.load_from_hash @jobs_hash
|
885
1290
|
assert_equal 1, out.size, "should have 1 error"
|
886
|
-
|
1291
|
+
assert_includes out['name_of_job'].first, "bad cron"
|
1292
|
+
assert_includes out['name_of_job'].first, "ArgumentError:"
|
887
1293
|
assert_equal 1, Sidekiq::Cron::Job.all.size, "Should have only 1 job after load"
|
888
1294
|
end
|
889
1295
|
|
@@ -928,6 +1334,16 @@ describe "Cron Job" do
|
|
928
1334
|
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
|
929
1335
|
end
|
930
1336
|
|
1337
|
+
it "duplicate jobs are not loaded" do
|
1338
|
+
out = Sidekiq::Cron::Job.load_from_array @jobs_array
|
1339
|
+
assert_equal out.size, 0, "should have no errors"
|
1340
|
+
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
|
1341
|
+
|
1342
|
+
out_2 = Sidekiq::Cron::Job.load_from_array @jobs_array
|
1343
|
+
assert_equal out_2.size, 0, "should have no errors"
|
1344
|
+
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after loading again"
|
1345
|
+
end
|
1346
|
+
|
931
1347
|
it "create new jobs and update old one with same settings with load_from_array" do
|
932
1348
|
assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
|
933
1349
|
out = Sidekiq::Cron::Job.load_from_array! @jobs_array
|
@@ -965,7 +1381,6 @@ describe "Cron Job" do
|
|
965
1381
|
|
966
1382
|
assert_equal Sidekiq::Cron::Job.all.first.sidekiq_worker_message, payload
|
967
1383
|
end
|
968
|
-
|
969
1384
|
end
|
970
1385
|
end
|
971
1386
|
end
|