timetracker/test/features/projects/projects_screen_test.dart
2026-08-03 21:51:48 +02:00

90 lines
3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:timetrack/features/entries/data/drift_entries_repository.dart';
import 'package:timetrack/features/entries/data/entries_repository.dart';
import 'package:timetrack/features/projects/data/drift_projects_repository.dart';
import 'package:timetrack/features/projects/data/projects_repository.dart';
import 'package:timetrack/features/projects/domain/project.dart';
import 'package:timetrack/features/projects/presentation/projects_screen.dart';
class MockProjectsRepository extends Mock implements ProjectsRepository {}
class MockTimeEntriesRepository extends Mock implements TimeEntriesRepository {}
void main() {
late MockProjectsRepository mockProjects;
late MockTimeEntriesRepository mockEntries;
setUp(() {
mockProjects = MockProjectsRepository();
mockEntries = MockTimeEntriesRepository();
when(() => mockProjects.watchAll())
.thenAnswer((_) => Stream.value([]));
when(() => mockProjects.watchActive())
.thenAnswer((_) => Stream.value([]));
when(() => mockEntries.watchByDateRange(any(), any()))
.thenAnswer((_) => Stream.value([]));
});
Widget buildTestApp() {
return ProviderScope(
overrides: [
projectsRepositoryProvider.overrideWithValue(mockProjects),
timeEntriesRepositoryProvider.overrideWithValue(mockEntries),
],
child: const MaterialApp(home: ProjectsScreen()),
);
}
testWidgets('shows empty state on Active tab', (tester) async {
await tester.pumpWidget(buildTestApp());
await tester.pump();
expect(find.byKey(const Key('active_empty')), findsOneWidget);
});
testWidgets('shows Add Project button', (tester) async {
await tester.pumpWidget(buildTestApp());
await tester.pump();
expect(find.byIcon(Icons.add), findsOneWidget);
});
testWidgets('shows Active and Archived tabs', (tester) async {
await tester.pumpWidget(buildTestApp());
await tester.pump();
expect(find.text('Active'), findsOneWidget);
expect(find.text('Archived'), findsOneWidget);
});
testWidgets('renders project tile when project exists', (tester) async {
final project = Project(
id: 1,
name: 'My Project',
colorValue: 0xFF2563EB,
createdAt: DateTime(2026),
);
when(() => mockProjects.watchActive())
.thenAnswer((_) => Stream.value([project]));
await tester.pumpWidget(buildTestApp());
await tester.pump();
expect(find.byKey(const Key('project_tile_1')), findsOneWidget);
expect(find.text('My Project'), findsOneWidget);
});
testWidgets('tap Add opens project form sheet', (tester) async {
await tester.pumpWidget(buildTestApp());
await tester.pump();
await tester.tap(find.byIcon(Icons.add));
await tester.pumpAndSettle();
expect(find.byKey(const Key('project_name_field')), findsOneWidget);
});
}