resque-scheduler 2.2.0 → 4.10.2

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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/funding.yml +4 -0
  4. data/.github/workflows/codeql-analysis.yml +59 -0
  5. data/.github/workflows/rubocop.yml +27 -0
  6. data/.github/workflows/ruby.yml +81 -0
  7. data/AUTHORS.md +31 -0
  8. data/CHANGELOG.md +539 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Gemfile +26 -2
  11. data/LICENSE +1 -1
  12. data/README.md +423 -91
  13. data/Rakefile +12 -35
  14. data/exe/resque-scheduler +5 -0
  15. data/lib/resque/scheduler/cli.rb +147 -0
  16. data/lib/resque/scheduler/configuration.rb +102 -0
  17. data/lib/resque/scheduler/delaying_extensions.rb +371 -0
  18. data/lib/resque/scheduler/env.rb +85 -0
  19. data/lib/resque/scheduler/extension.rb +13 -0
  20. data/lib/resque/scheduler/failure_handler.rb +11 -0
  21. data/lib/resque/scheduler/lock/base.rb +12 -3
  22. data/lib/resque/scheduler/lock/basic.rb +4 -5
  23. data/lib/resque/scheduler/lock/resilient.rb +52 -43
  24. data/lib/resque/scheduler/lock.rb +2 -1
  25. data/lib/resque/scheduler/locking.rb +104 -0
  26. data/lib/resque/scheduler/logger_builder.rb +83 -0
  27. data/lib/resque/scheduler/plugin.rb +31 -0
  28. data/lib/resque/scheduler/scheduling_extensions.rb +142 -0
  29. data/lib/{resque_scheduler → resque/scheduler}/server/views/delayed.erb +23 -8
  30. data/lib/resque/scheduler/server/views/delayed_schedules.erb +20 -0
  31. data/lib/{resque_scheduler → resque/scheduler}/server/views/delayed_timestamp.erb +1 -1
  32. data/lib/resque/scheduler/server/views/scheduler.erb +58 -0
  33. data/lib/resque/scheduler/server/views/search.erb +69 -0
  34. data/lib/resque/scheduler/server/views/search_form.erb +4 -0
  35. data/lib/resque/scheduler/server.rb +268 -0
  36. data/lib/resque/scheduler/signal_handling.rb +40 -0
  37. data/lib/resque/scheduler/tasks.rb +25 -0
  38. data/lib/resque/scheduler/util.rb +39 -0
  39. data/lib/resque/scheduler/version.rb +7 -0
  40. data/lib/resque/scheduler.rb +333 -149
  41. data/lib/resque-scheduler.rb +4 -0
  42. data/resque-scheduler.gemspec +56 -20
  43. metadata +205 -104
  44. data/.gitignore +0 -8
  45. data/.rubocop.yml +0 -120
  46. data/.travis.yml +0 -10
  47. data/HISTORY.md +0 -180
  48. data/lib/resque/scheduler_locking.rb +0 -90
  49. data/lib/resque_scheduler/logger_builder.rb +0 -51
  50. data/lib/resque_scheduler/plugin.rb +0 -25
  51. data/lib/resque_scheduler/server/views/scheduler.erb +0 -44
  52. data/lib/resque_scheduler/server.rb +0 -92
  53. data/lib/resque_scheduler/tasks.rb +0 -40
  54. data/lib/resque_scheduler/version.rb +0 -3
  55. data/lib/resque_scheduler.rb +0 -355
  56. data/script/migrate_to_timestamps_set.rb +0 -14
  57. data/tasks/resque_scheduler.rake +0 -2
  58. data/test/delayed_queue_test.rb +0 -383
  59. data/test/redis-test.conf +0 -108
  60. data/test/resque-web_test.rb +0 -116
  61. data/test/scheduler_args_test.rb +0 -156
  62. data/test/scheduler_hooks_test.rb +0 -23
  63. data/test/scheduler_locking_test.rb +0 -180
  64. data/test/scheduler_setup_test.rb +0 -59
  65. data/test/scheduler_test.rb +0 -256
  66. data/test/support/redis_instance.rb +0 -129
  67. data/test/test_helper.rb +0 -92
  68. /data/lib/{resque_scheduler → resque/scheduler}/server/views/requeue-params.erb +0 -0
@@ -1,156 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "scheduling jobs with arguments" do
4
-
5
- setup do
6
- Resque::Scheduler.clear_schedule!
7
- Resque::Scheduler.dynamic = false
8
- Resque::Scheduler.mute = true
9
- end
10
-
11
- test "enqueue_from_config puts stuff in resque without class loaded" do
12
- Resque::Job.stubs(:create).once.returns(true).with('joes_queue', 'UndefinedJob', '/tmp')
13
- Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'UndefinedJob', 'args' => "/tmp", 'queue' => 'joes_queue')
14
- end
15
-
16
- test "enqueue_from_config with_every_syntax" do
17
- Resque::Job.stubs(:create).once.returns(true).with('james_queue', 'JamesJob', '/tmp')
18
- Resque::Scheduler.enqueue_from_config('every' => '1m', 'class' => 'JamesJob', 'args' => '/tmp', 'queue' => 'james_queue')
19
- end
20
-
21
- test "enqueue_from_config puts jobs in the resque queue" do
22
- Resque::Job.stubs(:create).once.returns(true).with(:ivar, SomeIvarJob, '/tmp')
23
- Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp")
24
- end
25
-
26
- test "enqueue_from_config with custom_class_job in resque" do
27
- FakeCustomJobClass.stubs(:scheduled).once.returns(true).with(:ivar, 'SomeIvarJob', '/tmp')
28
- Resque::Scheduler.enqueue_from_config('cron' => "* * * * *", 'class' => 'SomeIvarJob', 'custom_job_class' => 'FakeCustomJobClass', 'args' => "/tmp")
29
- end
30
-
31
- test "enqueue_from_config puts stuff in resquewhen rails_env matches" do
32
- # The job should be loaded : its rails_env config matches the RAILS_ENV variable:
33
- ENV['RAILS_ENV'] = 'production'
34
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
35
-
36
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'production'}}
37
- Resque::Scheduler.load_schedule!
38
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
39
-
40
- # we allow multiple rails_env definition, it should work also:
41
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging, production'}}
42
- Resque::Scheduler.load_schedule!
43
- assert_equal(2, Resque::Scheduler.rufus_scheduler.all_jobs.size)
44
- end
45
-
46
- test "enqueue_from_config doesnt put stuff in resque when rails_env doesnt match" do
47
- # RAILS_ENV is not set:
48
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
49
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging'}}
50
- Resque::Scheduler.load_schedule!
51
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
52
-
53
- # SET RAILS_ENV to a common value:
54
- ENV['RAILS_ENV'] = 'production'
55
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp", 'rails_env' => 'staging'}}
56
- Resque::Scheduler.load_schedule!
57
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
58
- end
59
-
60
- test "enqueue_from_config when rails env arg is not set" do
61
- # The job should be loaded, since a missing rails_env means ALL envs.
62
- ENV['RAILS_ENV'] = 'production'
63
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
64
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"}}
65
- Resque::Scheduler.load_schedule!
66
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
67
- end
68
-
69
- test "calls the worker without arguments when 'args' is missing from the config" do
70
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
71
- class: SomeIvarJob
72
- YAML
73
- SomeIvarJob.expects(:perform).once.with()
74
- Resque.reserve('ivar').perform
75
- end
76
-
77
- test "calls the worker without arguments when 'args' is blank in the config" do
78
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
79
- class: SomeIvarJob
80
- args:
81
- YAML
82
- SomeIvarJob.expects(:perform).once.with()
83
- Resque.reserve('ivar').perform
84
- end
85
-
86
- test "calls the worker with a string when the config lists a string" do
87
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
88
- class: SomeIvarJob
89
- args: string
90
- YAML
91
- SomeIvarJob.expects(:perform).once.with('string')
92
- Resque.reserve('ivar').perform
93
- end
94
-
95
- test "calls the worker with a Fixnum when the config lists an integer" do
96
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
97
- class: SomeIvarJob
98
- args: 1
99
- YAML
100
- SomeIvarJob.expects(:perform).once.with(1)
101
- Resque.reserve('ivar').perform
102
- end
103
-
104
- test "calls the worker with multiple arguments when the config lists an array" do
105
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
106
- class: SomeIvarJob
107
- args:
108
- - 1
109
- - 2
110
- YAML
111
- SomeIvarJob.expects(:perform).once.with(1, 2)
112
- Resque.reserve('ivar').perform
113
- end
114
-
115
- test "calls the worker with an array when the config lists a nested array" do
116
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
117
- class: SomeIvarJob
118
- args:
119
- - - 1
120
- - 2
121
- YAML
122
- SomeIvarJob.expects(:perform).once.with([1, 2])
123
- Resque.reserve('ivar').perform
124
- end
125
-
126
- test "calls the worker with a hash when the config lists a hash" do
127
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
128
- class: SomeIvarJob
129
- args:
130
- key: value
131
- YAML
132
- SomeIvarJob.expects(:perform).once.with('key' => 'value')
133
- Resque.reserve('ivar').perform
134
- end
135
-
136
- test "calls the worker with a nested hash when the config lists a nested hash" do
137
- Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML))
138
- class: SomeIvarJob
139
- args:
140
- first_key:
141
- second_key: value
142
- YAML
143
- SomeIvarJob.expects(:perform).once.with('first_key' => {'second_key' => 'value'})
144
- Resque.reserve('ivar').perform
145
- end
146
-
147
- test "poll_sleep_amount defaults to 5" do
148
- assert_equal 5, Resque::Scheduler.poll_sleep_amount
149
- end
150
-
151
- test "poll_sleep_amount is settable" do
152
- Resque::Scheduler.poll_sleep_amount = 1
153
- assert_equal 1, Resque::Scheduler.poll_sleep_amount
154
- end
155
-
156
- end
@@ -1,23 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "scheduling jobs with hooks" do
4
- setup do
5
- Resque.redis.flushall
6
- end
7
-
8
- test "before_schedule hook that does not return false should be enqueued" do
9
- enqueue_time = Time.now
10
- SomeRealClass.expects(:before_schedule_example).with(:foo)
11
- SomeRealClass.expects(:after_schedule_example).with(:foo)
12
- Resque.enqueue_at(enqueue_time.to_i, SomeRealClass, :foo)
13
- assert_equal(1, Resque.delayed_timestamp_size(enqueue_time.to_i), "job should be enqueued")
14
- end
15
-
16
- test "before_schedule hook that returns false should not be enqueued" do
17
- enqueue_time = Time.now
18
- SomeRealClass.expects(:before_schedule_example).with(:foo).returns(false)
19
- SomeRealClass.expects(:after_schedule_example).never
20
- Resque.enqueue_at(enqueue_time.to_i, SomeRealClass, :foo)
21
- assert_equal(0, Resque.delayed_timestamp_size(enqueue_time.to_i), "job should not be enqueued")
22
- end
23
- end
@@ -1,180 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- module LockTestHelper
4
- def lock_is_not_held(lock)
5
- Resque.redis.set(lock.key, 'anothermachine:1234')
6
- end
7
- end
8
-
9
- context 'Resque::SchedulerLocking' do
10
- setup do
11
- @subject = Class.new { extend Resque::SchedulerLocking }
12
- end
13
-
14
- teardown do
15
- Resque.redis.del(@subject.master_lock.key)
16
- end
17
-
18
- test 'it should use the basic lock mechanism for <= Redis 2.4' do
19
- Resque.redis.stubs(:info).returns('redis_version' => '2.4.16')
20
-
21
- assert_equal @subject.master_lock.class, Resque::Scheduler::Lock::Basic
22
- end
23
-
24
- test 'it should use the resilient lock mechanism for > Redis 2.4' do
25
- Resque.redis.stubs(:info).returns('redis_version' => '2.5.12')
26
-
27
- assert_equal @subject.master_lock.class, Resque::Scheduler::Lock::Resilient
28
- end
29
-
30
- test 'it should be the master if the lock is held' do
31
- @subject.master_lock.acquire!
32
- assert @subject.is_master?, 'should be master'
33
- end
34
-
35
- test 'it should not be the master if the lock is held by someone else' do
36
- Resque.redis.set(@subject.master_lock.key, 'somethingelse:1234')
37
- assert !@subject.is_master?, 'should not be master'
38
- end
39
-
40
- test "release_master_lock should delegate to master_lock" do
41
- @subject.master_lock.expects(:release!)
42
- @subject.release_master_lock!
43
- end
44
- end
45
-
46
- context 'Resque::Scheduler::Lock::Base' do
47
- setup do
48
- @lock = Resque::Scheduler::Lock::Base.new('test_lock_key')
49
- end
50
-
51
- test '#acquire! should be not implemented' do
52
- assert_raise(NotImplementedError) do
53
- @lock.acquire!
54
- end
55
- end
56
-
57
- test '#locked? should be not implemented' do
58
- assert_raise(NotImplementedError) do
59
- @lock.locked?
60
- end
61
- end
62
- end
63
-
64
- context 'Resque::Scheduler::Lock::Basic' do
65
- include LockTestHelper
66
-
67
- setup do
68
- @lock = Resque::Scheduler::Lock::Basic.new('test_lock_key')
69
- end
70
-
71
- teardown do
72
- @lock.release!
73
- end
74
-
75
- test 'you should not have the lock if someone else holds it' do
76
- lock_is_not_held(@lock)
77
-
78
- assert !@lock.locked?
79
- end
80
-
81
- test 'you should not be able to acquire the lock if someone else holds it' do
82
- lock_is_not_held(@lock)
83
-
84
- assert !@lock.acquire!
85
- end
86
-
87
- test "the lock should receive a TTL on acquiring" do
88
- @lock.acquire!
89
-
90
- assert Resque.redis.ttl(@lock.key) > 0, "lock should expire"
91
- end
92
-
93
- test 'releasing should release the master lock' do
94
- assert @lock.acquire!, 'should have acquired the master lock'
95
- assert @lock.locked?, 'should be locked'
96
-
97
- @lock.release!
98
-
99
- assert !@lock.locked?, 'should not be locked'
100
- end
101
-
102
- test 'checking the lock should increase the TTL if we hold it' do
103
- @lock.acquire!
104
- Resque.redis.setex(@lock.key, 10, @lock.value)
105
-
106
- @lock.locked?
107
-
108
- assert Resque.redis.ttl(@lock.key) > 10, "TTL should have been updated"
109
- end
110
-
111
- test 'checking the lock should not increase the TTL if we do not hold it' do
112
- Resque.redis.setex(@lock.key, 10, @lock.value)
113
- lock_is_not_held(@lock)
114
-
115
- @lock.locked?
116
-
117
- assert Resque.redis.ttl(@lock.key) <= 10, "TTL should not have been updated"
118
- end
119
- end
120
-
121
- context 'Resque::Scheduler::Lock::Resilient' do
122
- include LockTestHelper
123
-
124
- if !Resque::Scheduler.supports_lua?
125
- puts "*** Skipping Resque::Scheduler::Lock::Resilient tests, as they require Redis >= 2.5."
126
- else
127
- setup do
128
- @lock = Resque::Scheduler::Lock::Resilient.new('test_resilient_lock')
129
- end
130
-
131
- teardown do
132
- @lock.release!
133
- end
134
-
135
- test 'you should not have the lock if someone else holds it' do
136
- lock_is_not_held(@lock)
137
-
138
- assert !@lock.locked?, 'you should not have the lock'
139
- end
140
-
141
- test 'you should not be able to acquire the lock if someone else holds it' do
142
- lock_is_not_held(@lock)
143
-
144
- assert !@lock.acquire!
145
- end
146
-
147
- test "the lock should receive a TTL on acquiring" do
148
- @lock.acquire!
149
-
150
- assert Resque.redis.ttl(@lock.key) > 0, "lock should expire"
151
- end
152
-
153
- test 'releasing should release the master lock' do
154
- assert @lock.acquire!, 'should have acquired the master lock'
155
- assert @lock.locked?, 'should be locked'
156
-
157
- @lock.release!
158
-
159
- assert !@lock.locked?, 'should not be locked'
160
- end
161
-
162
- test 'checking the lock should increase the TTL if we hold it' do
163
- @lock.acquire!
164
- Resque.redis.setex(@lock.key, 10, @lock.value)
165
-
166
- @lock.locked?
167
-
168
- assert Resque.redis.ttl(@lock.key) > 10, "TTL should have been updated"
169
- end
170
-
171
- test 'checking the lock should not increase the TTL if we do not hold it' do
172
- Resque.redis.setex(@lock.key, 10, @lock.value)
173
- lock_is_not_held(@lock)
174
-
175
- @lock.locked?
176
-
177
- assert Resque.redis.ttl(@lock.key) <= 10, "TTL should not have been updated"
178
- end
179
- end
180
- end
@@ -1,59 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "Resque::Scheduler" do
4
-
5
- setup do
6
- Resque::Scheduler.dynamic = false
7
- Resque.redis.flushall
8
- Resque::Scheduler.clear_schedule!
9
- end
10
-
11
- test 'set custom logger' do
12
- custom_logger = Logger.new('/dev/null')
13
- Resque::Scheduler.logger = custom_logger
14
- assert_equal(custom_logger, Resque::Scheduler.logger)
15
- end
16
-
17
- context 'logger default settings' do
18
- setup do
19
- nullify_logger
20
- end
21
-
22
- test 'uses STDOUT' do
23
- assert_equal(Resque::Scheduler.logger.instance_variable_get(:@logdev).dev, STDOUT)
24
- end
25
- test 'not verbose' do
26
- assert Resque::Scheduler.logger.level > Logger::DEBUG
27
- end
28
- test 'not muted' do
29
- assert Resque::Scheduler.logger.level < Logger::FATAL
30
- end
31
-
32
- teardown do
33
- nullify_logger
34
- end
35
- end
36
-
37
- context 'logger custom settings' do
38
- setup do
39
- nullify_logger
40
- end
41
-
42
- test 'uses logfile' do
43
- Resque::Scheduler.logfile = '/dev/null'
44
- assert_equal(Resque::Scheduler.logger.instance_variable_get(:@logdev).filename, '/dev/null')
45
- end
46
- test 'set verbosity' do
47
- Resque::Scheduler.verbose = true
48
- assert Resque::Scheduler.logger.level == Logger::DEBUG
49
- end
50
- test 'mute logger' do
51
- Resque::Scheduler.mute = true
52
- assert Resque::Scheduler.logger.level == Logger::FATAL
53
- end
54
-
55
- teardown do
56
- nullify_logger
57
- end
58
- end
59
- end
@@ -1,256 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "Resque::Scheduler" do
4
-
5
- setup do
6
- Resque::Scheduler.dynamic = false
7
- Resque.redis.flushall
8
- Resque::Scheduler.mute = true
9
- Resque::Scheduler.clear_schedule!
10
- Resque::Scheduler.send(:class_variable_set, :@@scheduled_jobs, {})
11
- end
12
-
13
- test "enqueue constantizes" do
14
- # The job should be loaded, since a missing rails_env means ALL envs.
15
- ENV['RAILS_ENV'] = 'production'
16
- config = {'cron' => "* * * * *", 'class' => 'SomeRealClass', 'args' => "/tmp"}
17
- Resque::Job.expects(:create).with(SomeRealClass.queue, SomeRealClass, '/tmp')
18
- Resque::Scheduler.enqueue_from_config(config)
19
- end
20
-
21
- test "enqueue runs hooks" do
22
- # The job should be loaded, since a missing rails_env means ALL envs.
23
- ENV['RAILS_ENV'] = 'production'
24
- config = {'cron' => "* * * * *", 'class' => 'SomeRealClass', 'args' => "/tmp"}
25
-
26
- Resque::Job.expects(:create).with(SomeRealClass.queue, SomeRealClass, '/tmp')
27
- SomeRealClass.expects(:before_delayed_enqueue_example).with("/tmp")
28
- SomeRealClass.expects(:before_enqueue_example).with("/tmp")
29
- SomeRealClass.expects(:after_enqueue_example).with("/tmp")
30
-
31
- Resque::Scheduler.enqueue_from_config(config)
32
- end
33
-
34
- test "enqueue_from_config respects queue params" do
35
- config = {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'queue' => 'high'}
36
-
37
- Resque.expects(:enqueue_to).with('high', SomeIvarJob)
38
-
39
- Resque::Scheduler.enqueue_from_config(config)
40
- end
41
-
42
- test "config makes it into the rufus_scheduler" do
43
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
44
-
45
- Resque.schedule = {:some_ivar_job => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"}}
46
- Resque::Scheduler.load_schedule!
47
-
48
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
49
- assert Resque::Scheduler.scheduled_jobs.include?('some_ivar_job')
50
- end
51
-
52
- test "can reload schedule" do
53
- Resque::Scheduler.dynamic = true
54
- Resque.schedule = {"some_ivar_job" => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"}}
55
-
56
- Resque::Scheduler.load_schedule!
57
-
58
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
59
- assert Resque::Scheduler.scheduled_jobs.include?("some_ivar_job")
60
-
61
- Resque.redis.del(:schedules)
62
- Resque.redis.hset(:schedules, "some_ivar_job2", Resque.encode(
63
- {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/2"}
64
- ))
65
-
66
- Resque::Scheduler.reload_schedule!
67
-
68
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
69
-
70
- assert_equal '/tmp/2', Resque.schedule["some_ivar_job2"]["args"]
71
- assert Resque::Scheduler.scheduled_jobs.include?("some_ivar_job2")
72
- end
73
-
74
- test "load_schedule_job loads a schedule" do
75
- Resque::Scheduler.load_schedule_job("some_ivar_job", {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"})
76
-
77
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
78
- assert_equal(1, Resque::Scheduler.scheduled_jobs.size)
79
- assert Resque::Scheduler.scheduled_jobs.keys.include?("some_ivar_job")
80
- end
81
-
82
- test "load_schedule_job with every with options" do
83
- Resque::Scheduler.load_schedule_job("some_ivar_job", {'every' => ['30s', {'first_in' => '60s'}], 'class' => 'SomeIvarJob', 'args' => "/tmp"})
84
-
85
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
86
- assert_equal(1, Resque::Scheduler.scheduled_jobs.size)
87
- assert Resque::Scheduler.scheduled_jobs.keys.include?("some_ivar_job")
88
- assert Resque::Scheduler.scheduled_jobs["some_ivar_job"].params.keys.include?(:first_in)
89
- end
90
-
91
- test "load_schedule_job with cron with options" do
92
- Resque::Scheduler.load_schedule_job("some_ivar_job", {'cron' => ['* * * * *', {'allow_overlapping' => 'true'}], 'class' => 'SomeIvarJob', 'args' => "/tmp"})
93
-
94
- assert_equal(1, Resque::Scheduler.rufus_scheduler.all_jobs.size)
95
- assert_equal(1, Resque::Scheduler.scheduled_jobs.size)
96
- assert Resque::Scheduler.scheduled_jobs.keys.include?("some_ivar_job")
97
- assert Resque::Scheduler.scheduled_jobs["some_ivar_job"].params.keys.include?(:allow_overlapping)
98
- end
99
-
100
- test "load_schedule_job without cron" do
101
- Resque::Scheduler.load_schedule_job("some_ivar_job", {'class' => 'SomeIvarJob', 'args' => "/tmp"})
102
-
103
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
104
- assert_equal(0, Resque::Scheduler.scheduled_jobs.size)
105
- assert !Resque::Scheduler.scheduled_jobs.keys.include?("some_ivar_job")
106
- end
107
-
108
- test "load_schedule_job with an empty cron" do
109
- Resque::Scheduler.load_schedule_job("some_ivar_job", {'cron' => '', 'class' => 'SomeIvarJob', 'args' => "/tmp"})
110
-
111
- assert_equal(0, Resque::Scheduler.rufus_scheduler.all_jobs.size)
112
- assert_equal(0, Resque::Scheduler.scheduled_jobs.size)
113
- assert !Resque::Scheduler.scheduled_jobs.keys.include?("some_ivar_job")
114
- end
115
-
116
- test "update_schedule" do
117
- Resque::Scheduler.dynamic = true
118
- Resque.schedule = {
119
- "some_ivar_job" => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"},
120
- "another_ivar_job" => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/5"},
121
- "stay_put_job" => {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp"}
122
- }
123
-
124
- Resque::Scheduler.load_schedule!
125
-
126
- Resque.set_schedule("some_ivar_job",
127
- {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/2"}
128
- )
129
- Resque.set_schedule("new_ivar_job",
130
- {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp/3"}
131
- )
132
- Resque.set_schedule("stay_put_job",
133
- {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp"}
134
- )
135
- Resque.remove_schedule("another_ivar_job")
136
-
137
- Resque::Scheduler.update_schedule
138
-
139
- assert_equal(3, Resque::Scheduler.rufus_scheduler.all_jobs.size)
140
- assert_equal(3, Resque::Scheduler.scheduled_jobs.size)
141
- %w(some_ivar_job new_ivar_job stay_put_job).each do |job_name|
142
- assert Resque::Scheduler.scheduled_jobs.keys.include?(job_name)
143
- assert Resque.schedule.keys.include?(job_name)
144
- end
145
- assert !Resque::Scheduler.scheduled_jobs.keys.include?("another_ivar_job")
146
- assert !Resque.schedule.keys.include?("another_ivar_job")
147
- assert_equal 0, Resque.redis.scard(:schedules_changed)
148
- end
149
-
150
- test "update_schedule with mocks" do
151
- Resque::Scheduler.dynamic = true
152
- Resque.schedule = {
153
- "some_ivar_job" => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp"},
154
- "another_ivar_job" => {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/5"},
155
- "stay_put_job" => {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp"}
156
- }
157
-
158
- Resque::Scheduler.load_schedule!
159
-
160
- Resque::Scheduler.rufus_scheduler.expects(:unschedule).with(Resque::Scheduler.scheduled_jobs["some_ivar_job"].job_id)
161
- Resque::Scheduler.rufus_scheduler.expects(:unschedule).with(Resque::Scheduler.scheduled_jobs["another_ivar_job"].job_id)
162
-
163
- Resque.set_schedule("some_ivar_job",
164
- {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/2"}
165
- )
166
- Resque.set_schedule("new_ivar_job",
167
- {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp/3"}
168
- )
169
- Resque.set_schedule("stay_put_job",
170
- {'cron' => "* * * * *", 'class' => 'SomeJob', 'args' => "/tmp"}
171
- )
172
- Resque.remove_schedule("another_ivar_job")
173
-
174
- Resque::Scheduler.update_schedule
175
-
176
- assert_equal(3, Resque::Scheduler.scheduled_jobs.size)
177
- %w(some_ivar_job new_ivar_job stay_put_job).each do |job_name|
178
- assert Resque::Scheduler.scheduled_jobs.keys.include?(job_name)
179
- assert Resque.schedule.keys.include?(job_name)
180
- end
181
- assert !Resque::Scheduler.scheduled_jobs.keys.include?("another_ivar_job")
182
- assert !Resque.schedule.keys.include?("another_ivar_job")
183
- assert_equal 0, Resque.redis.scard(:schedules_changed)
184
- end
185
-
186
- test "schedule= sets the schedule" do
187
- Resque::Scheduler.dynamic = true
188
- Resque.schedule = {"my_ivar_job" => {
189
- 'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/75"
190
- }}
191
- assert_equal({'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/75"},
192
- Resque.decode(Resque.redis.hget(:schedules, "my_ivar_job")))
193
- end
194
-
195
- test "schedule= removes schedules not present in the given schedule argument" do
196
- Resque::Scheduler.dynamic = true
197
-
198
- Resque.schedule = {"old_job" => {'cron' => "* * * * *", 'class' => 'OldJob'}}
199
- assert_equal({"old_job" => {'cron' => "* * * * *", 'class' => 'OldJob'}}, Resque.schedule)
200
-
201
- Resque.schedule = {"new_job" => {'cron' => "* * * * *", 'class' => 'NewJob'}}
202
- Resque.reload_schedule!
203
- assert_equal({"new_job" => {'cron' => "* * * * *", 'class' => 'NewJob'}}, Resque.schedule)
204
- end
205
-
206
- test "schedule= uses job name as 'class' argument if it's missing" do
207
- Resque::Scheduler.dynamic = true
208
- Resque.schedule = {"SomeIvarJob" => {
209
- 'cron' => "* * * * *", 'args' => "/tmp/75"
210
- }}
211
- assert_equal({'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/75"},
212
- Resque.decode(Resque.redis.hget(:schedules, "SomeIvarJob")))
213
- assert_equal('SomeIvarJob', Resque.schedule['SomeIvarJob']['class'])
214
- end
215
-
216
- test "schedule= does not mutate argument" do
217
- schedule = {"SomeIvarJob" => {
218
- 'cron' => "* * * * *", 'args' => "/tmp/75"
219
- }}
220
- Resque.schedule = schedule
221
- assert !schedule['SomeIvarJob'].key?('class')
222
- end
223
-
224
- test "set_schedule can set an individual schedule" do
225
- Resque.set_schedule("some_ivar_job", {
226
- 'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/22"
227
- })
228
- assert_equal({'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/22"},
229
- Resque.decode(Resque.redis.hget(:schedules, "some_ivar_job")))
230
- assert Resque.redis.sismember(:schedules_changed, "some_ivar_job")
231
- end
232
-
233
- test "get_schedule returns a schedule" do
234
- Resque.redis.hset(:schedules, "some_ivar_job2", Resque.encode(
235
- {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/33"}
236
- ))
237
- assert_equal({'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/33"},
238
- Resque.get_schedule("some_ivar_job2"))
239
- end
240
-
241
- test "remove_schedule removes a schedule" do
242
- Resque.redis.hset(:schedules, "some_ivar_job3", Resque.encode(
243
- {'cron' => "* * * * *", 'class' => 'SomeIvarJob', 'args' => "/tmp/44"}
244
- ))
245
- Resque.remove_schedule("some_ivar_job3")
246
- assert_equal nil, Resque.redis.hget(:schedules, "some_ivar_job3")
247
- assert Resque.redis.sismember(:schedules_changed, "some_ivar_job3")
248
- end
249
-
250
- test "adheres to lint" do
251
- assert_nothing_raised do
252
- Resque::Plugin.lint(Resque::Scheduler)
253
- Resque::Plugin.lint(ResqueScheduler)
254
- end
255
- end
256
- end