# Tests — sf-app-platform Patrón estándar para los tests del monorepo. Cada package/module tiene su propia carpeta `test/`. ## Setup mínimo Todo package que vaya a tener tests debe agregar: ```yaml # pubspec.yaml dev_dependencies: flutter_test: sdk: flutter mocktail: ^1.0.4 ``` Y si va a consumir los helpers compartidos: ```yaml dependencies: # puede ir en dev_dependencies si solo se usa en tests sf_shared: path: ../../packages/sf_shared # ajustar ruta relativa ``` ## Helpers compartidos — `package:sf_shared/testing.dart` Se importan SOLO desde archivos `test/**`: ```dart import 'package:sf_shared/testing.dart'; ``` ### `pumpApp(tester, child:, overrides:, locale:)` Pone el widget bajo test dentro de `ProviderScope` + `MaterialApp` + `SFLocalizations`. ```dart testWidgets('my screen shows title', (tester) async { await pumpApp( tester, child: const MyScreen(), overrides: [ myRepositoryProvider.overrideWithValue(MockRepository()), ], ); expect(find.text('Title'), findsOneWidget); }); ``` ### `makeContainer(overrides:)` Para unit-testing de notifiers/providers sin widgets: ```dart test('controller emits AsyncError on failure', () async { final container = makeContainer( overrides: [ myRepositoryProvider.overrideWithValue(ThrowingRepository()), ], ); addTearDown(container.dispose); await container.read(myControllerProvider.notifier).submit(); expect(container.read(myControllerProvider).hasError, isTrue); }); ``` ## Mockeo de repositorios con mocktail ```dart class MockUsersRepository extends Mock implements UsersRepository {} void main() { late MockUsersRepository mockRepo; setUp(() { mockRepo = MockUsersRepository(); }); test('loads users happy path', () async { when(() => mockRepo.getUsers(userId: any(named: 'userId'))) .thenAnswer((_) async => [const UserEntity(...)]); // ... }); } ``` ## Correr tests ```bash # Todos los tests del package actual flutter test # Un archivo específico flutter test test/canary_test.dart # Con coverage flutter test --coverage ``` Para correr tests de un package del monorepo: ```bash cd modules/legacy/modules/account && flutter test ``` ## Convenciones - **1 archivo de test por archivo de producción** cuando sea posible (`foo_screen.dart` → `foo_screen_test.dart`). - **Happy path + ≥1 error path** por feature migrada (ver `sf-legacy-migration-checklist.md`). - **Golden tests** — no hay setup global todavía. Si una feature lo justifica, discutir antes. - **Mocks no autogenerados** — usamos mocktail con `Mock implements XRepository` en lugar de build_runner para mocks. ## Referencias - [mocktail docs](https://pub.dev/packages/mocktail) - [flutter_test docs](https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html) - `sf-legacy-migration-checklist.md` — plan de migración que consume estos helpers.