diff --git a/lib/crono/period.rb b/lib/crono/period.rb index 31a99f3..661cd88 100644 --- a/lib/crono/period.rb +++ b/lib/crono/period.rb @@ -1,5 +1,5 @@ module Crono - # Period describe frequency of performing a task + # Period describe frequency of jobs class Period DAYS = [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday] @@ -14,7 +14,9 @@ module Crono return initial_next unless since @next = @period.since(since) @next = @next.beginning_of_week.advance(days: @on) if @on - @next.change(time_atts) + @next = @next.change(time_atts) + return @next if @next.future? + Time.now end def description diff --git a/spec/period_spec.rb b/spec/period_spec.rb index bb7fa57..e396912 100644 --- a/spec/period_spec.rb +++ b/spec/period_spec.rb @@ -53,28 +53,33 @@ describe Crono::Period do end context 'in daily basis' do + it "should return Time.now if the next time in past" do + @period = Crono::Period.new(1.day, at: '06:00') + expect(@period.next(since: 2.days.ago)).to be_eql(Time.now) + end + it 'should return the time 2 days from now' do @period = Crono::Period.new(2.day) - expect(@period.next).to be_eql(2.day.from_now) + expect(@period.next).to be_eql(2.days.from_now) end it "should set time to 'at' time as a string" do time = 10.minutes.ago at = [time.hour, time.min].join(':') - @period = Crono::Period.new(2.day, at: at) - expect(@period.next).to be_eql(2.day.from_now.change(hour: time.hour, min: time.min)) + @period = Crono::Period.new(2.days, at: at) + expect(@period.next).to be_eql(2.days.from_now.change(hour: time.hour, min: time.min)) end it "should set time to 'at' time as a hash" do time = 10.minutes.ago at = { hour: time.hour, min: time.min } - @period = Crono::Period.new(2.day, at: at) - expect(@period.next).to be_eql(2.day.from_now.change(at)) + @period = Crono::Period.new(2.days, at: at) + expect(@period.next).to be_eql(2.days.from_now.change(at)) end it "should raise error when 'at' is wrong" do expect { - Crono::Period.new(2.day, at: 1) + Crono::Period.new(2.days, at: 1) }.to raise_error("Unknown 'at' format") end @@ -85,14 +90,14 @@ describe Crono::Period do end it 'should return time in relation to last time' do - @period = Crono::Period.new(2.day) + @period = Crono::Period.new(2.days) expect(@period.next(since: 1.day.ago)).to be_eql(1.day.from_now) end it 'should return today time if it is first run and not too late' do time = 10.minutes.from_now at = { hour: time.hour, min: time.min } - @period = Crono::Period.new(2.day, at: at) + @period = Crono::Period.new(2.days, at: at) expect(@period.next.utc.to_s).to be_eql(Time.now.change(at).utc.to_s) end end