From fa97f573e01ef0038f92016db31bc6ce724229a0 Mon Sep 17 00:00:00 2001 From: Dzmitry Plashchynski Date: Wed, 18 Mar 2015 20:54:16 +0200 Subject: [PATCH] Add rake task to check cronotab.rb syntax --- lib/tasks/crono_tasks.rake | 13 ++++++++++++- spec/assets/bad_cronotab.rb | 12 ++++++++++++ spec/assets/good_cronotab.rb | 9 +++++++++ spec/tasks/crono_tasks_spec.rb | 21 +++++++++++++++------ spec/web_spec.rb | 1 + 5 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 spec/assets/bad_cronotab.rb create mode 100644 spec/assets/good_cronotab.rb diff --git a/lib/tasks/crono_tasks.rake b/lib/tasks/crono_tasks.rake index 7cbfff6..5424b2f 100644 --- a/lib/tasks/crono_tasks.rake +++ b/lib/tasks/crono_tasks.rake @@ -1,6 +1,10 @@ module Crono def self.load_cronotab - require File.join(Rails.root, Config::CRONOTAB) + cronotab_path = ENV['CRONOTAB'] || (defined?(Rails) && + File.join(Rails.root, cronotab_path)) + fail 'No cronotab defined' unless cronotab_path + puts "Load cronotab #{cronotab_path}" + require cronotab_path end end @@ -12,4 +16,11 @@ namespace :crono do current_job_ids = Crono.scheduler.jobs.map(&:job_id) Crono::CronoJob.where.not(job_id: current_job_ids).destroy_all end + + desc 'Check cronotab.rb syntax' + task check: :environment do + Crono.scheduler = Crono::Scheduler.new + Crono.load_cronotab + puts 'Syntax ok' + end end diff --git a/spec/assets/bad_cronotab.rb b/spec/assets/bad_cronotab.rb new file mode 100644 index 0000000..cf5bf9e --- /dev/null +++ b/spec/assets/bad_cronotab.rb @@ -0,0 +1,12 @@ +# This is an example of a bad cronotab for tests + +class TestJob + def perform + puts 'Test!' + end +end + +# This is an error, because you can use `on` options with +# a period less than 7 days. + +Crono.perform(TestJob).every 5.days, on: :sunday diff --git a/spec/assets/good_cronotab.rb b/spec/assets/good_cronotab.rb new file mode 100644 index 0000000..d58d43b --- /dev/null +++ b/spec/assets/good_cronotab.rb @@ -0,0 +1,9 @@ +# This is an example of a good cronotab for tests + +class TestJob + def perform + puts 'Test!' + end +end + +Crono.perform(TestJob).every 5.seconds diff --git a/spec/tasks/crono_tasks_spec.rb b/spec/tasks/crono_tasks_spec.rb index da5ec78..395510c 100644 --- a/spec/tasks/crono_tasks_spec.rb +++ b/spec/tasks/crono_tasks_spec.rb @@ -4,11 +4,20 @@ require 'rake' load 'tasks/crono_tasks.rake' Rake::Task.define_task(:environment) -describe 'crono:clean' do - it 'should clean unused tasks from DB' do - Crono::CronoJob.create!(job_id: 'used_job') - expect(Crono).to receive(:load_cronotab) - Rake::Task['crono:clean'].invoke - expect(Crono::CronoJob.where(job_id: 'used_job')).not_to exist +describe 'rake' do + describe 'crono:clean' do + it 'should clean unused tasks from DB' do + Crono::CronoJob.create!(job_id: 'used_job') + ENV['CRONOTAB'] = File.expand_path('../../assets/good_cronotab.rb', __FILE__) + Rake::Task['crono:clean'].invoke + expect(Crono::CronoJob.where(job_id: 'used_job')).not_to exist + end + end + + describe 'crono:check' do + it 'should check cronotab syntax' do + ENV['CRONOTAB'] = File.expand_path('../../assets/bad_cronotab.rb', __FILE__) + expect { Rake::Task['crono:check'].invoke }.to raise_error + end end end diff --git a/spec/web_spec.rb b/spec/web_spec.rb index 7a5faec..5e2590e 100644 --- a/spec/web_spec.rb +++ b/spec/web_spec.rb @@ -6,6 +6,7 @@ describe Crono::Web do let(:app) { Crono::Web } before do + Crono::CronoJob.destroy_all @test_job_id = 'Perform TestJob every 5 seconds' @test_job_log = 'All runs ok' @test_job = Crono::CronoJob.create!(