import 'package:drift/native.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/domain/waypoint/flat_waypoint_list.dart'; import 'package:dmc_app/services/database/app_database.dart'; import 'package:dmc_app/services/database/mission_repository.dart'; void main() { late AppDatabase db; late MissionRepository repository; setUp(() { db = AppDatabase.forTesting(NativeDatabase.memory()); repository = MissionRepository(db); }); tearDown(() => db.close()); const waypoints = [ Waypoint(lat: 52.0, lon: 4.0, altitudeM: 60, speedMs: 15, catchRadiusM: 60), Waypoint( lat: 52.01, lon: 4.01, altitudeM: 80, speedMs: 18, catchRadiusM: 60, action: WaypointAction.loiter, ), ]; test('upsert ohne id legt eine neue Mission an', () async { final id = await repository.upsert( name: 'Amsterdam', placeName: 'Amsterdam', waypoints: waypoints, ); final loaded = await repository.load(id); expect(loaded, isNotNull); expect(loaded!.name, 'Amsterdam'); expect(loaded.placeName, 'Amsterdam'); expect(loaded.waypoints, hasLength(2)); expect(loaded.waypoints[1].action, WaypointAction.loiter); expect(loaded.waypoints[1].speedMs, 18); }); test('upsert mit bestehender id ueberschreibt statt zu duplizieren', () async { final id = await repository.upsert(name: 'Draft', waypoints: waypoints); await repository.upsert( id: id, name: 'Draft', waypoints: [waypoints.first], ); final summaries = await repository.watchSummaries().first; expect(summaries, hasLength(1)); expect(summaries.single.waypointCount, 1); }); test('rename aendert nur den Namen, nicht die Wegpunkte', () async { final id = await repository.upsert(name: 'Old name', waypoints: waypoints); await repository.rename(id, 'New name'); final loaded = await repository.load(id); expect(loaded!.name, 'New name'); expect(loaded.waypoints, hasLength(2)); }); test('delete entfernt die Mission aus der Liste', () async { final id = await repository.upsert(name: 'To delete', waypoints: waypoints); await repository.delete(id); final loaded = await repository.load(id); expect(loaded, isNull); expect(await repository.watchSummaries().first, isEmpty); }); test('load fuer unbekannte id liefert null', () async { expect(await repository.load(999), isNull); }); test('Windfelder werden mitgespeichert und wiederhergestellt', () async { const withWind = Waypoint( lat: 52.0, lon: 4.0, altitudeM: 60, speedMs: 15, catchRadiusM: 60, windSpeedMs: 5.5, windDirFromDeg: 210, windElevationM: 2, ); final id = await repository.upsert(name: 'Windy', waypoints: [withWind]); final loaded = await repository.load(id); expect(loaded!.waypoints.single.windSpeedMs, 5.5); expect(loaded.waypoints.single.windDirFromDeg, 210); expect(loaded.waypoints.single.windElevationM, 2); }); }