diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 6ce77ed5..27389425 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -39,7 +39,7 @@ Metrics/MethodLength: # Offense count: 2 # Configuration parameters: CountComments. Metrics/ModuleLength: - Max: 368 + Max: 373 # Offense count: 1 Style/CaseEquality: diff --git a/lib/resque/scheduler.rb b/lib/resque/scheduler.rb index 34b89300..0cd47e3a 100644 --- a/lib/resque/scheduler.rb +++ b/lib/resque/scheduler.rb @@ -155,8 +155,13 @@ def load_schedule_job(name, config) args = optionizate_interval_value(config[interval_type]) args = [args, nil, job: true] if args.is_a?(::String) - job = rufus_scheduler.send(interval_type, *args) do - enqueue_recurring(name, config) + begin + job = rufus_scheduler.send(interval_type, *args) do + enqueue_recurring(name, config) + end + rescue ArgumentError => e + log_error "Invalid #{interval_type} schedule for #{name}: #{e.message} - skipping" + return end @scheduled_jobs[name] = job interval_defined = true diff --git a/test/scheduler_test.rb b/test/scheduler_test.rb index 472a411b..a583cce3 100644 --- a/test/scheduler_test.rb +++ b/test/scheduler_test.rb @@ -120,6 +120,36 @@ assert Resque::Scheduler.scheduled_jobs.keys.include?('some_ivar_job') end + test 'load_schedule_job skips an invalid cron with options' do + Resque::Scheduler.expects(:log_error).with( + regexp_matches(/Invalid cron schedule for bad_job:/) + ) + + Resque::Scheduler.load_schedule_job( + 'bad_job', + 'cron' => ['not a cron', { 'allow_overlapping' => 'true' }], + 'class' => 'SomeIvarJob' + ) + + assert_empty Resque::Scheduler.rufus_scheduler.jobs + assert_empty Resque::Scheduler.scheduled_jobs + end + + test 'load_schedule continues after an invalid cron' do + Resque.schedule = { + 'bad_job' => { 'cron' => 'not a cron', 'class' => 'SomeIvarJob' }, + 'good_job' => { 'cron' => '* * * * *', 'class' => 'SomeIvarJob' } + } + Resque::Scheduler.expects(:log_error).with( + regexp_matches(/Invalid cron schedule for bad_job:/) + ) + + Resque::Scheduler.load_schedule! + + assert_equal ['good_job'], Resque::Scheduler.scheduled_jobs.keys + assert_equal 1, Resque::Scheduler.rufus_scheduler.jobs.size + end + test 'load_schedule_job with every with options' do Resque::Scheduler.load_schedule_job( 'some_ivar_job',