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.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +145 -0
  3. data/Gemfile +3 -29
  4. data/README.md +175 -121
  5. data/Rakefile +3 -42
  6. data/lib/sidekiq/cron/job.rb +273 -144
  7. data/lib/sidekiq/cron/launcher.rb +39 -43
  8. data/lib/sidekiq/cron/locales/de.yml +2 -2
  9. data/lib/sidekiq/cron/locales/en.yml +6 -2
  10. data/lib/sidekiq/cron/locales/it.yml +23 -0
  11. data/lib/sidekiq/cron/locales/ja.yml +18 -0
  12. data/lib/sidekiq/cron/locales/pt.yml +22 -0
  13. data/lib/sidekiq/cron/locales/ru.yml +2 -2
  14. data/lib/sidekiq/cron/locales/zh-CN.yml +19 -0
  15. data/lib/sidekiq/cron/poller.rb +22 -12
  16. data/lib/sidekiq/cron/schedule_loader.rb +22 -0
  17. data/lib/sidekiq/cron/support.rb +8 -1
  18. data/lib/sidekiq/cron/version.rb +7 -0
  19. data/lib/sidekiq/cron/views/cron.erb +38 -28
  20. data/lib/sidekiq/cron/views/cron_show.erb +88 -0
  21. data/lib/sidekiq/cron/web.rb +1 -7
  22. data/lib/sidekiq/cron/web_extension.rb +19 -15
  23. data/lib/sidekiq/cron.rb +1 -0
  24. data/lib/sidekiq/options.rb +25 -0
  25. data/sidekiq-cron.gemspec +23 -108
  26. data/test/integration/performance_test.rb +13 -19
  27. data/test/models/person.rb +21 -0
  28. data/test/test_helper.rb +37 -38
  29. data/test/unit/fixtures/schedule_array.yml +13 -0
  30. data/test/unit/fixtures/schedule_erb.yml +6 -0
  31. data/test/unit/fixtures/schedule_hash.yml +12 -0
  32. data/test/unit/fixtures/schedule_string.yml +1 -0
  33. data/test/unit/job_test.rb +450 -35
  34. data/test/unit/launcher_test.rb +33 -0
  35. data/test/unit/poller_test.rb +28 -37
  36. data/test/unit/schedule_loader_test.rb +58 -0
  37. data/test/unit/web_extension_test.rb +59 -41
  38. metadata +72 -191
  39. data/.document +0 -5
  40. data/.travis.yml +0 -19
  41. data/Changes.md +0 -50
  42. data/Dockerfile +0 -32
  43. data/VERSION +0 -1
  44. data/config.ru +0 -14
  45. data/docker-compose.yml +0 -21
  46. data/examples/web-cron-ui.png +0 -0
  47. data/lib/sidekiq/cron/views/cron.slim +0 -69
@@ -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
- #clear all previous saved data from redis
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
- #clear all queues
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.formated_last_time(@time)
182
+ assert_equal '2015-01-02T02:04:00Z', @job.formatted_last_time(@time)
146
183
  end
147
184
 
148
- it 'returns formated_enqueue_time' do
149
- assert_equal '1420164240.0', @job.formated_enqueue_time(@time)
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.now.utc
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.now.utc
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.now.utc
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 = (Date.today - 1)
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' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
334
- 'queue' => 'prefix_super_queue',
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(true)
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(true)
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
- #adding last_enqueue_time to initialize is only for test purpose
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, Time.parse(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, Time.parse(last_enqueue_time), "after second create should have same 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
- #first time is allways
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
- it "be allways false when status is disabled" do
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) # save uses Time.now.utc
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
- #set something bag to hash
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
- assert_equal ({"name_of_job"=>["'cron' -> bad cron: not a valid cronline : 'bad cron'"]}), out
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