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