import 'package:drift/native.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:uto_manager/application/blocs/personnel_cubit.dart'; import 'package:uto_manager/application/blocs/template_cubit.dart'; import 'package:uto_manager/application/blocs/unit_tree_cubit.dart'; import 'package:uto_manager/application/blocs/validation_cubit.dart'; import 'package:uto_manager/domain/services/assignment_service.dart'; import 'package:uto_manager/domain/services/unit_tree_service.dart'; import 'package:uto_manager/infrastructure/database/app_database.dart'; import 'package:uto_manager/infrastructure/repositories/drift_personnel_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_position_slot_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_soldier_positions_repository.dart'; import 'package:uto_manager/infrastructure/repositories/drift_unit_repository.dart'; import 'package:uto_manager/presentation/screens/home_screen.dart'; void main() { late AppDatabase db; late DriftSoldierPositionsRepository positionsRepo; late UnitTreeCubit unitTreeCubit; late PersonnelCubit personnelCubit; late TemplateCubit templateCubit; late ValidationCubit validationCubit; setUp(() { // Use an in-memory SQLite database so no file I/O or pending timers. db = AppDatabase.forTesting(NativeDatabase.memory()); const treeService = UnitTreeService(); final unitRepo = DriftUnitRepository(dao: db.unitDao, db: db); final personnelRepo = DriftPersonnelRepository(dao: db.personnelDao); final slotRepo = DriftPositionSlotRepository(dao: db.positionSlotDao); positionsRepo = DriftSoldierPositionsRepository(dao: db.soldierPositionsDao); const assignmentService = AssignmentService(treeService: treeService); // Create cubits but do NOT call startWatching() — avoids live streams. unitTreeCubit = UnitTreeCubit( unitRepository: unitRepo, slotRepository: slotRepo, treeService: treeService, ); personnelCubit = PersonnelCubit( personnelRepository: personnelRepo, slotRepository: slotRepo, assignmentService: assignmentService, ); templateCubit = TemplateCubit( dao: db.templateDao, unitRepository: unitRepo, slotRepository: slotRepo, ); validationCubit = ValidationCubit(); }); tearDown(() async { await unitTreeCubit.close(); await personnelCubit.close(); await templateCubit.close(); await validationCubit.close(); await db.close(); }); testWidgets('UTO Manager app bar renders with title and icon', (tester) async { await tester.pumpWidget( MultiBlocProvider( providers: [ BlocProvider.value(value: unitTreeCubit), BlocProvider.value(value: personnelCubit), BlocProvider.value(value: templateCubit), BlocProvider.value(value: validationCubit), ], child: MaterialApp(home: HomeScreen(positionsRepository: positionsRepo)), ), ); await tester.pump(); expect(find.text('UTO Manager'), findsOneWidget); expect(find.text('U.S. Army 2026 Doctrine'), findsOneWidget); expect(find.byIcon(Icons.military_tech), findsOneWidget); }); }