From 5f715f1d32c6f5ce25b3721bde8f476173afadc8 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Thu, 23 Mar 2017 03:54:49 +0900 Subject: Add scheduled_trigger model. Add cron parser. Plus, specs. --- spec/models/ci/scheduled_trigger_spec.rb | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 spec/models/ci/scheduled_trigger_spec.rb (limited to 'spec/models/ci') diff --git a/spec/models/ci/scheduled_trigger_spec.rb b/spec/models/ci/scheduled_trigger_spec.rb new file mode 100644 index 00000000000..68ba9c379b8 --- /dev/null +++ b/spec/models/ci/scheduled_trigger_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' +require 'rufus-scheduler' # Included in sidekiq-cron + +describe Ci::ScheduledTrigger, models: true do + + describe 'associations' do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:owner) } + end + + describe '#schedule_next_run!' do + context 'when cron and cron_time_zone are vaild' do + context 'when nightly build' do + it 'schedules next run' do + scheduled_trigger = create(:ci_scheduled_trigger, :cron_nightly_build) + scheduled_trigger.schedule_next_run! + puts "scheduled_trigger: #{scheduled_trigger.inspect}" + + expect(scheduled_trigger.cron).to be_nil + end + end + + context 'when weekly build' do + + end + + context 'when monthly build' do + + end + end + + context 'when cron and cron_time_zone are invaild' do + it 'schedules nothing' do + + end + end + end +end -- cgit v1.2.1 From 37d6d1e46130f44f2fe05171b814b5682696839c Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Fri, 24 Mar 2017 00:18:13 +0900 Subject: basic components --- spec/models/ci/scheduled_trigger_spec.rb | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/scheduled_trigger_spec.rb b/spec/models/ci/scheduled_trigger_spec.rb index 68ba9c379b8..bb5e969fa44 100644 --- a/spec/models/ci/scheduled_trigger_spec.rb +++ b/spec/models/ci/scheduled_trigger_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' -require 'rufus-scheduler' # Included in sidekiq-cron describe Ci::ScheduledTrigger, models: true do @@ -9,30 +8,22 @@ describe Ci::ScheduledTrigger, models: true do end describe '#schedule_next_run!' do - context 'when cron and cron_time_zone are vaild' do - context 'when nightly build' do - it 'schedules next run' do - scheduled_trigger = create(:ci_scheduled_trigger, :cron_nightly_build) - scheduled_trigger.schedule_next_run! - puts "scheduled_trigger: #{scheduled_trigger.inspect}" + subject { scheduled_trigger.schedule_next_run! } - expect(scheduled_trigger.cron).to be_nil - end - end + let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, next_run_at: nil) } - context 'when weekly build' do - - end - - context 'when monthly build' do - - end + it 'updates next_run_at' do + is_expected.not_to be_nil end + end + + describe '#update_last_run!' do + subject { scheduled_trigger.update_last_run! } - context 'when cron and cron_time_zone are invaild' do - it 'schedules nothing' do + let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, last_run_at: nil) } - end + it 'updates last_run_at' do + is_expected.not_to be_nil end end end -- cgit v1.2.1 From c426763c42d41c9c0c9a9cfe544f3185eeaa984f Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 29 Mar 2017 20:49:47 +0900 Subject: Rename ScheduledTrigger to TriggerSchedule. Because table structure changed. --- spec/models/ci/scheduled_trigger_spec.rb | 29 ----------------------------- spec/models/ci/trigger_schedule_spec.rb | 29 +++++++++++++++++++++++++++++ spec/models/ci/trigger_spec.rb | 1 + 3 files changed, 30 insertions(+), 29 deletions(-) delete mode 100644 spec/models/ci/scheduled_trigger_spec.rb create mode 100644 spec/models/ci/trigger_schedule_spec.rb (limited to 'spec/models/ci') diff --git a/spec/models/ci/scheduled_trigger_spec.rb b/spec/models/ci/scheduled_trigger_spec.rb deleted file mode 100644 index bb5e969fa44..00000000000 --- a/spec/models/ci/scheduled_trigger_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'spec_helper' - -describe Ci::ScheduledTrigger, models: true do - - describe 'associations' do - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:owner) } - end - - describe '#schedule_next_run!' do - subject { scheduled_trigger.schedule_next_run! } - - let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, next_run_at: nil) } - - it 'updates next_run_at' do - is_expected.not_to be_nil - end - end - - describe '#update_last_run!' do - subject { scheduled_trigger.update_last_run! } - - let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, last_run_at: nil) } - - it 'updates last_run_at' do - is_expected.not_to be_nil - end - end -end diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb new file mode 100644 index 00000000000..14b8530a65b --- /dev/null +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +describe Ci::TriggerSchedule, models: true do + + describe 'associations' do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:trigger) } + end + + describe '#schedule_next_run!' do + subject { trigger_schedule.schedule_next_run! } + + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil) } + + it 'updates next_run_at' do + is_expected.not_to be_nil + end + end + + # describe '#update_last_run!' do + # subject { scheduled_trigger.update_last_run! } + + # let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, last_run_at: nil) } + + # it 'updates last_run_at' do + # is_expected.not_to be_nil + # end + # end +end diff --git a/spec/models/ci/trigger_spec.rb b/spec/models/ci/trigger_spec.rb index 1bcb673cb16..42170de0180 100644 --- a/spec/models/ci/trigger_spec.rb +++ b/spec/models/ci/trigger_spec.rb @@ -7,6 +7,7 @@ describe Ci::Trigger, models: true do it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:owner) } it { is_expected.to have_many(:trigger_requests) } + it { is_expected.to have_one(:trigger_schedule) } end describe 'before_validation' do -- cgit v1.2.1 From 2a1a7310d04f6d64a983d2438fdcc515e7118d91 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Thu, 30 Mar 2017 03:33:23 +0900 Subject: Add validation to Ci::TriggerSchedule (Halfway) --- spec/models/ci/trigger_schedule_spec.rb | 36 ++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 14b8530a65b..d8b6bd93954 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -1,29 +1,41 @@ require 'spec_helper' describe Ci::TriggerSchedule, models: true do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:trigger) { create(:ci_trigger, owner: user, project: project, ref: 'master') } describe 'associations' do it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:trigger) } end - describe '#schedule_next_run!' do - subject { trigger_schedule.schedule_next_run! } + describe 'validation' do + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, trigger: trigger) } - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil) } + it { expect(trigger_schedule).to validate_presence_of(:trigger) } + it { is_expected.to validate_presence_of(:cron) } + it { is_expected.to validate_presence_of(:cron_time_zone) } - it 'updates next_run_at' do - is_expected.not_to be_nil + it '#check_cron' do + subject.cron = 'Hack' + subject.valid? + subject.errors[:screen_name].to include(' is invalid syntax') + end + + it '#check_ref' do end end - # describe '#update_last_run!' do - # subject { scheduled_trigger.update_last_run! } + describe '#schedule_next_run!' do + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil, trigger: trigger) } - # let(:scheduled_trigger) { create(:ci_scheduled_trigger, :cron_nightly_build, last_run_at: nil) } + before do + trigger_schedule.schedule_next_run! + end - # it 'updates last_run_at' do - # is_expected.not_to be_nil - # end - # end + it 'updates next_run_at' do + expect(Ci::TriggerSchedule.last.next_run_at).not_to be_nil + end + end end -- cgit v1.2.1 From 9573bb44bc94261814dbdbb384b9ad7acf2907ff Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Fri, 31 Mar 2017 03:16:24 +0900 Subject: real_next_run (WIP) --- spec/models/ci/trigger_schedule_spec.rb | 94 +++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 23 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index d8b6bd93954..11e8083fc86 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -5,37 +5,85 @@ describe Ci::TriggerSchedule, models: true do let(:project) { create(:project) } let(:trigger) { create(:ci_trigger, owner: user, project: project, ref: 'master') } - describe 'associations' do - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:trigger) } - end + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:trigger) } + # it { is_expected.to validate_presence_of :cron } + # it { is_expected.to validate_presence_of :cron_time_zone } + it { is_expected.to respond_to :ref } - describe 'validation' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, trigger: trigger) } + # describe '#schedule_next_run!' do + # let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil, trigger: trigger) } - it { expect(trigger_schedule).to validate_presence_of(:trigger) } - it { is_expected.to validate_presence_of(:cron) } - it { is_expected.to validate_presence_of(:cron_time_zone) } + # before do + # trigger_schedule.schedule_next_run! + # end - it '#check_cron' do - subject.cron = 'Hack' - subject.valid? - subject.errors[:screen_name].to include(' is invalid syntax') - end + # it 'updates next_run_at' do + # expect(Ci::TriggerSchedule.last.next_run_at).not_to be_nil + # end + # end - it '#check_ref' do - end - end + describe '#real_next_run' do + subject { trigger_schedule.real_next_run(worker_cron: worker_cron, worker_time_zone: worker_time_zone) } + + context 'when next_run_at > worker_next_time' do + let(:worker_cron) { '0 */12 * * *' } # each 00:00, 12:00 + let(:worker_time_zone) { 'UTC' } + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_weekly_build, cron_time_zone: user_time_zone, trigger: trigger) } + + context 'when user is in Europe/London(+00:00)' do + let(:user_time_zone) { 'Europe/London' } + + it 'returns next_run_at' do + is_expected.to eq(trigger_schedule.next_run_at) + end + end + + context 'when user is in Asia/Hong_Kong(+08:00)' do + let(:user_time_zone) { 'Asia/Hong_Kong' } - describe '#schedule_next_run!' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil, trigger: trigger) } + it 'returns next_run_at' do + is_expected.to eq(trigger_schedule.next_run_at) + end + end - before do - trigger_schedule.schedule_next_run! + context 'when user is in Canada/Pacific(-08:00)' do + let(:user_time_zone) { 'Canada/Pacific' } + + it 'returns next_run_at' do + is_expected.to eq(trigger_schedule.next_run_at) + end + end end - it 'updates next_run_at' do - expect(Ci::TriggerSchedule.last.next_run_at).not_to be_nil + context 'when worker_next_time > next_run_at' do + let(:worker_cron) { '0 0 */2 * *' } # every 2 days + let(:worker_time_zone) { 'UTC' } + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, cron_time_zone: user_time_zone, trigger: trigger) } + + context 'when user is in Europe/London(+00:00)' do + let(:user_time_zone) { 'Europe/London' } + + it 'returns worker_next_time' do + is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) + end + end + + context 'when user is in Asia/Hong_Kong(+08:00)' do + let(:user_time_zone) { 'Asia/Hong_Kong' } + + it 'returns worker_next_time' do + is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) + end + end + + context 'when user is in Canada/Pacific(-08:00)' do + let(:user_time_zone) { 'Canada/Pacific' } + + it 'returns worker_next_time' do + is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) + end + end end end end -- cgit v1.2.1 From d65c816ed78910eabd7ecbc9282e85d6b6f21796 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Fri, 31 Mar 2017 19:08:39 +0900 Subject: Brush up --- spec/models/ci/trigger_schedule_spec.rb | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 11e8083fc86..d47ab529bc0 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe Ci::TriggerSchedule, models: true do - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:trigger) { create(:ci_trigger, owner: user, project: project, ref: 'master') } it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:trigger) } @@ -11,17 +8,27 @@ describe Ci::TriggerSchedule, models: true do # it { is_expected.to validate_presence_of :cron_time_zone } it { is_expected.to respond_to :ref } - # describe '#schedule_next_run!' do - # let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil, trigger: trigger) } + it 'should validate less_than_1_hour_from_now' do + trigger_schedule = create(:ci_trigger_schedule, :cron_nightly_build) + trigger_schedule.cron = '* * * * *' + trigger_schedule.valid? + expect(trigger_schedule.errors[:cron].first).to include('can not be less than 1 hour') + end + + describe '#schedule_next_run!' do + context 'when more_than_1_hour_from_now' do + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } - # before do - # trigger_schedule.schedule_next_run! - # end + before do + trigger_schedule.schedule_next_run! + end - # it 'updates next_run_at' do - # expect(Ci::TriggerSchedule.last.next_run_at).not_to be_nil - # end - # end + it 'updates next_run_at' do + next_time = Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) + expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) + end + end + end describe '#real_next_run' do subject { trigger_schedule.real_next_run(worker_cron: worker_cron, worker_time_zone: worker_time_zone) } -- cgit v1.2.1 From 5720919cd0cd457aa83fa3e3c36e34867b0eed60 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Fri, 31 Mar 2017 23:18:07 +0900 Subject: Brush up 2 --- spec/models/ci/trigger_schedule_spec.rb | 93 ++++++++++++++------------------- 1 file changed, 39 insertions(+), 54 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index d47ab529bc0..da23611f1a0 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -8,11 +8,36 @@ describe Ci::TriggerSchedule, models: true do # it { is_expected.to validate_presence_of :cron_time_zone } it { is_expected.to respond_to :ref } - it 'should validate less_than_1_hour_from_now' do + it 'should validate ref existence' do trigger_schedule = create(:ci_trigger_schedule, :cron_nightly_build) - trigger_schedule.cron = '* * * * *' + trigger_schedule.trigger.ref = 'invalid-ref' trigger_schedule.valid? - expect(trigger_schedule.errors[:cron].first).to include('can not be less than 1 hour') + expect(trigger_schedule.errors[:ref].first).to include('does not exist') + end + + describe 'cron limitation' do + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } + + before do + trigger_schedule.cron = cron + trigger_schedule.valid? + end + + context 'when every hour' do + let(:cron) { '0 * * * *' } # 00:00, 01:00, 02:00, ..., 23:00 + + it 'fails' do + expect(trigger_schedule.errors[:cron].first).to include('can not be less than 1 hour') + end + end + + context 'when each six hours' do + let(:cron) { '0 */6 * * *' } # 00:00, 06:00, 12:00, 18:00 + + it 'succeeds' do + expect(trigger_schedule.errors[:cron]).to be_empty + end + end end describe '#schedule_next_run!' do @@ -31,65 +56,25 @@ describe Ci::TriggerSchedule, models: true do end describe '#real_next_run' do - subject { trigger_schedule.real_next_run(worker_cron: worker_cron, worker_time_zone: worker_time_zone) } - - context 'when next_run_at > worker_next_time' do - let(:worker_cron) { '0 */12 * * *' } # each 00:00, 12:00 - let(:worker_time_zone) { 'UTC' } - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_weekly_build, cron_time_zone: user_time_zone, trigger: trigger) } + let(:trigger_schedule) { create(:ci_trigger_schedule, cron: user_cron, cron_time_zone: 'UTC') } - context 'when user is in Europe/London(+00:00)' do - let(:user_time_zone) { 'Europe/London' } + subject { trigger_schedule.real_next_run(worker_cron: worker_cron, worker_time_zone: 'UTC') } - it 'returns next_run_at' do - is_expected.to eq(trigger_schedule.next_run_at) - end - end - - context 'when user is in Asia/Hong_Kong(+08:00)' do - let(:user_time_zone) { 'Asia/Hong_Kong' } - - it 'returns next_run_at' do - is_expected.to eq(trigger_schedule.next_run_at) - end - end - - context 'when user is in Canada/Pacific(-08:00)' do - let(:user_time_zone) { 'Canada/Pacific' } + context 'when next_run_at > worker_next_time' do + let(:worker_cron) { '* * * * *' } # every minutes + let(:user_cron) { '0 0 1 1 *' } # every 00:00, January 1st - it 'returns next_run_at' do - is_expected.to eq(trigger_schedule.next_run_at) - end + it 'returns next_run_at' do + is_expected.to eq(trigger_schedule.next_run_at) end end context 'when worker_next_time > next_run_at' do - let(:worker_cron) { '0 0 */2 * *' } # every 2 days - let(:worker_time_zone) { 'UTC' } - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, cron_time_zone: user_time_zone, trigger: trigger) } - - context 'when user is in Europe/London(+00:00)' do - let(:user_time_zone) { 'Europe/London' } - - it 'returns worker_next_time' do - is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) - end - end - - context 'when user is in Asia/Hong_Kong(+08:00)' do - let(:user_time_zone) { 'Asia/Hong_Kong' } - - it 'returns worker_next_time' do - is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) - end - end - - context 'when user is in Canada/Pacific(-08:00)' do - let(:user_time_zone) { 'Canada/Pacific' } + let(:worker_cron) { '0 0 1 1 *' } # every 00:00, January 1st + let(:user_cron) { '0 */6 * * *' } # each six hours - it 'returns worker_next_time' do - is_expected.to eq(Ci::CronParser.new(worker_cron, worker_time_zone).next_time_from_now) - end + it 'returns worker_next_time' do + is_expected.to eq(Ci::CronParser.new(worker_cron, 'UTC').next_time_from(Time.now)) end end end -- cgit v1.2.1 From 21cabf381b55ab2747d773ae1eeb70d2bb40e9a5 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Sat, 1 Apr 2017 00:19:46 +0900 Subject: Move real_next_run to helper --- spec/models/ci/trigger_schedule_spec.rb | 24 ------------------------ 1 file changed, 24 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index da23611f1a0..6a586a4e9b1 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -54,28 +54,4 @@ describe Ci::TriggerSchedule, models: true do end end end - - describe '#real_next_run' do - let(:trigger_schedule) { create(:ci_trigger_schedule, cron: user_cron, cron_time_zone: 'UTC') } - - subject { trigger_schedule.real_next_run(worker_cron: worker_cron, worker_time_zone: 'UTC') } - - context 'when next_run_at > worker_next_time' do - let(:worker_cron) { '* * * * *' } # every minutes - let(:user_cron) { '0 0 1 1 *' } # every 00:00, January 1st - - it 'returns next_run_at' do - is_expected.to eq(trigger_schedule.next_run_at) - end - end - - context 'when worker_next_time > next_run_at' do - let(:worker_cron) { '0 0 1 1 *' } # every 00:00, January 1st - let(:user_cron) { '0 */6 * * *' } # each six hours - - it 'returns worker_next_time' do - is_expected.to eq(Ci::CronParser.new(worker_cron, 'UTC').next_time_from(Time.now)) - end - end - end end -- cgit v1.2.1 From 57d082f3589060c90c2841dd52dda77574f5d984 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Sat, 1 Apr 2017 02:02:26 +0900 Subject: Add validator --- spec/models/ci/trigger_schedule_spec.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 6a586a4e9b1..30972f2295e 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -4,8 +4,6 @@ describe Ci::TriggerSchedule, models: true do it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:trigger) } - # it { is_expected.to validate_presence_of :cron } - # it { is_expected.to validate_presence_of :cron_time_zone } it { is_expected.to respond_to :ref } it 'should validate ref existence' do @@ -26,7 +24,7 @@ describe Ci::TriggerSchedule, models: true do context 'when every hour' do let(:cron) { '0 * * * *' } # 00:00, 01:00, 02:00, ..., 23:00 - it 'fails' do + it 'gets an error' do expect(trigger_schedule.errors[:cron].first).to include('can not be less than 1 hour') end end @@ -34,7 +32,7 @@ describe Ci::TriggerSchedule, models: true do context 'when each six hours' do let(:cron) { '0 */6 * * *' } # 00:00, 06:00, 12:00, 18:00 - it 'succeeds' do + it 'gets no errors' do expect(trigger_schedule.errors[:cron]).to be_empty end end -- cgit v1.2.1 From 62480461c943b4ca4c72830c04932cd5bba9f4e7 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Sat, 1 Apr 2017 02:55:55 +0900 Subject: Fixed failed tests --- spec/models/ci/trigger_schedule_spec.rb | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 30972f2295e..1d6d602ebda 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -21,7 +21,7 @@ describe Ci::TriggerSchedule, models: true do trigger_schedule.valid? end - context 'when every hour' do + context 'when cron frequency is too short' do let(:cron) { '0 * * * *' } # 00:00, 01:00, 02:00, ..., 23:00 it 'gets an error' do @@ -29,8 +29,8 @@ describe Ci::TriggerSchedule, models: true do end end - context 'when each six hours' do - let(:cron) { '0 */6 * * *' } # 00:00, 06:00, 12:00, 18:00 + context 'when cron frequency is eligible' do + let(:cron) { '0 0 1 1 *' } # every 00:00, January 1st it 'gets no errors' do expect(trigger_schedule.errors[:cron]).to be_empty @@ -39,17 +39,15 @@ describe Ci::TriggerSchedule, models: true do end describe '#schedule_next_run!' do - context 'when more_than_1_hour_from_now' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } - before do - trigger_schedule.schedule_next_run! - end + before do + trigger_schedule.schedule_next_run! + end - it 'updates next_run_at' do - next_time = Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) - expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) - end + it 'updates next_run_at' do + next_time = Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) + expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) end end end -- cgit v1.2.1 From 934e949726adf4428a03970d78e23555cc1d7a72 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Sat, 1 Apr 2017 17:57:52 +0900 Subject: Fix rubocop issues. Use add_concurrent_foreign_key. --- spec/models/ci/trigger_schedule_spec.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 1d6d602ebda..57ebcdfb3f1 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -1,7 +1,6 @@ require 'spec_helper' describe Ci::TriggerSchedule, models: true do - it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:trigger) } it { is_expected.to respond_to :ref } -- cgit v1.2.1 From 97cc6777368bfe171198af383bf715629e9b076f Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Sat, 1 Apr 2017 23:27:24 +0900 Subject: Commentout check_cron_frequency --- spec/models/ci/trigger_schedule_spec.rb | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 57ebcdfb3f1..8b27ca1c8b2 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -12,33 +12,8 @@ describe Ci::TriggerSchedule, models: true do expect(trigger_schedule.errors[:ref].first).to include('does not exist') end - describe 'cron limitation' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } - - before do - trigger_schedule.cron = cron - trigger_schedule.valid? - end - - context 'when cron frequency is too short' do - let(:cron) { '0 * * * *' } # 00:00, 01:00, 02:00, ..., 23:00 - - it 'gets an error' do - expect(trigger_schedule.errors[:cron].first).to include('can not be less than 1 hour') - end - end - - context 'when cron frequency is eligible' do - let(:cron) { '0 0 1 1 *' } # every 00:00, January 1st - - it 'gets no errors' do - expect(trigger_schedule.errors[:cron]).to be_empty - end - end - end - describe '#schedule_next_run!' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build) } + let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil) } before do trigger_schedule.schedule_next_run! -- cgit v1.2.1 From a67aff6d398467099121e7a7b4a542ff531d3f45 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 4 Apr 2017 16:55:14 +0900 Subject: Add Import/Export Setting for trigger_schedule. Remove ref validation. --- spec/models/ci/trigger_schedule_spec.rb | 7 ------- 1 file changed, 7 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 8b27ca1c8b2..99668ff17b8 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -5,13 +5,6 @@ describe Ci::TriggerSchedule, models: true do it { is_expected.to belong_to(:trigger) } it { is_expected.to respond_to :ref } - it 'should validate ref existence' do - trigger_schedule = create(:ci_trigger_schedule, :cron_nightly_build) - trigger_schedule.trigger.ref = 'invalid-ref' - trigger_schedule.valid? - expect(trigger_schedule.errors[:ref].first).to include('does not exist') - end - describe '#schedule_next_run!' do let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil) } -- cgit v1.2.1 From 914bef671f54c04a0d36d8e0f8c9830d6dea7b03 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 4 Apr 2017 18:44:25 +0900 Subject: Move Ci::CronParser to Gitlab::Ci::CronParser --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 99668ff17b8..81104cb26b6 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -13,7 +13,7 @@ describe Ci::TriggerSchedule, models: true do end it 'updates next_run_at' do - next_time = Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) + next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) end end -- cgit v1.2.1 From 4a5c6a8e2953baeceb33d281d23d2c305ff884fa Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 4 Apr 2017 21:22:12 +0900 Subject: Rename cron_nightly_build to nightly --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 81104cb26b6..9a4bf122bf0 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -6,7 +6,7 @@ describe Ci::TriggerSchedule, models: true do it { is_expected.to respond_to :ref } describe '#schedule_next_run!' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :cron_nightly_build, next_run_at: nil) } + let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly, next_run_at: nil) } before do trigger_schedule.schedule_next_run! -- cgit v1.2.1 From 4688eb47c6fe135fb9baad5a5d56b1dfa685cc7f Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 5 Apr 2017 01:54:45 +0900 Subject: Rename cron_time_zone to cron_timezone. Separate add_concurrent_foreign_key. --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 9a4bf122bf0..fc01d702f65 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -13,7 +13,7 @@ describe Ci::TriggerSchedule, models: true do end it 'updates next_run_at' do - next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_time_zone).next_time_from(Time.now) + next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now) expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) end end -- cgit v1.2.1 From 1a244c64ebe7fae8b13ffc8e663118265eb76f5c Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 5 Apr 2017 01:57:06 +0900 Subject: Remove next_run_at: nil from trigger_schedule_spec --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index fc01d702f65..01db6b49fee 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -6,7 +6,7 @@ describe Ci::TriggerSchedule, models: true do it { is_expected.to respond_to :ref } describe '#schedule_next_run!' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly, next_run_at: nil) } + let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly) } before do trigger_schedule.schedule_next_run! -- cgit v1.2.1 From cc6ac794adfd66de4aa3ed28db7bf89cb6b46cb2 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 5 Apr 2017 01:57:41 +0900 Subject: Define next_time as let in trigger_schedule_spec --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 01db6b49fee..53c1349d9f8 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -7,13 +7,13 @@ describe Ci::TriggerSchedule, models: true do describe '#schedule_next_run!' do let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly) } + let(:next_time) { Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now) } before do trigger_schedule.schedule_next_run! end it 'updates next_run_at' do - next_time = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now) expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) end end -- cgit v1.2.1 From 3b58966b6c9f0cb183e8ec3652ec0cd7e20ce99e Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 5 Apr 2017 01:58:42 +0900 Subject: Use parenthesis for respond_to :ref --- spec/models/ci/trigger_schedule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 53c1349d9f8..22c0790688c 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Ci::TriggerSchedule, models: true do it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:trigger) } - it { is_expected.to respond_to :ref } + it { is_expected.to respond_to(:ref) } describe '#schedule_next_run!' do let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly) } -- cgit v1.2.1 From 48e07eab5755770bff9d5ee1aca33526e4120637 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Thu, 6 Apr 2017 18:52:48 +0900 Subject: Improve trigger_schedule.rb --- spec/models/ci/trigger_schedule_spec.rb | 68 ++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 6 deletions(-) (limited to 'spec/models/ci') diff --git a/spec/models/ci/trigger_schedule_spec.rb b/spec/models/ci/trigger_schedule_spec.rb index 22c0790688c..75d21541cee 100644 --- a/spec/models/ci/trigger_schedule_spec.rb +++ b/spec/models/ci/trigger_schedule_spec.rb @@ -5,16 +5,72 @@ describe Ci::TriggerSchedule, models: true do it { is_expected.to belong_to(:trigger) } it { is_expected.to respond_to(:ref) } + describe '#set_next_run_at' do + context 'when creates new TriggerSchedule' do + before do + trigger_schedule = create(:ci_trigger_schedule, :nightly) + @expected_next_run_at = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone) + .next_time_from(Time.now) + end + + it 'updates next_run_at automatically' do + expect(Ci::TriggerSchedule.last.next_run_at).to eq(@expected_next_run_at) + end + end + + context 'when updates cron of exsisted TriggerSchedule' do + before do + trigger_schedule = create(:ci_trigger_schedule, :nightly) + new_cron = '0 0 1 1 *' + trigger_schedule.update!(cron: new_cron) # Subject + @expected_next_run_at = Gitlab::Ci::CronParser.new(new_cron, trigger_schedule.cron_timezone) + .next_time_from(Time.now) + end + + it 'updates next_run_at automatically' do + expect(Ci::TriggerSchedule.last.next_run_at).to eq(@expected_next_run_at) + end + end + end + describe '#schedule_next_run!' do - let(:trigger_schedule) { create(:ci_trigger_schedule, :nightly) } - let(:next_time) { Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone).next_time_from(Time.now) } + context 'when reschedules after 10 days from now' do + before do + trigger_schedule = create(:ci_trigger_schedule, :nightly) + time_future = Time.now + 10.days + allow(Time).to receive(:now).and_return(time_future) + trigger_schedule.schedule_next_run! # Subject + @expected_next_run_at = Gitlab::Ci::CronParser.new(trigger_schedule.cron, trigger_schedule.cron_timezone) + .next_time_from(time_future) + end - before do - trigger_schedule.schedule_next_run! + it 'points to proper next_run_at' do + expect(Ci::TriggerSchedule.last.next_run_at).to eq(@expected_next_run_at) + end end - it 'updates next_run_at' do - expect(Ci::TriggerSchedule.last.next_run_at).to eq(next_time) + context 'when cron is invalid' do + before do + trigger_schedule = create(:ci_trigger_schedule, :nightly) + trigger_schedule.cron = 'Invalid-cron' + trigger_schedule.schedule_next_run! # Subject + end + + it 'sets nil to next_run_at' do + expect(Ci::TriggerSchedule.last.next_run_at).to be_nil + end + end + + context 'when cron_timezone is invalid' do + before do + trigger_schedule = create(:ci_trigger_schedule, :nightly) + trigger_schedule.cron_timezone = 'Invalid-cron_timezone' + trigger_schedule.schedule_next_run! # Subject + end + + it 'sets nil to next_run_at' do + expect(Ci::TriggerSchedule.last.next_run_at).to be_nil + end end end end -- cgit v1.2.1