test(TaskListScreen): add integration tests for filtered and overdue task states
All checks were successful
Build and Release to F-Droid / build-and-deploy (push) Successful in 10m30s
All checks were successful
Build and Release to F-Droid / build-and-deploy (push) Successful in 10m30s
- Covers empty states, celebration state, and scheduled/overdue task rendering - Verifies proper checkbox behavior for future tasks - Tests AppBar for sort dropdown, edit/delete actions, and calendar strip - Adds necessary test helpers and overrides for room-specific tasks
This commit is contained in:
@@ -283,4 +283,267 @@ void main() {
|
||||
expect(result.first.roomId, room2Id);
|
||||
});
|
||||
});
|
||||
|
||||
group('CalendarDao.watchTasksForDateInRoom', () {
|
||||
test('returns empty list when no tasks exist in room', () async {
|
||||
final result = await db.calendarDao
|
||||
.watchTasksForDateInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('returns only tasks due on the queried date in the specified room',
|
||||
() async {
|
||||
// Task due on March 16 in room1
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Abspuelen',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 16, 9, 30),
|
||||
));
|
||||
// Task due on March 15 in room1 (should NOT appear)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Staubsaugen',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 15),
|
||||
));
|
||||
// Task due on March 17 in room1 (should NOT appear)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Fenster putzen',
|
||||
intervalType: IntervalType.monthly,
|
||||
effortLevel: EffortLevel.high,
|
||||
nextDueDate: DateTime(2026, 3, 17),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchTasksForDateInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result.length, 1);
|
||||
expect(result.first.task.name, 'Abspuelen');
|
||||
});
|
||||
|
||||
test('does not return tasks from other rooms on the same date', () async {
|
||||
// Task due on March 16 in room1
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Kueche Aufgabe',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 16),
|
||||
));
|
||||
// Task due on March 16 in room2 (should NOT appear when querying room1)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room2Id,
|
||||
name: 'Bad Aufgabe',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 16),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchTasksForDateInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result.length, 1);
|
||||
expect(result.first.task.name, 'Kueche Aufgabe');
|
||||
expect(result.first.roomId, room1Id);
|
||||
});
|
||||
|
||||
test('returns tasks sorted alphabetically by name', () async {
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Zitrone putzen',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 18),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Abspuelen',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 18, 10),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Moppen',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 18, 8),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchTasksForDateInRoom(DateTime(2026, 3, 18), room1Id)
|
||||
.first;
|
||||
expect(result.length, 3);
|
||||
expect(result[0].task.name, 'Abspuelen');
|
||||
expect(result[1].task.name, 'Moppen');
|
||||
expect(result[2].task.name, 'Zitrone putzen');
|
||||
});
|
||||
});
|
||||
|
||||
group('CalendarDao.watchOverdueTasksInRoom', () {
|
||||
test('returns empty list when no overdue tasks in room', () async {
|
||||
final result = await db.calendarDao
|
||||
.watchOverdueTasksInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('returns only overdue tasks in the specified room', () async {
|
||||
// Task due March 15 in room1 — overdue relative to March 16
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Ueberfaelliges Task',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 15),
|
||||
));
|
||||
// Task due March 10 in room1 — also overdue
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Sehr altes Task',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 10),
|
||||
));
|
||||
// Task due on March 16 in room1 — NOT overdue (should NOT appear)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Heutiges Task',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 16),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchOverdueTasksInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result.length, 2);
|
||||
});
|
||||
|
||||
test('does not return overdue tasks from other rooms', () async {
|
||||
// Overdue task in room1
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Kueche Overdue',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 14),
|
||||
));
|
||||
// Overdue task in room2 (should NOT appear when querying room1)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room2Id,
|
||||
name: 'Bad Overdue',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 14),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchOverdueTasksInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result.length, 1);
|
||||
expect(result.first.task.name, 'Kueche Overdue');
|
||||
expect(result.first.roomId, room1Id);
|
||||
});
|
||||
|
||||
test('returns overdue tasks sorted by nextDueDate ascending', () async {
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Neues Overdue',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 15),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Altes Overdue',
|
||||
intervalType: IntervalType.monthly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 1),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Mittleres Overdue',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 10),
|
||||
));
|
||||
|
||||
final result = await db.calendarDao
|
||||
.watchOverdueTasksInRoom(DateTime(2026, 3, 16), room1Id)
|
||||
.first;
|
||||
expect(result.length, 3);
|
||||
expect(result[0].task.name, 'Altes Overdue');
|
||||
expect(result[1].task.name, 'Mittleres Overdue');
|
||||
expect(result[2].task.name, 'Neues Overdue');
|
||||
});
|
||||
});
|
||||
|
||||
group('CalendarDao.getTaskCountInRoom', () {
|
||||
test('returns 0 when room has no tasks', () async {
|
||||
final count = await db.calendarDao.getTaskCountInRoom(room1Id);
|
||||
expect(count, 0);
|
||||
});
|
||||
|
||||
test('returns correct count for room', () async {
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Aufgabe 1',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 16),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Aufgabe 2',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 20),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Aufgabe 3',
|
||||
intervalType: IntervalType.monthly,
|
||||
effortLevel: EffortLevel.high,
|
||||
nextDueDate: DateTime(2026, 3, 25),
|
||||
));
|
||||
|
||||
final count = await db.calendarDao.getTaskCountInRoom(room1Id);
|
||||
expect(count, 3);
|
||||
});
|
||||
|
||||
test('does not count tasks from other rooms', () async {
|
||||
// Two tasks in room1
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Kueche Aufgabe 1',
|
||||
intervalType: IntervalType.daily,
|
||||
effortLevel: EffortLevel.low,
|
||||
nextDueDate: DateTime(2026, 3, 16),
|
||||
));
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room1Id,
|
||||
name: 'Kueche Aufgabe 2',
|
||||
intervalType: IntervalType.weekly,
|
||||
effortLevel: EffortLevel.medium,
|
||||
nextDueDate: DateTime(2026, 3, 20),
|
||||
));
|
||||
// One task in room2 (should NOT be counted for room1)
|
||||
await db.tasksDao.insertTask(TasksCompanion.insert(
|
||||
roomId: room2Id,
|
||||
name: 'Bad Aufgabe',
|
||||
intervalType: IntervalType.monthly,
|
||||
effortLevel: EffortLevel.high,
|
||||
nextDueDate: DateTime(2026, 3, 18),
|
||||
));
|
||||
|
||||
final count = await db.calendarDao.getTaskCountInRoom(room1Id);
|
||||
expect(count, 2);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user