import 'package:drift/native.dart'; import 'package:flutter_riverpod/flutter_riverpod.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/ui/providers/current_mission_provider.dart'; import 'package:dmc_app/ui/providers/database_provider.dart'; import 'package:dmc_app/ui/providers/mission_meta_provider.dart'; ProviderContainer _container() => ProviderContainer(overrides: [ appDatabaseProvider .overrideWithValue(AppDatabase.forTesting(NativeDatabase.memory())), ]); /// MissionMeta.switchSeq ist das Signal, mit dem FlyScreen einen echten /// Missionswechsel erkennt (System-Messages-Log + automatischer Upload, /// beides bewusst nur im Fly-Modus - siehe FlyScreen-Doku). Das Loggen /// selbst passiert dort, nicht hier: dieser Provider kennt den App-Modus /// nicht und darf deshalb ausserhalb des Fly-Modus (z.B. beim Planen) nicht /// unbedingt in den System-Messages-Log schreiben oder gar telemetryProvider /// mit hochziehen. void main() { test('startNewFromPlace() erhoeht switchSeq', () async { final container = _container(); addTearDown(container.dispose); await container.read(currentMissionMetaProvider.notifier).startNewFromPlace('Rotterdam'); expect(container.read(currentMissionMetaProvider).switchSeq, 1); expect(container.read(currentMissionMetaProvider).name, 'Rotterdam'); }); // loadMission() ruft zusaetzlich _fitMapToWaypoints() auf, das eine // tatsaechlich gerenderte FlutterMap braucht (MapController.fitCamera) - // in einem reinen Notifier-Test ohne Widget-Baum nicht moeglich. Wird // stattdessen vom widget_test.dart-Test "Missionswechsel im Fly-Modus // sendet die neue Route automatisch an den Flightcontroller" abgedeckt, // der loadMission() innerhalb einer echten AppShell/MissionMap aufruft. test( 'der erste Autosave einer neuen Mission erhoeht switchSeq NICHT ' '(id-Vergabe durch Autosave ist kein Wechsel)', () async { final container = _container(); addTearDown(container.dispose); await container.read(currentMissionMetaProvider.notifier).startNewFromPlace('Berlin'); final switchSeqAfterStart = container.read(currentMissionMetaProvider).switchSeq; container.read(currentMissionProvider.notifier).addWaypoint( const Waypoint(lat: 1, lon: 1, altitudeM: 60, speedMs: 15, catchRadiusM: 60), ); // Autosave debounced ueber 800ms (Doku 7.5) - echt abwarten statt zu // mocken, damit tatsaechlich der reale _flushNow()-Pfad getestet wird. await Future.delayed(const Duration(milliseconds: 900)); final meta = container.read(currentMissionMetaProvider); expect(meta.id, isNotNull, reason: 'Autosave sollte trotzdem eine id vergeben haben'); expect(meta.switchSeq, switchSeqAfterStart); }, timeout: const Timeout(Duration(seconds: 5)), ); }