import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get/get.dart'; import 'package:ertl_filament_verwaltung/controller/anwendung_controller.dart'; import 'package:ertl_filament_verwaltung/controller/bauteil_controller.dart'; import 'package:ertl_filament_verwaltung/controller/home_controller.dart'; import 'package:ertl_filament_verwaltung/helper/storage_keys.dart'; import 'package:ertl_filament_verwaltung/main.dart'; import 'package:ertl_filament_verwaltung/models/bauteil_model.dart'; import 'package:ertl_filament_verwaltung/models/kauf_filament_model.dart'; import 'package:ertl_filament_verwaltung/pages/anwendung_view.dart'; import 'package:ertl_filament_verwaltung/pages/bauteil_view.dart'; import 'package:ertl_filament_verwaltung/pages/export_view.dart'; import 'package:ertl_filament_verwaltung/pages/home_view.dart'; import 'package:ertl_filament_verwaltung/services/get_storage_services.dart'; import 'package:ertl_filament_verwaltung/widgets/bauteil_card.dart'; import 'package:ertl_filament_verwaltung/widgets/filament_card.dart'; import 'helpers/memory_storage_service.dart'; void main() { setUp(() { Get.testMode = true; final storage = MemoryStorageService(); storage.tables[StorageKeys.filamente] = [ KaufFilamentModel( filamentId: 'filament', kaufdatum: DateTime(2026), haendler: 'Ein Händler mit einem besonders langen Namen', marke: 'Eine besonders lange Filamentmarke', material: 'Benutzerdefiniertes Material mit langem Namen', preis: 12345.67, farbe: 'Ein lang beschriebener Farbton', gewicht: '1000', ).toJson(), ]; storage.tables[StorageKeys.bauteile] = [ BauteilModel( bauteilId: 'part', erstelltAm: DateTime(2026), name: 'Ein besonders lang benanntes Bauteil', verwendung: 'Eine ausführliche Beschreibung der Verwendung', druckdauerMinuten: 120, gewichtGramm: 40, abfallGramm: 10, filamente: [ const BauteilFilamentModel( filamentId: 'filament', verbrauchGramm: 50, ), ], ).toJson(), ]; Get.put(storage); }); tearDown(() => Get.reset()); Future resize(WidgetTester tester, double width) async { tester.view.physicalSize = Size(width, 640); await tester.pumpAndSettle(); expect(tester.takeException(), isNull, reason: 'Width $width'); } for (final route in [ HomeView.routeName, BauteilView.routeName, '${AnwendungView.routeName}/filament', ExportView.routeName, ]) { testWidgets( '$route survives resizing across desktop and narrow browser widths', (tester) async { tester.view.physicalSize = const Size(1280, 640); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); await tester.pumpWidget(const MyApp()); await tester.pumpAndSettle(); if (route != HomeView.routeName) { Get.toNamed(route); await tester.pumpAndSettle(); } if (route == BauteilView.routeName) { Get.find().toggleFilament('filament', true); } if (route.startsWith(AnwendungView.routeName)) { Get.find().sonstigesController.text = 'Entwurf'; } for (final width in [ 900.0, 899.0, 600.0, 360.0, 320.0, 240.0, 320.0, 1280.0, ]) { await resize(tester, width); expect(Get.currentRoute, route); if (route == HomeView.routeName || route == BauteilView.routeName) { final card = route == HomeView.routeName ? find.byType(FilamentCard) : find.byType(BauteilCard); final scroll = route == HomeView.routeName ? Get.find().pageScrollController : Get.find().scrollController; scroll.jumpTo(scroll.position.maxScrollExtent); await tester.pumpAndSettle(); expect(card, findsOneWidget); expect( tester.takeException(), isNull, reason: 'Card at width $width', ); scroll.jumpTo(0); await tester.pumpAndSettle(); } } if (route.startsWith(AnwendungView.routeName)) { expect( Get.find().sonstigesController.text, 'Entwurf', ); } if (route == BauteilView.routeName) { expect( Get.find().selectedFilamente, contains('filament'), ); } }, ); } }