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); }); }