sidekiq-cron 1.5.1 → 1.12.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.
@@ -1,1124 +0,0 @@
1
- require './test/test_helper'
2
-
3
- describe "Cron Job" do
4
- before do
5
- #clear all previous saved data from redis
6
- Sidekiq.redis do |conn|
7
- conn.keys("cron_job*").each do |key|
8
- conn.del(key)
9
- end
10
- end
11
-
12
- #clear all queues
13
- Sidekiq::Queue.all.each do |queue|
14
- queue.clear
15
- end
16
- end
17
-
18
- it "be initialized" do
19
- job = Sidekiq::Cron::Job.new()
20
- assert_nil job.last_enqueue_time
21
- assert job.is_a?(Sidekiq::Cron::Job)
22
- end
23
-
24
- describe "class methods" do
25
- it "have create method" do
26
- assert Sidekiq::Cron::Job.respond_to?(:create)
27
- end
28
-
29
- it "have destroy method" do
30
- assert Sidekiq::Cron::Job.respond_to?(:destroy)
31
- end
32
-
33
- it "have count" do
34
- assert Sidekiq::Cron::Job.respond_to?(:count)
35
- end
36
-
37
- it "have all" do
38
- assert Sidekiq::Cron::Job.respond_to?(:all)
39
- end
40
-
41
- it "have find" do
42
- assert Sidekiq::Cron::Job.respond_to?(:find)
43
- end
44
- end
45
-
46
- describe "instance methods" do
47
- before do
48
- @job = Sidekiq::Cron::Job.new()
49
- end
50
-
51
- it "have save method" do
52
- assert @job.respond_to?(:save)
53
- end
54
-
55
- it "have valid? method" do
56
- assert @job.respond_to?("valid?".to_sym)
57
- end
58
-
59
- it "have destroy method" do
60
- assert @job.respond_to?(:destroy)
61
- end
62
-
63
- it "have enabled? method" do
64
- assert @job.respond_to?(:enabled?)
65
- end
66
-
67
- it "have disabled? method" do
68
- assert @job.respond_to?(:disabled?)
69
- end
70
-
71
- it 'have sort_name - used for sorting enabled disbaled jobs on frontend' do
72
- job = Sidekiq::Cron::Job.new(name: "TestName")
73
- assert_equal job.sort_name, "0_testname"
74
- end
75
- end
76
-
77
- describe "invalid job" do
78
-
79
- before do
80
- @job = Sidekiq::Cron::Job.new()
81
- end
82
-
83
- it "allow a class instance for the klass" do
84
- @job.klass = CronTestClass
85
-
86
- refute @job.valid?
87
- refute @job.errors.any?{|e| e.include?("klass")}, "Should not have error for klass"
88
- end
89
-
90
- it "return false on valid? and errors" do
91
- refute @job.valid?
92
- assert @job.errors.is_a?(Array)
93
-
94
- assert @job.errors.any?{|e| e.include?("name")}, "Should have error for name"
95
- assert @job.errors.any?{|e| e.include?("cron")}, "Should have error for cron"
96
- assert @job.errors.any?{|e| e.include?("klass")}, "Should have error for klass"
97
- end
98
-
99
- it "return false on valid? with invalid cron" do
100
- @job.cron = "* s *"
101
- refute @job.valid?
102
- assert @job.errors.is_a?(Array)
103
- assert @job.errors.any?{|e| e.include?("cron")}, "Should have error for cron"
104
- end
105
-
106
- it "return false on save" do
107
- refute @job.save
108
- end
109
- end
110
-
111
- describe "new" do
112
- before do
113
- @args = {
114
- name: "Test",
115
- cron: "* * * * *"
116
- }
117
- @job = Sidekiq::Cron::Job.new(@args)
118
- end
119
-
120
- it "have all setted attributes" do
121
- @args.each do |key, value|
122
- assert_equal @job.send(key), value, "New job should have #{key} with value #{value} but it has: #{@job.send(key)}"
123
- end
124
- end
125
-
126
- it "have to_hash method" do
127
- [:name,:klass,:cron,:description,:args,:message,:status].each do |key|
128
- assert @job.to_hash.has_key?(key), "to_hash must have key: #{key}"
129
- end
130
- end
131
- end
132
-
133
- describe 'parse_enqueue_time' do
134
- before do
135
- @args = {
136
- name: "Test",
137
- cron: "* * * * *"
138
- }
139
- @job = Sidekiq::Cron::Job.new(@args)
140
- end
141
-
142
- it 'should correctly parse new format' do
143
- assert_equal @job.send(:parse_enqueue_time, '2017-01-02 15:23:43 UTC'), Time.new(2017, 1, 2, 15, 23, 43, '+00:00')
144
- end
145
-
146
- it 'should correctly parse new format with different timezone' do
147
- 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')
148
- end
149
-
150
- it 'should correctly parse old format' do
151
- assert_equal @job.send(:parse_enqueue_time, '2017-01-02 15:23:43'), Time.new(2017, 1, 2, 15, 23, 43, '+00:00')
152
- end
153
- end
154
-
155
- describe 'formatted time' do
156
- before do
157
- @args = {
158
- name: "Test",
159
- cron: "* * * * *"
160
- }
161
- @job = Sidekiq::Cron::Job.new(@args)
162
- @time = Time.new(2015, 1, 2, 3, 4, 5, '+01:00')
163
- end
164
-
165
- it 'returns formatted_last_time' do
166
- assert_equal '2015-01-02T02:04:00Z', @job.formated_last_time(@time)
167
- end
168
-
169
- it 'returns formated_enqueue_time' do
170
- assert_equal '1420164240.0', @job.formated_enqueue_time(@time)
171
- end
172
- end
173
-
174
- describe "new with different class inputs" do
175
- it "be initialized by 'klass' and Class" do
176
- job = Sidekiq::Cron::Job.new('klass' => CronTestClass)
177
- assert_equal job.message['class'], 'CronTestClass'
178
- end
179
-
180
- it "be initialized by 'klass' and string Class" do
181
- job = Sidekiq::Cron::Job.new('klass' => 'CronTestClass')
182
- assert_equal job.message['class'], 'CronTestClass'
183
- end
184
-
185
- it "be initialized by 'class' and string Class" do
186
- job = Sidekiq::Cron::Job.new('class' => 'CronTestClass')
187
- assert_equal job.message['class'], 'CronTestClass'
188
- end
189
-
190
- it "be initialized by 'class' and Class" do
191
- job = Sidekiq::Cron::Job.new('class' => CronTestClass)
192
- assert_equal job.message['class'], 'CronTestClass'
193
- end
194
- end
195
-
196
- describe "new should find klass specific settings (queue, retry ...)" do
197
- it "nothing raise on unknown klass" do
198
- job = Sidekiq::Cron::Job.new('klass' => 'UnknownCronClass')
199
- assert_equal job.message, {"class"=>"UnknownCronClass", "args"=>[], "queue"=>"default"}
200
- end
201
-
202
- it "be initialized with default attributes" do
203
- job = Sidekiq::Cron::Job.new('klass' => 'CronTestClass')
204
- assert_equal job.message, {"retry"=>true, "queue"=>"default", "class"=>"CronTestClass", "args"=>[]}
205
- end
206
-
207
- it "be initialized with class specified attributes" do
208
- job = Sidekiq::Cron::Job.new('class' => 'CronTestClassWithQueue')
209
- assert_equal job.message, {"retry"=>false,
210
- "queue"=>:super,
211
- "backtrace"=>true,
212
- "class"=>"CronTestClassWithQueue",
213
- "args"=>[]}
214
- end
215
-
216
- it "be initialized with 'class' and overwrite queue by settings" do
217
- job = Sidekiq::Cron::Job.new('class' => CronTestClassWithQueue, queue: 'my_testing_queue')
218
-
219
- assert_equal job.message, {"retry"=>false,
220
- "queue"=>'my_testing_queue',
221
- "backtrace"=>true,
222
- "class"=>"CronTestClassWithQueue",
223
- "args"=>[]}
224
- end
225
-
226
- it "be initialized with 'class' and date_as_argument" do
227
- job = Sidekiq::Cron::Job.new('class' => 'CronTestClassWithQueue', "date_as_argument" => true)
228
-
229
- job_message = job.message
230
- job_args = job_message.delete("args")
231
- assert_equal job_message, {"retry"=>false,
232
- "queue"=>:super,
233
- "backtrace"=>true,
234
- "class"=>"CronTestClassWithQueue"}
235
- assert job_args[-1].is_a?(Float)
236
- assert job_args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
237
- end
238
-
239
- it "be initialized with 'class', 2 arguments and date_as_argument" do
240
- job = Sidekiq::Cron::Job.new('class' => 'CronTestClassWithQueue', "date_as_argument" => true, "args"=> ["arg1", :arg2])
241
-
242
- job_message = job.message
243
- job_args = job_message.delete("args")
244
- assert_equal job_message, {"retry"=>false,
245
- "queue"=>:super,
246
- "backtrace"=>true,
247
- "class"=>"CronTestClassWithQueue"}
248
- assert job_args[-1].is_a?(Float)
249
- assert job_args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
250
- assert_equal job_args[0..-2], ["arg1", :arg2]
251
- end
252
-
253
- end
254
-
255
- describe "cron test" do
256
- before do
257
- @job = Sidekiq::Cron::Job.new()
258
- end
259
-
260
- it "return previous minute" do
261
- @job.cron = "* * * * *"
262
- time = Time.new(2018, 8, 10, 13, 24, 56).utc
263
- assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-%H-%M-00")
264
- end
265
-
266
- it "return previous hour" do
267
- @job.cron = "1 * * * *"
268
- time = Time.new(2018, 8, 10, 13, 24, 56).utc
269
- assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-%H-01-00")
270
- end
271
-
272
- it "return previous day" do
273
- @job.cron = "1 2 * * * Etc/GMT"
274
- time = Time.new(2018, 8, 10, 13, 24, 56).utc
275
-
276
- if time.hour >= 2
277
- assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), time.strftime("%Y-%m-%d-02-01-00")
278
- else
279
- yesterday = time - 1.day
280
- assert_equal @job.last_time(time).strftime("%Y-%m-%d-%H-%M-%S"), yesterday.strftime("%Y-%m-%d-02-01-00")
281
- end
282
- end
283
- end
284
-
285
- describe '#sidekiq_worker_message' do
286
- before do
287
- @args = {
288
- name: 'Test',
289
- cron: '* * * * *',
290
- queue: 'super_queue',
291
- klass: 'CronTestClass',
292
- args: { foo: 'bar' }
293
- }
294
- @job = Sidekiq::Cron::Job.new(@args)
295
- end
296
-
297
- it 'should return valid payload for Sidekiq::Client' do
298
- payload = {
299
- "retry" => true,
300
- "queue" => "super_queue",
301
- "class" => "CronTestClass",
302
- "args" => [{:foo=>"bar"}]
303
- }
304
- assert_equal @job.sidekiq_worker_message, payload
305
- end
306
- end
307
-
308
- describe '#sidekiq_worker_message settings overwrite queue name' do
309
- before do
310
- @args = {
311
- name: 'Test',
312
- cron: '* * * * *',
313
- queue: 'super_queue',
314
- klass: 'CronTestClassWithQueue',
315
- args: { foo: 'bar' }
316
- }
317
- @job = Sidekiq::Cron::Job.new(@args)
318
- end
319
-
320
- it 'should return valid payload for Sidekiq::Client with overwrite queue name' do
321
- payload = {
322
- "retry" => false,
323
- "backtrace"=>true,
324
- "queue" => "super_queue",
325
- "class" => "CronTestClassWithQueue",
326
- "args" => [{:foo=>"bar"}]
327
- }
328
- assert_equal @job.sidekiq_worker_message, payload
329
- end
330
- end
331
-
332
- describe '#active_job_message' do
333
- before do
334
- SecureRandom.stubs(:uuid).returns('XYZ')
335
- ActiveJob::Base.queue_name_prefix = ''
336
-
337
- @args = {
338
- name: 'Test',
339
- cron: '* * * * *',
340
- klass: 'ActiveJobCronTestClass',
341
- queue: 'super_queue',
342
- description: nil,
343
- args: { foo: 'bar' }
344
- }
345
- @job = Sidekiq::Cron::Job.new(@args)
346
- end
347
-
348
- it 'should return valid payload for Sidekiq::Client' do
349
- payload = {
350
- 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
351
- 'wrapped' => 'ActiveJobCronTestClass',
352
- 'queue' => 'super_queue',
353
- 'description' => nil,
354
- 'args' => [{
355
- 'job_class' => 'ActiveJobCronTestClass',
356
- 'job_id' => 'XYZ',
357
- 'queue_name' => 'super_queue',
358
- 'arguments' => [{foo: 'bar'}]
359
- }]
360
- }
361
- assert_equal @job.active_job_message, payload
362
- end
363
- end
364
-
365
- describe '#active_job_message - unknown Active Job Worker class' do
366
- before do
367
- SecureRandom.stubs(:uuid).returns('XYZ')
368
- ActiveJob::Base.queue_name_prefix = ''
369
-
370
- @args = {
371
- name: 'Test',
372
- cron: '* * * * *',
373
- klass: 'UnknownActiveJobCronTestClass',
374
- active_job: true,
375
- queue: 'super_queue',
376
- description: nil,
377
- args: { foo: 'bar' }
378
- }
379
- @job = Sidekiq::Cron::Job.new(@args)
380
- end
381
-
382
- it 'should return valid payload for Sidekiq::Client' do
383
- payload = {
384
- 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
385
- 'wrapped' => 'UnknownActiveJobCronTestClass',
386
- 'queue' => 'super_queue',
387
- 'description' => nil,
388
- 'args' => [{
389
- 'job_class' => 'UnknownActiveJobCronTestClass',
390
- 'job_id' => 'XYZ',
391
- 'queue_name' => 'super_queue',
392
- 'arguments' => [{foo: 'bar'}]
393
- }]
394
- }
395
- assert_equal @job.active_job_message, payload
396
- end
397
- end
398
-
399
- describe '#active_job_message with symbolize_args (hash)' do
400
- before do
401
- SecureRandom.stubs(:uuid).returns('XYZ')
402
- ActiveJob::Base.queue_name_prefix = ''
403
-
404
- @args = {
405
- name: 'Test',
406
- cron: '* * * * *',
407
- klass: 'ActiveJobCronTestClass',
408
- queue: 'super_queue',
409
- description: nil,
410
- symbolize_args: true,
411
- args: { 'foo' => 'bar' }
412
- }
413
- @job = Sidekiq::Cron::Job.new(@args)
414
- end
415
-
416
- it 'should return valid payload for Sidekiq::Client' do
417
- payload = {
418
- 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
419
- 'wrapped' => 'ActiveJobCronTestClass',
420
- 'queue' => 'super_queue',
421
- 'description' => nil,
422
- 'args' => [{
423
- 'job_class' => 'ActiveJobCronTestClass',
424
- 'job_id' => 'XYZ',
425
- 'queue_name' => 'super_queue',
426
- 'arguments' => [{foo: 'bar'}]
427
- }]
428
- }
429
- assert_equal @job.active_job_message, payload
430
- end
431
- end
432
-
433
- describe '#active_job_message with symbolize_args (array)' do
434
- before do
435
- SecureRandom.stubs(:uuid).returns('XYZ')
436
- ActiveJob::Base.queue_name_prefix = ''
437
-
438
- @args = {
439
- name: 'Test',
440
- cron: '* * * * *',
441
- klass: 'ActiveJobCronTestClass',
442
- queue: 'super_queue',
443
- description: nil,
444
- symbolize_args: true,
445
- args: [{ 'foo' => 'bar' }]
446
- }
447
- @job = Sidekiq::Cron::Job.new(@args)
448
- end
449
-
450
- it 'should return valid payload for Sidekiq::Client' do
451
- payload = {
452
- 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
453
- 'wrapped' => 'ActiveJobCronTestClass',
454
- 'queue' => 'super_queue',
455
- 'description' => nil,
456
- 'args' => [{
457
- 'job_class' => 'ActiveJobCronTestClass',
458
- 'job_id' => 'XYZ',
459
- 'queue_name' => 'super_queue',
460
- 'arguments' => [{foo: 'bar'}]
461
- }]
462
- }
463
- assert_equal @job.active_job_message, payload
464
- end
465
- end
466
-
467
- describe '#active_job_message with queue_name_prefix' do
468
- before do
469
- SecureRandom.stubs(:uuid).returns('XYZ')
470
- ActiveJob::Base.queue_name_prefix = "prefix"
471
-
472
- @args = {
473
- name: 'Test',
474
- cron: '* * * * *',
475
- klass: 'ActiveJobCronTestClass',
476
- queue: 'super_queue',
477
- queue_name_prefix: 'prefix',
478
- args: { foo: 'bar' }
479
- }
480
- @job = Sidekiq::Cron::Job.new(@args)
481
- end
482
-
483
- it 'should return valid payload for Sidekiq::Client' do
484
- payload = {
485
- 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
486
- 'wrapped' => 'ActiveJobCronTestClass',
487
- 'queue' => 'prefix_super_queue',
488
- 'description' => nil,
489
- 'args' => [{
490
- 'job_class' => 'ActiveJobCronTestClass',
491
- 'job_id' => 'XYZ',
492
- 'queue_name' => 'prefix_super_queue',
493
- 'arguments' => [{foo: 'bar'}]
494
- }]
495
- }
496
- assert_equal @job.active_job_message, payload
497
- end
498
- end
499
-
500
- describe '#enque!' do
501
- describe 'active job' do
502
- before do
503
- @args = {
504
- name: 'Test',
505
- cron: '* * * * *',
506
- klass: 'ActiveJobCronTestClass'
507
- }
508
- @job = Sidekiq::Cron::Job.new(@args)
509
- end
510
-
511
- it 'pushes to queue active jobs message' do
512
- @job.expects(:enqueue_active_job)
513
- .returns(ActiveJobCronTestClass.new)
514
- @job.enque!
515
- end
516
- end
517
-
518
- describe 'active job with queue_name_prefix' do
519
- before do
520
- @args = {
521
- name: 'Test',
522
- cron: '* * * * *',
523
- klass: 'ActiveJobCronTestClass',
524
- queue: 'cron'
525
- }
526
- @job = Sidekiq::Cron::Job.new(@args)
527
- end
528
-
529
- it 'pushes to queue active jobs message with queue_name_prefix' do
530
- @job.expects(:enqueue_active_job)
531
- .returns(ActiveJobCronTestClass.new)
532
- @job.enque!
533
- end
534
- end
535
-
536
- describe 'active job via configuration (bool: true) [unknown class]' do
537
- before do
538
- @args = {
539
- name: 'Test',
540
- cron: '* * * * *',
541
- klass: 'UnknownClass',
542
- active_job: true
543
- }
544
- @job = Sidekiq::Cron::Job.new(@args)
545
- end
546
-
547
- it 'pushes to queue active jobs message' do
548
- @job.expects(:active_job_message)
549
- .returns('class' => 'UnknownClass', 'args' => [])
550
- @job.enque!
551
- end
552
- end
553
-
554
- describe 'active job via configuration (string: true) [unknown class]' do
555
- before do
556
- @args = {
557
- name: 'Test',
558
- cron: '* * * * *',
559
- klass: 'UnknownClass',
560
- active_job: 'true'
561
- }
562
- @job = Sidekiq::Cron::Job.new(@args)
563
- end
564
-
565
- it 'pushes to queue active jobs message' do
566
- @job.expects(:active_job_message)
567
- .returns('class' => 'UnknownClass', 'args' => [])
568
- @job.enque!
569
- end
570
- end
571
-
572
- describe 'active job via configuration (string: yes) [unknown class]' do
573
- before do
574
- @args = {
575
- name: 'Test',
576
- cron: '* * * * *',
577
- klass: 'UnknownClass',
578
- active_job: 'yes'
579
- }
580
- @job = Sidekiq::Cron::Job.new(@args)
581
- end
582
-
583
- it 'pushes to queue active jobs message' do
584
- @job.expects(:active_job_message)
585
- .returns('class' => 'UnknownClass', 'args' => [])
586
- @job.enque!
587
- end
588
- end
589
-
590
- describe 'active job via configuration (number: 1) [unknown class]' do
591
- before do
592
- @args = {
593
- name: 'Test',
594
- cron: '* * * * *',
595
- klass: 'UnknownClass',
596
- active_job: 1
597
- }
598
- @job = Sidekiq::Cron::Job.new(@args)
599
- end
600
-
601
- it 'pushes to queue active jobs message' do
602
- @job.expects(:active_job_message)
603
- .returns('class' => 'UnknownClass', 'args' => [])
604
- @job.enque!
605
- end
606
- end
607
-
608
- describe 'active job via configuration with queue_name_prefix option [unknown class]' do
609
- before do
610
- @args = {
611
- name: 'Test',
612
- cron: '* * * * *',
613
- klass: 'UnknownClass',
614
- queue: 'cron',
615
- active_job: true,
616
- queue_name_prefix: 'prefix'
617
- }
618
- @job = Sidekiq::Cron::Job.new(@args)
619
- end
620
-
621
- it 'pushes to queue active jobs message with queue_name_prefix' do
622
- @job.expects(:active_job_message)
623
- .returns('class' => 'UnknownClass', 'args' => [], 'queue' => 'prefix_cron')
624
- @job.enque!
625
- end
626
- end
627
-
628
- describe 'sidekiq worker' do
629
- before do
630
- @args = {
631
- name: 'Test',
632
- cron: '* * * * *',
633
- klass: 'CronTestClass'
634
- }
635
- @job = Sidekiq::Cron::Job.new(@args)
636
- end
637
-
638
- it 'pushes to queue active jobs message' do
639
- @job.expects(:enqueue_sidekiq_worker)
640
- .returns(true)
641
- @job.enque!
642
- end
643
- end
644
-
645
- describe 'sidekiq worker unknown class' do
646
- before do
647
- @args = {
648
- name: 'Test',
649
- cron: '* * * * *',
650
- klass: 'UnknownClass',
651
- queue: 'another'
652
- }
653
- @job = Sidekiq::Cron::Job.new(@args)
654
- end
655
-
656
- it 'pushes to queue sidekiq worker message' do
657
- @job.expects(:sidekiq_worker_message)
658
- .returns('class' => 'UnknownClass', 'args' => [], 'queue' => 'another')
659
- @job.enque!
660
- end
661
- end
662
- end
663
-
664
- describe "save" do
665
- before do
666
- @args = {
667
- name: "Test",
668
- cron: "* * * * *",
669
- klass: "CronTestClass"
670
- }
671
- @job = Sidekiq::Cron::Job.new(@args)
672
- end
673
-
674
- it "be saved" do
675
- assert @job.save
676
- end
677
-
678
- it "be saved and found by name" do
679
- assert @job.save, "not saved"
680
- assert Sidekiq::Cron::Job.find("Test").is_a?(Sidekiq::Cron::Job)
681
- end
682
- end
683
-
684
- describe "nonexisting job" do
685
- it "not be found" do
686
- assert Sidekiq::Cron::Job.find("nonexisting").nil?, "should return nil"
687
- end
688
- end
689
-
690
- describe "disabled/enabled" do
691
- before do
692
- @args = {
693
- name: "Test",
694
- cron: "* * * * *",
695
- klass: "CronTestClass"
696
- }
697
- end
698
-
699
- it "be created and enabled" do
700
- Sidekiq::Cron::Job.create(@args)
701
- job = Sidekiq::Cron::Job.find(@args)
702
- assert_equal job.status, "enabled"
703
- end
704
-
705
- it "be created and then enabled and disabled" do
706
- Sidekiq::Cron::Job.create(@args)
707
- job = Sidekiq::Cron::Job.find(@args)
708
- assert_equal job.status, "enabled"
709
-
710
- job.enable!
711
- assert_equal job.status, "enabled"
712
-
713
- job.disable!
714
- assert_equal job.status, "disabled"
715
- end
716
-
717
- it "be created with status disabled" do
718
- Sidekiq::Cron::Job.create(@args.merge(status: "disabled"))
719
- job = Sidekiq::Cron::Job.find(@args)
720
- assert_equal job.status, "disabled"
721
- assert_equal job.disabled?, true
722
- assert_equal job.enabled?, false
723
- end
724
-
725
- it "be created with status enabled and disable it afterwards" do
726
- Sidekiq::Cron::Job.create(@args)
727
- job = Sidekiq::Cron::Job.find(@args)
728
- assert_equal job.status, "enabled"
729
- assert_equal job.enabled?, true
730
- job.disable!
731
- assert_equal job.status, "disabled", "directly after call"
732
- assert_equal job.disabled?, true
733
- job = Sidekiq::Cron::Job.find(@args)
734
- assert_equal job.status, "disabled", "after find"
735
- end
736
-
737
- it "status shouldn't be rewritten after save without status" do
738
- Sidekiq::Cron::Job.create(@args)
739
- job = Sidekiq::Cron::Job.find(@args)
740
- assert_equal job.status, "enabled"
741
- job.disable!
742
- assert_equal job.status, "disabled", "directly after call"
743
- job = Sidekiq::Cron::Job.find(@args)
744
- assert_equal job.status, "disabled", "after find"
745
-
746
- Sidekiq::Cron::Job.create(@args)
747
- assert_equal job.status, "disabled", "after second create"
748
- job = Sidekiq::Cron::Job.find(@args)
749
- assert_equal job.status, "disabled", "after second find"
750
- end
751
-
752
- it "last_enqueue_time shouldn't be rewritten after save" do
753
- #adding last_enqueue_time to initialize is only for test purpose
754
- last_enqueue_time = '2013-01-01 23:59:59 +0000'
755
- expected_enqueue_time = DateTime.parse(last_enqueue_time).to_time.utc
756
- Sidekiq::Cron::Job.create(@args.merge('last_enqueue_time' => last_enqueue_time))
757
- job = Sidekiq::Cron::Job.find(@args)
758
- assert_equal job.last_enqueue_time, expected_enqueue_time
759
-
760
- Sidekiq::Cron::Job.create(@args)
761
- job = Sidekiq::Cron::Job.find(@args)
762
- assert_equal job.last_enqueue_time, expected_enqueue_time, "after second create should have same time"
763
- end
764
- end
765
-
766
- describe "initialize args" do
767
- it "from JSON" do
768
- args = {
769
- name: "Test",
770
- cron: "* * * * *",
771
- klass: "CronTestClass",
772
- args: JSON.dump(["123"])
773
- }
774
- Sidekiq::Cron::Job.new(args).tap do |job|
775
- assert_equal job.args, ["123"]
776
- assert_equal job.name, "Test"
777
- end
778
- end
779
- it "from String" do
780
- args = {
781
- name: "Test",
782
- cron: "* * * * *",
783
- klass: "CronTestClass",
784
- args: "(my funny string)"
785
- }
786
- Sidekiq::Cron::Job.new(args).tap do |job|
787
- assert_equal job.args, ["(my funny string)"]
788
- assert_equal job.name, "Test"
789
- end
790
- end
791
- it "from Array" do
792
- args = {
793
- name: "Test",
794
- cron: "* * * * *",
795
- klass: "CronTestClass",
796
- args: ["This is array"]
797
- }
798
- Sidekiq::Cron::Job.new(args).tap do |job|
799
- assert_equal job.args, ["This is array"]
800
- assert_equal job.name, "Test"
801
- end
802
- end
803
- end
804
-
805
- describe "create & find methods" do
806
- before do
807
- @args = {
808
- name: "Test",
809
- cron: "* * * * *",
810
- klass: "CronTestClass"
811
- }
812
- end
813
-
814
- it "create first three jobs" do
815
- assert_equal Sidekiq::Cron::Job.count, 0, "Should have 0 jobs"
816
- Sidekiq::Cron::Job.create(@args)
817
- Sidekiq::Cron::Job.create(@args.merge(name: "Test2"))
818
- Sidekiq::Cron::Job.create(@args.merge(name: "Test3"))
819
- assert_equal Sidekiq::Cron::Job.count, 3, "Should have 3 jobs"
820
- end
821
-
822
- it "create first three jobs - 1 has same name" do
823
- assert_equal Sidekiq::Cron::Job.count, 0, "Should have 0 jobs"
824
- Sidekiq::Cron::Job.create(@args)
825
- Sidekiq::Cron::Job.create(@args.merge(name: "Test2"))
826
- Sidekiq::Cron::Job.create(@args.merge(cron: "1 * * * *"))
827
- assert_equal Sidekiq::Cron::Job.count, 2, "Should have 2 jobs"
828
- end
829
-
830
- it "be found by method all" do
831
- Sidekiq::Cron::Job.create(@args)
832
- Sidekiq::Cron::Job.create(@args.merge(name: "Test2"))
833
- Sidekiq::Cron::Job.create(@args.merge(name: "Test3"))
834
- assert_equal Sidekiq::Cron::Job.all.size, 3, "Should have 3 jobs"
835
- assert Sidekiq::Cron::Job.all.all?{|j| j.is_a?(Sidekiq::Cron::Job)}, "All returned jobs should be Job class"
836
- end
837
-
838
- it "be found by method all - defect in set" do
839
- Sidekiq::Cron::Job.create(@args)
840
- Sidekiq::Cron::Job.create(@args.merge(name: "Test2"))
841
- Sidekiq::Cron::Job.create(@args.merge(name: "Test3"))
842
-
843
- Sidekiq.redis do |conn|
844
- conn.sadd Sidekiq::Cron::Job.jobs_key, "some_other_key"
845
- end
846
-
847
- assert_equal Sidekiq::Cron::Job.all.size, 3, "All have to return only valid 3 jobs"
848
- end
849
-
850
- it "be found by string name" do
851
- Sidekiq::Cron::Job.create(@args)
852
- assert Sidekiq::Cron::Job.find("Test")
853
- end
854
-
855
- it "be found by hash with key name" do
856
- Sidekiq::Cron::Job.create(@args)
857
- assert Sidekiq::Cron::Job.find(name: "Test"), "symbol keys keys"
858
-
859
- Sidekiq::Cron::Job.create(@args)
860
- assert Sidekiq::Cron::Job.find('name' => "Test"), "String keys"
861
- end
862
-
863
- end
864
-
865
- describe "destroy" do
866
- before do
867
- @args = {
868
- name: "Test",
869
- cron: "* * * * *",
870
- klass: "CronTestClass"
871
- }
872
- end
873
-
874
- it "create and then destroy by hash" do
875
- Sidekiq::Cron::Job.create(@args)
876
- assert_equal Sidekiq::Cron::Job.all.size, 1, "Should have 1 job"
877
-
878
- assert Sidekiq::Cron::Job.destroy(@args)
879
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 job after destroy"
880
- end
881
-
882
- it "return false on destroying nonexisting" do
883
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs"
884
- refute Sidekiq::Cron::Job.destroy("nonexisting")
885
- end
886
-
887
- it "return destroy by string name" do
888
- Sidekiq::Cron::Job.create(@args)
889
- assert Sidekiq::Cron::Job.destroy("Test")
890
- end
891
-
892
- it "return destroy by hash with key name" do
893
- Sidekiq::Cron::Job.create(@args)
894
- assert Sidekiq::Cron::Job.destroy(name: "Test"), "symbol keys keys"
895
-
896
- Sidekiq::Cron::Job.create(@args)
897
- assert Sidekiq::Cron::Job.destroy('name' => "Test"), "String keys"
898
- end
899
-
900
- end
901
-
902
- describe "destroy_removed_jobs" do
903
- before do
904
- args1 = {
905
- name: "WillBeErasedJob",
906
- cron: "* * * * *",
907
- klass: "CronTestClass"
908
- }
909
- Sidekiq::Cron::Job.create(args1)
910
-
911
- args2 = {
912
- name: "ContinueRemainingJob",
913
- cron: "* * * * *",
914
- klass: "CronTestClass"
915
- }
916
- Sidekiq::Cron::Job.create(args2)
917
- end
918
-
919
- it "be destroied removed job that not exists in args" do
920
- assert_equal Sidekiq::Cron::Job.destroy_removed_jobs(["ContinueRemainingJob"]), ["WillBeErasedJob"], "Should be destroyed WillBeErasedJob"
921
- end
922
- end
923
-
924
- describe "test of enque" do
925
- before do
926
- @args = {
927
- name: "Test",
928
- cron: "* * * * *",
929
- klass: "CronTestClass"
930
- }
931
- #first time is always
932
- #after next cron time!
933
- @time = Time.now.utc + 120
934
- end
935
- it "be always false when status is disabled" do
936
- refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time
937
- refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time - 60
938
- refute Sidekiq::Cron::Job.new(@args.merge(status: 'disabled')).should_enque? @time - 120
939
- assert_equal Sidekiq::Queue.all.size, 0, "Sidekiq 0 queues"
940
- end
941
-
942
- it "be false for same times" do
943
- assert Sidekiq::Cron::Job.new(@args).should_enque?(@time), "First time - true"
944
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time
945
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time
946
- end
947
-
948
- it "be false for same times but true for next time" do
949
- assert Sidekiq::Cron::Job.new(@args).should_enque?(@time), "First time - true"
950
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time
951
- assert Sidekiq::Cron::Job.new(@args).should_enque? @time + 135
952
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 135
953
- assert Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
954
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
955
-
956
- #just for check
957
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time
958
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 135
959
- refute Sidekiq::Cron::Job.new(@args).should_enque? @time + 235
960
- end
961
-
962
- it "should not enqueue jobs that are past" do
963
- assert Sidekiq::Cron::Job.new(@args.merge(cron: "*/1 * * * *")).should_enque? @time
964
- refute Sidekiq::Cron::Job.new(@args.merge(cron: "0 1,13 * * *")).should_enque? @time
965
- end
966
-
967
- it 'doesnt skip enqueuing if job is resaved near next enqueue time' do
968
- job = Sidekiq::Cron::Job.new(@args)
969
- assert job.test_and_enque_for_time!(@time), "should enqueue"
970
-
971
- future_now = @time + 1 * 60 * 60
972
- Time.stubs(:now).returns(future_now) # save uses Time.now.utc
973
- job.save
974
- assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time!(future_now + 30), "should enqueue"
975
- end
976
-
977
- it "remove old enque times + should be enqeued" do
978
- job = Sidekiq::Cron::Job.new(@args)
979
- assert_nil job.last_enqueue_time
980
- assert job.test_and_enque_for_time!(@time), "should enqueue"
981
- assert job.last_enqueue_time
982
-
983
- refute Sidekiq::Cron::Job.new(@args).test_and_enque_for_time!(@time), "should not enqueue"
984
- Sidekiq.redis do |conn|
985
- assert_equal conn.zcard(Sidekiq::Cron::Job.new(@args).send(:job_enqueued_key)), 1, "Should have one enqueued job"
986
- end
987
- assert_equal Sidekiq::Queue.all.first.size, 1, "Sidekiq queue 1 job in queue"
988
-
989
- # 20 hours after
990
- assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 1 * 60 * 60
991
- refute Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 1 * 60 * 60
992
-
993
- Sidekiq.redis do |conn|
994
- assert_equal conn.zcard(Sidekiq::Cron::Job.new(@args).send(:job_enqueued_key)), 2, "Should have two enqueued job"
995
- end
996
- assert_equal Sidekiq::Queue.all.first.size, 2, "Sidekiq queue 2 jobs in queue"
997
-
998
- # 26 hour after
999
- assert Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 26 * 60 * 60
1000
- refute Sidekiq::Cron::Job.new(@args).test_and_enque_for_time! @time + 26 * 60 * 60
1001
-
1002
- Sidekiq.redis do |conn|
1003
- assert_equal conn.zcard(Sidekiq::Cron::Job.new(@args).send(:job_enqueued_key)), 1, "Should have one enqueued job - old jobs should be deleted"
1004
- end
1005
- assert_equal Sidekiq::Queue.all.first.size, 3, "Sidekiq queue 3 jobs in queue"
1006
- end
1007
- end
1008
-
1009
- describe "load" do
1010
-
1011
- describe "from hash" do
1012
- before do
1013
- @jobs_hash = {
1014
- 'name_of_job' => {
1015
- 'class' => 'MyClass',
1016
- 'cron' => '1 * * * *',
1017
- 'args' => '(OPTIONAL) [Array or Hash]'
1018
- },
1019
- 'My super iber cool job' => {
1020
- 'class' => 'SecondClass',
1021
- 'cron' => '*/5 * * * *'
1022
- }
1023
- }
1024
- end
1025
-
1026
- it "create new jobs and update old one with same settings" do
1027
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1028
- out = Sidekiq::Cron::Job.load_from_hash @jobs_hash
1029
- assert_equal out.size, 0, "should have no errors"
1030
- assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
1031
- end
1032
-
1033
- it "return errors on loaded jobs" do
1034
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1035
- #set something bag to hash
1036
- @jobs_hash['name_of_job']['cron'] = "bad cron"
1037
- out = Sidekiq::Cron::Job.load_from_hash @jobs_hash
1038
- assert_equal 1, out.size, "should have 1 error"
1039
- assert_includes out['name_of_job'].first, "bad cron"
1040
- assert_includes out['name_of_job'].first, "ArgumentError:"
1041
- assert_equal 1, Sidekiq::Cron::Job.all.size, "Should have only 1 job after load"
1042
- end
1043
-
1044
- it "create new jobs and then destroy them all" do
1045
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1046
- out = Sidekiq::Cron::Job.load_from_hash @jobs_hash
1047
- assert_equal out.size, 0, "should have no errors"
1048
- assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
1049
- Sidekiq::Cron::Job.destroy_all!
1050
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs after destroy all"
1051
- end
1052
-
1053
- it "create new jobs and update old one with same settings with load_from_hash!" do
1054
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1055
- out = Sidekiq::Cron::Job.load_from_hash! @jobs_hash
1056
- assert_equal out.size, 0, "should have no errors"
1057
- assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
1058
- end
1059
- end
1060
-
1061
- describe "from array" do
1062
- before do
1063
- @jobs_array = [
1064
- {
1065
- 'name' => 'name_of_job',
1066
- 'class' => 'MyClass',
1067
- 'cron' => '1 * * * *',
1068
- 'args' => '(OPTIONAL) [Array or Hash]'
1069
- },
1070
- {
1071
- 'name' => 'Cool Job for Second Class',
1072
- 'class' => 'SecondClass',
1073
- 'cron' => '*/5 * * * *'
1074
- }
1075
- ]
1076
- end
1077
-
1078
- it "create new jobs and update old one with same settings" do
1079
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1080
- out = Sidekiq::Cron::Job.load_from_array @jobs_array
1081
- assert_equal out.size, 0, "should have 0 error"
1082
- assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
1083
- end
1084
-
1085
- it "create new jobs and update old one with same settings with load_from_array" do
1086
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1087
- out = Sidekiq::Cron::Job.load_from_array! @jobs_array
1088
- assert_equal out.size, 0, "should have 0 error"
1089
- assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
1090
- end
1091
- end
1092
-
1093
- describe "from array with queue_name" do
1094
- before do
1095
- @jobs_array = [
1096
- {
1097
- 'name' => 'name_of_job',
1098
- 'class' => 'CronTestClassWithQueue',
1099
- 'cron' => '1 * * * *',
1100
- 'args' => '(OPTIONAL) [Array or Hash]',
1101
- 'queue' => 'from_array'
1102
- }
1103
- ]
1104
- end
1105
-
1106
- it "create new jobs and update old one with same settings" do
1107
- assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have 0 jobs before load"
1108
- out = Sidekiq::Cron::Job.load_from_array @jobs_array
1109
- assert_equal out.size, 0, "should have 0 error"
1110
- assert_equal Sidekiq::Cron::Job.all.size, 1, "Should have 2 jobs after load"
1111
-
1112
- payload = {
1113
- "retry" => false,
1114
- "backtrace"=>true,
1115
- "queue" => "from_array",
1116
- "class" => "CronTestClassWithQueue",
1117
- "args" => ['(OPTIONAL) [Array or Hash]']
1118
- }
1119
-
1120
- assert_equal Sidekiq::Cron::Job.all.first.sidekiq_worker_message, payload
1121
- end
1122
- end
1123
- end
1124
- end