uto_manager/test/widget_test.dart

80 lines
3.1 KiB
Dart

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_unit_repository.dart';
import 'package:uto_manager/presentation/screens/home_screen.dart';
void main() {
late AppDatabase db;
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);
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<UnitTreeCubit>.value(value: unitTreeCubit),
BlocProvider<PersonnelCubit>.value(value: personnelCubit),
BlocProvider<TemplateCubit>.value(value: templateCubit),
BlocProvider<ValidationCubit>.value(value: validationCubit),
],
child: const MaterialApp(home: HomeScreen()),
),
);
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);
});
}