test(tasks): add failing test for repeating task bucket routing via Task.Update (#2573)

This commit is contained in:
kolaente 2026-04-09 12:02:56 +02:00 committed by kolaente
parent 3d7bab4497
commit 9a8126c111
1 changed files with 46 additions and 0 deletions

View File

@ -392,6 +392,52 @@ func TestTask_Update(t *testing.T) {
assert.False(t, updatedTask.Done)
assert.False(t, updatedTask.DoneAt.IsZero(), "done_at should be persisted in database for repeating tasks")
})
t.Run("repeating tasks marked done from a non-default bucket are moved to the default bucket", func(t *testing.T) {
db.LoadAndAssertFixtures(t)
s := db.NewSession()
defer s.Close()
// Pre-position task 28 in bucket 2 (non-default, non-done) via a
// raw update to bypass the bucket-limit check.
_, err := s.Where("task_id = ? AND project_view_id = ?", 28, 4).
Cols("bucket_id").
Update(&TaskBucket{BucketID: 2})
require.NoError(t, err)
// Mark the repeating task as done via Task.Update (same code path
// the frontend hits when the user clicks "Done" in the task
// detail pane).
task := &Task{
ID: 28,
Done: true,
RepeatAfter: 3600,
}
err = task.Update(s, u)
require.NoError(t, err)
err = s.Commit()
require.NoError(t, err)
// updateDone should have re-opened the task for the next iteration.
assert.False(t, task.Done)
// And the task should now be sitting in the default bucket (1),
// not left in bucket 2 or moved to the done bucket (3).
db.AssertExists(t, "task_buckets", map[string]interface{}{
"task_id": 28,
"project_view_id": 4,
"bucket_id": 1,
}, false)
db.AssertMissing(t, "task_buckets", map[string]interface{}{
"task_id": 28,
"project_view_id": 4,
"bucket_id": 2,
})
db.AssertMissing(t, "task_buckets", map[string]interface{}{
"task_id": 28,
"project_view_id": 4,
"bucket_id": 3,
})
})
t.Run("moving a task between projects should give it a correct index", func(t *testing.T) {
db.LoadAndAssertFixtures(t)
s := db.NewSession()