diff --git a/app/models/recurring_todo.rb b/app/models/recurring_todo.rb index 9a159c4c..2f6d623b 100644 --- a/app/models/recurring_todo.rb +++ b/app/models/recurring_todo.rb @@ -61,7 +61,7 @@ class RecurringTodo < ActiveRecord::Base errors.add_to_base("Every other nth week may not be empty for recurrence setting") end something_set = false - %w{sunday monday tuesday wednesday thursday friday}.each do |day| + %w{sunday monday tuesday wednesday thursday friday saturday}.each do |day| something_set ||= self.send("on_#{day}") end errors.add_to_base("You must specify at least one day on which the todo recurs") if !something_set @@ -406,9 +406,9 @@ class RecurringTodo < ActiveRecord::Base end def recurrence_pattern + return "invalid repeat pattern" if every_other1.nil? case recurring_period when 'daily' - return "invalid repeat pattern" if every_other1.nil? if only_work_days return "on work days" else @@ -419,21 +419,19 @@ class RecurringTodo < ActiveRecord::Base end end when 'weekly' - return "invalid repeat pattern" if every_other1.nil? if every_other1 > 1 return "every #{every_other1} weeks" else return 'weekly' end when 'monthly' - return "invalid repeat pattern" if every_other1.nil? || every_other2.nil? + return "invalid repeat pattern" if every_other2.nil? if self.recurrence_selector == 0 return "every #{self.every_other2} month#{self.every_other2>1?'s':''} on day #{self.every_other1}" else return "every #{self.xth} #{self.day_of_week} of every #{self.every_other2} month#{self.every_other2>1?'s':''}" end when 'yearly' - return "invalid repeat pattern" if every_other1.nil? if self.recurrence_selector == 0 return "every year on #{self.month_of_year} #{self.every_other1}" else @@ -553,8 +551,8 @@ class RecurringTodo < ActiveRecord::Base start = previous + 1.day if start.wday() == 0 # we went to a new week , go to the nth next week and find first match - # that week - start += self.every_other1.week + # that week. Note that we already went into the next week, so -1 + start += (self.every_other1-1).week end unless self.start_from.nil? # check if the start_from date is later than previous. If so, use diff --git a/test/fixtures/recurring_todos.yml b/test/fixtures/recurring_todos.yml index daffc38c..db630d68 100644 --- a/test/fixtures/recurring_todos.yml +++ b/test/fixtures/recurring_todos.yml @@ -64,7 +64,7 @@ call_bill_gates_every_workday: show_from_delta: ~ recurring_period: daily recurrence_selector: ~ - every_other1: ~ + every_other1: 1 every_other2: ~ every_other3: ~ every_day: ~ diff --git a/test/unit/recurring_todo_test.rb b/test/unit/recurring_todo_test.rb index 6e4c5b0b..8ae3f6da 100644 --- a/test/unit/recurring_todo_test.rb +++ b/test/unit/recurring_todo_test.rb @@ -124,7 +124,9 @@ class RecurringTodoTest < ActiveSupport::TestCase due_date = @weekly_every_day.get_due_date(@sunday) assert_equal @monday, due_date - # saturday is last day in week, so the next date should be sunday + n_weeks + # saturday is last day in week, so the next date should be sunday + n-1 weeks + # n-1 because sunday is already in the next week + @weekly_every_day.every_other1 = 3 due_date = @weekly_every_day.get_due_date(@saturday) assert_equal @sunday + 2.weeks, due_date @@ -141,6 +143,10 @@ class RecurringTodoTest < ActiveSupport::TestCase assert_equal @wednesday, due_date due_date = @weekly_every_day.get_due_date(@wednesday) assert_equal @tuesday+1.week, due_date + + @weekly_every_day.every_day = ' s' + due_date = @weekly_every_day.get_due_date(@sunday) + assert_equal @saturday+1.week, due_date end def test_monthly_pattern