import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/app_mode/app_mode_cubit.dart'; import 'package:dmc_app/ui/app_shell.dart'; Widget _wrap(Widget child) => ProviderScope( child: BlocProvider( create: (_) => AppModeCubit(), child: MaterialApp(home: child), ), ); void main() { testWidgets('AppShell zeigt die Karte und den Plan/Fly-Umschalter im Startzustand', (tester) async { await tester.pumpWidget(_wrap(const AppShell())); // Nur ein Frame pumpen statt pumpAndSettle: TileLayer laedt echte // Netzwerk-Kacheln, die in der Testumgebung nie ankommen. await tester.pump(); expect(find.byType(FlutterMap), findsOneWidget); expect(find.text('Plan'), findsOneWidget); expect(find.text('Fly'), findsOneWidget); }); testWidgets( 'Fly-Button ohne erfuellten Ready-to-Fly-Gate zeigt Hinweis statt Absturz', (tester) async { await tester.pumpWidget(_wrap(const AppShell())); await tester.pump(); await tester.tap(find.text('Fly')); await tester.pump(); expect( find.text('Mission muss zuerst hochgeladen und verifiziert werden.'), findsOneWidget, ); // Weiterhin im Plan-Modus, da das Gate nicht erfuellt war. expect(find.byType(FlutterMap), findsOneWidget); }); }