90 lines
3 KiB
Dart
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);
|
|
});
|
|
}
|