import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/l10n/gen/app_localizations.dart'; import 'package:pluriwave/pantallas/pantalla_bienvenida.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// WU17b: `PantallaBienvenida.mostrarSiProcede` wires the welcome screen /// into the genuine first-launch flow. WU17 built and tested the screen /// fully in isolation, but nothing in `lib/app.dart` or `lib/main.dart` /// ever referenced it — it was unreachable. These tests pin the actual /// gap: the screen must show on a genuine first launch and never again /// once `ServicioBienvenida` has recorded it as seen. Widget _appConDisparador(GlobalKey navigatorKey) { return MaterialApp( navigatorKey: navigatorKey, locale: const Locale('es'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Builder( builder: (context) => Scaffold( body: Center( child: ElevatedButton( onPressed: () => PantallaBienvenida.mostrarSiProcede(context), child: const Text('disparar'), ), ), ), ), ); } void main() { TestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'first launch (no seen flag persisted) shows the welcome screen', (tester) async { SharedPreferences.setMockInitialValues({}); final navigatorKey = GlobalKey(); await tester.pumpWidget(_appConDisparador(navigatorKey)); await tester.tap(find.text('disparar')); await tester.pumpAndSettle(); expect(find.byType(PantallaBienvenida), findsOneWidget); }, ); testWidgets( 'second launch (seen flag already persisted) does not show it again', (tester) async { SharedPreferences.setMockInitialValues({ 'pluri_bienvenida_vista_v1': true, }); final navigatorKey = GlobalKey(); await tester.pumpWidget(_appConDisparador(navigatorKey)); await tester.tap(find.text('disparar')); await tester.pumpAndSettle(); expect(find.byType(PantallaBienvenida), findsNothing); }, ); testWidgets('showing it once persists the flag so a later check in the same ' 'session skips it', (tester) async { SharedPreferences.setMockInitialValues({}); final navigatorKey = GlobalKey(); await tester.pumpWidget(_appConDisparador(navigatorKey)); await tester.tap(find.text('disparar')); await tester.pumpAndSettle(); expect(find.byType(PantallaBienvenida), findsOneWidget); // Dismiss it the same way the CTA does (a plain pop), simulating the // welcome screen being resolved before the next check ever happens. navigatorKey.currentState!.pop(); await tester.pumpAndSettle(); await tester.tap(find.text('disparar')); await tester.pumpAndSettle(); expect(find.byType(PantallaBienvenida), findsNothing); }); }