From 4e876f2686c362228e7ff6fe6453b159c423301b Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 13 Apr 2021 22:39:50 +0200 Subject: [PATCH] Make sure to not make the task done if there is no repeat after duration --- pkg/models/tasks.go | 11 +++++++---- pkg/models/tasks_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index c45291dc0..b2e3a8631 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -65,9 +65,7 @@ type Task struct { ListID int64 `xorm:"bigint INDEX not null" json:"list_id" param:"list"` // An amount in seconds this task repeats itself. If this is set, when marking the task as done, it will mark itself as "undone" and then increase all remindes and the due date by its amount. RepeatAfter int64 `xorm:"bigint INDEX null" json:"repeat_after"` - // If specified, a repeating task will repeat from the current date rather than the last set date. - //RepeatFromCurrentDate bool `xorm:"null" json:"repeat_from_current_date"` - + // Can have three possible values which will trigger when the task is marked as done: 0 = repeats after the amount specified in repeat_after, 1 = repeats all dates each months (ignoring repeat_after), 3 = repeats from the current date rather than the last set date. RepeatMode TaskRepeatMode `xorm:"not null default 0" json:"repeat_mode"` // The task priority. Can be anything you want, it is possible to sort by this later. Priority int64 `xorm:"bigint null" json:"priority"` @@ -1132,6 +1130,8 @@ func setTaskDatesDefault(oldTask, newTask *Task) { newTask.EndDate = newTask.EndDate.Add(repeatDuration) } } + + newTask.Done = false } func setTaskDatesMonthRepeat(oldTask, newTask *Task) { @@ -1159,6 +1159,8 @@ func setTaskDatesMonthRepeat(oldTask, newTask *Task) { newTask.EndDate = addOneMonthToDate(oldTask.EndDate) } } + + newTask.Done = false } func setTaskDatesFromCurrentDateRepeat(oldTask, newTask *Task) { @@ -1204,6 +1206,8 @@ func setTaskDatesFromCurrentDateRepeat(oldTask, newTask *Task) { newTask.EndDate = now.Add(repeatDuration) } } + + newTask.Done = false } // This helper function updates the reminders, doneAt, start and end dates of the *old* task @@ -1223,7 +1227,6 @@ func updateDone(oldTask *Task, newTask *Task) { } newTask.DoneAt = time.Now() - newTask.Done = false } // When unmarking a task as done, reset the timestamp diff --git a/pkg/models/tasks_test.go b/pkg/models/tasks_test.go index 4daf3e3f0..4f9e1ada3 100644 --- a/pkg/models/tasks_test.go +++ b/pkg/models/tasks_test.go @@ -345,6 +345,23 @@ func TestUpdateDone(t *testing.T) { updateDone(oldTask, newTask) assert.Equal(t, time.Time{}, newTask.DoneAt) }) + t.Run("no interval set, default repeat mode", func(t *testing.T) { + dueDate := time.Unix(1550000000, 0) + oldTask := &Task{ + Done: false, + RepeatAfter: 0, + RepeatMode: TaskRepeatModeDefault, + DueDate: dueDate, + } + newTask := &Task{ + Done: true, + DueDate: dueDate, + } + updateDone(oldTask, newTask) + + assert.Equal(t, dueDate.Unix(), newTask.DueDate.Unix()) + assert.True(t, newTask.Done) + }) t.Run("repeating interval", func(t *testing.T) { t.Run("normal", func(t *testing.T) { oldTask := &Task{ @@ -363,6 +380,7 @@ func TestUpdateDone(t *testing.T) { } assert.Equal(t, expected, newTask.DueDate) + assert.False(t, newTask.Done) }) t.Run("don't update if due date is zero", func(t *testing.T) { oldTask := &Task{ @@ -376,6 +394,7 @@ func TestUpdateDone(t *testing.T) { } updateDone(oldTask, newTask) assert.Equal(t, time.Unix(1543626724, 0), newTask.DueDate) + assert.False(t, newTask.Done) }) t.Run("update reminders", func(t *testing.T) { oldTask := &Task{ @@ -403,6 +422,7 @@ func TestUpdateDone(t *testing.T) { assert.Len(t, newTask.Reminders, 2) assert.Equal(t, expected1, newTask.Reminders[0]) assert.Equal(t, expected2, newTask.Reminders[1]) + assert.False(t, newTask.Done) }) t.Run("update start date", func(t *testing.T) { oldTask := &Task{ @@ -421,6 +441,7 @@ func TestUpdateDone(t *testing.T) { } assert.Equal(t, expected, newTask.StartDate) + assert.False(t, newTask.Done) }) t.Run("update end date", func(t *testing.T) { oldTask := &Task{ @@ -439,6 +460,7 @@ func TestUpdateDone(t *testing.T) { } assert.Equal(t, expected, newTask.EndDate) + assert.False(t, newTask.Done) }) t.Run("ensure due date is repeated even if the original one is in the future", func(t *testing.T) { oldTask := &Task{ @@ -452,6 +474,7 @@ func TestUpdateDone(t *testing.T) { updateDone(oldTask, newTask) expected := oldTask.DueDate.Add(time.Duration(oldTask.RepeatAfter) * time.Second) assert.Equal(t, expected, newTask.DueDate) + assert.False(t, newTask.Done) }) t.Run("repeat from current date", func(t *testing.T) { t.Run("due date", func(t *testing.T) { @@ -468,6 +491,7 @@ func TestUpdateDone(t *testing.T) { // Only comparing unix timestamps because time.Time use nanoseconds which can't ever possibly have the same value assert.Equal(t, time.Now().Add(time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.DueDate.Unix()) + assert.False(t, newTask.Done) }) t.Run("reminders", func(t *testing.T) { oldTask := &Task{ @@ -490,6 +514,7 @@ func TestUpdateDone(t *testing.T) { // Only comparing unix timestamps because time.Time use nanoseconds which can't ever possibly have the same value assert.Equal(t, time.Now().Add(time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.Reminders[0].Unix()) assert.Equal(t, time.Now().Add(diff+time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.Reminders[1].Unix()) + assert.False(t, newTask.Done) }) t.Run("start date", func(t *testing.T) { oldTask := &Task{ @@ -505,6 +530,7 @@ func TestUpdateDone(t *testing.T) { // Only comparing unix timestamps because time.Time use nanoseconds which can't ever possibly have the same value assert.Equal(t, time.Now().Add(time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.StartDate.Unix()) + assert.False(t, newTask.Done) }) t.Run("end date", func(t *testing.T) { oldTask := &Task{ @@ -520,6 +546,7 @@ func TestUpdateDone(t *testing.T) { // Only comparing unix timestamps because time.Time use nanoseconds which can't ever possibly have the same value assert.Equal(t, time.Now().Add(time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.EndDate.Unix()) + assert.False(t, newTask.Done) }) t.Run("start and end date", func(t *testing.T) { oldTask := &Task{ @@ -539,6 +566,7 @@ func TestUpdateDone(t *testing.T) { // Only comparing unix timestamps because time.Time use nanoseconds which can't ever possibly have the same value assert.Equal(t, time.Now().Add(time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.StartDate.Unix()) assert.Equal(t, time.Now().Add(diff+time.Duration(oldTask.RepeatAfter)*time.Second).Unix(), newTask.EndDate.Unix()) + assert.False(t, newTask.Done) }) }) t.Run("repeat each month", func(t *testing.T) { @@ -557,6 +585,7 @@ func TestUpdateDone(t *testing.T) { assert.True(t, newTask.DueDate.After(oldDueDate)) assert.NotEqual(t, oldDueDate.Month(), newTask.DueDate.Month()) + assert.False(t, newTask.Done) }) t.Run("reminders", func(t *testing.T) { oldTask := &Task{ @@ -580,6 +609,7 @@ func TestUpdateDone(t *testing.T) { assert.True(t, r.After(oldReminders[i])) assert.NotEqual(t, oldReminders[i].Month(), r.Month()) } + assert.False(t, newTask.Done) }) t.Run("start date", func(t *testing.T) { oldTask := &Task{ @@ -596,6 +626,7 @@ func TestUpdateDone(t *testing.T) { assert.True(t, newTask.StartDate.After(oldStartDate)) assert.NotEqual(t, oldStartDate.Month(), newTask.StartDate.Month()) + assert.False(t, newTask.Done) }) t.Run("end date", func(t *testing.T) { oldTask := &Task{ @@ -612,6 +643,7 @@ func TestUpdateDone(t *testing.T) { assert.True(t, newTask.EndDate.After(oldEndDate)) assert.NotEqual(t, oldEndDate.Month(), newTask.EndDate.Month()) + assert.False(t, newTask.Done) }) t.Run("start and end date", func(t *testing.T) { oldTask := &Task{ @@ -634,6 +666,7 @@ func TestUpdateDone(t *testing.T) { assert.True(t, newTask.EndDate.After(oldEndDate)) assert.NotEqual(t, oldEndDate.Month(), newTask.EndDate.Month()) assert.Equal(t, oldDiff, newTask.EndDate.Sub(newTask.StartDate)) + assert.False(t, newTask.Done) }) }) })