import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/misc.dart' show Override; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:shuffle/app.dart'; import 'package:shuffle/core/l10n/app_locale.dart'; import 'package:shuffle/core/theme/app_theme.dart'; import 'package:shuffle/l10n/app_localizations.dart'; import 'fakes.dart'; /// Pumpt ein einzelnes Widget ([home]) oder einen eigenen [router] in eine /// Test-App mit AppTheme, l10n-Delegates, ProviderScope und fester [locale]. /// /// Genau eines von [home] und [router] ist anzugeben. Ohne [overrides] /// gelten [testOverrides] (feste AppConfig, Supabase-Mock). Gibt den /// [ProviderContainer] zurück, um Provider im Test zu lesen. Future pumpApp( WidgetTester tester, { Widget? home, GoRouter? router, Locale locale = const Locale('de'), List? overrides, ThemeMode themeMode = ThemeMode.light, double? textScale, bool settle = true, }) async { assert( (home == null) != (router == null), 'Entweder home oder router angeben.', ); final container = ProviderContainer.test( overrides: overrides ?? testOverrides(), ); Widget builder(BuildContext context, Widget? child) => textScale == null ? child! : MediaQuery( data: MediaQuery.of(context) .copyWith(textScaler: TextScaler.linear(textScale)), child: child!, ); const delegates = >[ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ]; final theme = AppTheme.light(); final darkTheme = AppTheme.dark(); await tester.pumpWidget( UncontrolledProviderScope( container: container, child: router != null ? MaterialApp.router( routerConfig: router, theme: theme, darkTheme: darkTheme, themeMode: themeMode, locale: locale, supportedLocales: AppLocalizations.supportedLocales, localizationsDelegates: delegates, localeResolutionCallback: (l, _) => resolveAppLocale(l), builder: builder, ) : MaterialApp( home: home, theme: theme, darkTheme: darkTheme, themeMode: themeMode, locale: locale, supportedLocales: AppLocalizations.supportedLocales, localizationsDelegates: delegates, localeResolutionCallback: (l, _) => resolveAppLocale(l), builder: builder, ), ), ); if (settle) await tester.pumpAndSettle(); return container; } /// Pumpt die echte [ShuffleApp] (inkl. Router) mit der Gerätesprache /// [deviceLocale]. Die Sprache wird nach dem Test automatisch zurückgesetzt. Future pumpShuffleApp( WidgetTester tester, { Locale deviceLocale = const Locale('en'), List? overrides, }) async { tester.platformDispatcher.localesTestValue = [deviceLocale]; addTearDown(tester.platformDispatcher.clearLocalesTestValue); final container = ProviderContainer.test( overrides: overrides ?? testOverrides(), ); await tester.pumpWidget( UncontrolledProviderScope(container: container, child: const ShuffleApp()), ); await tester.pumpAndSettle(); return container; }