import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/estado/estado_entitlement.dart'; import 'package:pluriwave/servicios/servicio_anuncios.dart'; import 'package:pluriwave/widgets/banner_anuncio_superior.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// Ad-display spec "Persistent Top Banner, Never Overlapping Content": the /// banner is entitlement-aware and reserves layout via a `Column` /// (`SizedBox.shrink()` collapses it to zero footprint) — never a `Stack` /// overlay. AdMob's own `BannerAd.load()` cannot reach a real ad server in /// `flutter test` (no plugin channel registered), so it always resolves to /// "unloaded" here — exactly the same degrade-to-shrink path a genuine /// failed load takes in production (never a crash, never a placeholder). void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); Widget construir({required bool premium}) { return MultiProvider( providers: [ ChangeNotifierProvider( create: (_) { final estado = EstadoEntitlement(prefs: null); return estado; }, ), Provider( create: (_) => ServicioAnuncios(esPremium: () => premium), ), ], child: MaterialApp( home: Scaffold( body: Column( children: [ const BannerAnuncioSuperior(), const Expanded(child: Center(child: Text('contenido'))), ], ), ), ), ); } testWidgets( 'usuario free sin anuncio cargado: colapsa a SizedBox.shrink (nunca overlay)', (tester) async { await tester.pumpWidget(construir(premium: false)); await tester.pump(); await tester.pump(const Duration(milliseconds: 50)); final banner = find.byType(BannerAnuncioSuperior); expect(banner, findsOneWidget); // Collapsed to zero footprint (no ad ever loads in a widget test — no // AdMob plugin channel registered) — a `SizedBox.shrink()`, not an // overlay: the Column layout below it stays fully visible. expect(tester.getSize(banner).height, 0); expect(find.text('contenido'), findsOneWidget); }, ); testWidgets('usuario premium: nunca intenta mostrar el banner', ( tester, ) async { await tester.pumpWidget(construir(premium: true)); await tester.pump(); await tester.pump(const Duration(milliseconds: 50)); final banner = find.byType(BannerAnuncioSuperior); expect(tester.getSize(banner).height, 0); expect(find.text('contenido'), findsOneWidget); }); }