Merge pull request #209 from iangreenleaf/monthly_recurring_bug

Fix endlessly repeating monthly recurring todos
This commit is contained in:
Reinier Balt 2013-09-15 00:48:40 -07:00
commit 94114746e7
2 changed files with 40 additions and 14 deletions

View file

@ -489,7 +489,7 @@ class RecurringTodo < ActiveRecord::Base
case self.recurrence_selector
when 0 # specific day of the month
if start.mday > day
if start.mday >= day
# there is no next day n in this month, search in next month
#
# start += n.months

View file

@ -729,23 +729,11 @@ class TodosControllerTest < ActionController::TestCase
recurring_todo_1.every_other2 = 1
assert recurring_todo_1.save
# mark todo_1 as complete by toggle_check, this gets rid of todo_1 that was
# not correctly created from the adjusted recurring pattern we defined
# above.
# mark todo_1 as complete by toggle_check
xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo'
todo_1.reload
assert todo_1.completed?
# locate the new todo. This todo is created from the adjusted recurring
# pattern defined in this test
new_todo = Todo.where(:recurring_todo_id => recurring_todo_1.id, :state => 'active').first
assert !new_todo.nil?
# mark new_todo as complete by toggle_check
xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo'
new_todo.reload
assert todo_1.completed?
# locate the new todo in tickler
new_todo = Todo.where(:recurring_todo_id => recurring_todo_1.id, :state => 'deferred').first
assert !new_todo.nil?
@ -799,6 +787,44 @@ class TodosControllerTest < ActionController::TestCase
assert next_todo.due > todo.due
end
def test_check_for_next_todo_monthly
login_as :admin_user
tomorrow = Time.zone.now + 1.day
# Given a monthly repeat pattern
recurring_todo = RecurringTodo.find(5)
recurring_todo.target = "due_date"
recurring_todo.recurring_period = "monthly"
recurring_todo.every_other1 = tomorrow.day
recurring_todo.every_other2 = 1
recurring_todo.save
# Given a recurring todo (todo) that belongs to the repeat pattern (recurring_todo) and is due tomorrow
todo = Todo.where(:recurring_todo_id => 1).first
assert todo.from_recurring_todo?
todo.recurring_todo_id = 5 # rewire todo to the repeat pattern above
todo.due = tomorrow
todo.save!
# When I mark the todo complete
xhr :post, :toggle_check, :id => todo.id, :_source_view => 'todo'
todo.reload
assert todo.completed?
# Then there should not be an active todo beloning to the repeat pattern
next_todo = Todo.where(:recurring_todo_id => recurring_todo.id, :state => 'active').first
assert next_todo.nil?
# Then there should be one new deferred todo
next_todo = Todo.where(:recurring_todo_id => recurring_todo.id, :state => 'deferred').first
assert !next_todo.nil?
assert !next_todo.show_from.nil?
# check that the due date of the new todo is later than tomorrow
assert next_todo.due > todo.due
end
############
# todo notes
############