From a2cef91d7eb67d36ef5006d9004ca32a20c1f57c Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Wed, 18 Mar 2026 20:48:09 +0100 Subject: [PATCH] test(08-01): add failing tests for softDeleteTask, getCompletionCount, isActive filtering - Tests for softDeleteTask sets isActive=false without removing from DB - Tests for getCompletionCount with 0 and N completions - Tests for watchTasksInRoom excludes inactive tasks - Tests for getOverdueTaskCount excludes inactive tasks - Test for hard deleteTask still removes task and completions --- test/features/tasks/data/tasks_dao_test.dart | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/test/features/tasks/data/tasks_dao_test.dart b/test/features/tasks/data/tasks_dao_test.dart index 5f07464..fa13da1 100644 --- a/test/features/tasks/data/tasks_dao_test.dart +++ b/test/features/tasks/data/tasks_dao_test.dart @@ -204,5 +204,137 @@ void main() { // Only the task due Mar 10 is overdue (before Mar 15) expect(overdueCount, 1); }); + + test('softDeleteTask sets isActive to false without removing the task', () async { + final id = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Abspuelen', + intervalType: IntervalType.daily, + effortLevel: EffortLevel.low, + nextDueDate: DateTime(2026, 3, 15), + ), + ); + + await db.tasksDao.softDeleteTask(id); + + // Task should still exist in DB but isActive == false + final allTasks = await (db.select(db.tasks)).get(); + expect(allTasks.length, 1); + expect(allTasks.first.isActive, isFalse); + }); + + test('getCompletionCount returns 0 for task with no completions', () async { + final id = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Abspuelen', + intervalType: IntervalType.daily, + effortLevel: EffortLevel.low, + nextDueDate: DateTime(2026, 3, 15), + ), + ); + + final count = await db.tasksDao.getCompletionCount(id); + expect(count, 0); + }); + + test('getCompletionCount returns correct count after completions', () async { + final id = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Abspuelen', + intervalType: IntervalType.daily, + effortLevel: EffortLevel.low, + nextDueDate: DateTime(2026, 3, 13), + ), + ); + + await db.tasksDao.completeTask(id, now: DateTime(2026, 3, 13)); + await db.tasksDao.completeTask(id, now: DateTime(2026, 3, 14)); + await db.tasksDao.completeTask(id, now: DateTime(2026, 3, 15)); + + final count = await db.tasksDao.getCompletionCount(id); + expect(count, 3); + }); + + test('watchTasksInRoom excludes soft-deleted (isActive=false) tasks', () async { + final activeId = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Active Task', + intervalType: IntervalType.daily, + effortLevel: EffortLevel.low, + nextDueDate: DateTime(2026, 3, 15), + ), + ); + final inactiveId = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Inactive Task', + intervalType: IntervalType.weekly, + effortLevel: EffortLevel.medium, + nextDueDate: DateTime(2026, 3, 10), + ), + ); + + await db.tasksDao.softDeleteTask(inactiveId); + + final tasks = await db.tasksDao.watchTasksInRoom(roomId).first; + expect(tasks.length, 1); + expect(tasks.first.id, activeId); + expect(tasks.first.name, 'Active Task'); + }); + + test('getOverdueTaskCount excludes soft-deleted (isActive=false) tasks', () async { + // Active overdue task + await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Active Overdue', + intervalType: IntervalType.weekly, + effortLevel: EffortLevel.medium, + nextDueDate: DateTime(2026, 3, 10), + ), + ); + // Inactive overdue task + final inactiveId = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Inactive Overdue', + intervalType: IntervalType.weekly, + effortLevel: EffortLevel.medium, + nextDueDate: DateTime(2026, 3, 5), + ), + ); + + await db.tasksDao.softDeleteTask(inactiveId); + + final overdueCount = await db.tasksDao.getOverdueTaskCount( + roomId, + today: DateTime(2026, 3, 15), + ); + expect(overdueCount, 1); + }); + + test('hard deleteTask still removes task and its completions', () async { + final id = await db.tasksDao.insertTask( + TasksCompanion.insert( + roomId: roomId, + name: 'Abspuelen', + intervalType: IntervalType.daily, + effortLevel: EffortLevel.low, + nextDueDate: DateTime(2026, 3, 13), + ), + ); + await db.tasksDao.completeTask(id, now: DateTime(2026, 3, 13)); + + await db.tasksDao.deleteTask(id); + + final tasks = await (db.select(db.tasks)).get(); + final completions = await (db.select(db.taskCompletions)).get(); + expect(tasks, isEmpty); + expect(completions, isEmpty); + }); }); }