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:todo_app/features/todo/domain/entities/todo.dart'; import 'package:todo_app/features/todo/domain/repositories/todo_repository.dart'; import 'package:todo_app/features/todo/presentation/providers/todo_providers.dart'; import 'package:todo_app/features/todo/presentation/screens/todo_detail_screen.dart'; class MockTodoRepository extends Mock implements TodoRepository {} void main() { late MockTodoRepository repository; final testTodo = Todo( id: '1', title: 'Existing Todo', description: 'A description', priority: 'high', sortOrder: 0, createdAt: DateTime(2026, 1, 1), updatedAt: DateTime(2026, 1, 1), ); Widget createCreateWidget() { return ProviderScope( overrides: [ todoRepositoryProvider.overrideWithValue(repository), ], child: const MaterialApp( home: TodoDetailScreen(), ), ); } Widget createEditWidget() { return ProviderScope( overrides: [ todoRepositoryProvider.overrideWithValue(repository), ], child: const MaterialApp( home: TodoDetailScreen(todoId: '1'), ), ); } setUp(() { repository = MockTodoRepository(); }); group('Create mode', () { testWidgets('shows create form', (tester) async { await tester.pumpWidget(createCreateWidget()); await tester.pumpAndSettle(); expect(find.text('New Todo'), findsOneWidget); expect(find.text('Create Todo'), findsOneWidget); }); testWidgets('validates title is required', (tester) async { await tester.pumpWidget(createCreateWidget()); await tester.pumpAndSettle(); await tester.tap(find.text('Create Todo')); await tester.pumpAndSettle(); expect(find.text('Title is required'), findsOneWidget); }); }); group('Edit mode', () { testWidgets('loads existing todo data', (tester) async { when(() => repository.getTodo('1')).thenAnswer((_) async => testTodo); await tester.pumpWidget(createEditWidget()); await tester.pump(); await tester.pump(); expect(find.text('Edit Todo'), findsOneWidget); }); }); }