import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/servicios/servicio_anuncios.dart'; /// Ad-display spec: session-scoped interstitial frequency cap (max 2 per /// process lifetime, >=3 min apart), suppressed entirely for premium, and /// never shown when the caller reports the alarm-cap message took /// precedence for this same tap. void main() { ServicioAnuncios construir({ required DateTime Function() ahora, required bool premium, Future Function()? mostrarInterstitialImpl, }) => ServicioAnuncios( ahora: ahora, esPremium: () => premium, mostrarInterstitialImpl: mostrarInterstitialImpl ?? (() async => true), ); group('intentarInterstitial — cap de frecuencia', () { test('primeros 2 intentos en la sesion se muestran', () async { var ahora = DateTime(2026, 1, 1, 10, 0); final servicio = construir(ahora: () => ahora, premium: false); expect(await servicio.intentarInterstitial(), isTrue); ahora = ahora.add(const Duration(minutes: 5)); expect(await servicio.intentarInterstitial(), isTrue); }); test('un 3er intento en la misma sesion no se muestra (cap 2)', () async { var ahora = DateTime(2026, 1, 1, 10, 0); final servicio = construir(ahora: () => ahora, premium: false); await servicio.intentarInterstitial(); ahora = ahora.add(const Duration(minutes: 5)); await servicio.intentarInterstitial(); ahora = ahora.add(const Duration(minutes: 5)); expect(await servicio.intentarInterstitial(), isFalse); }); test('menos de 3 minutos desde el ultimo: no se muestra', () async { var ahora = DateTime(2026, 1, 1, 10, 0); final servicio = construir(ahora: () => ahora, premium: false); await servicio.intentarInterstitial(); ahora = ahora.add(const Duration(minutes: 1)); expect(await servicio.intentarInterstitial(), isFalse); }); test('exactamente 3 minutos despues si se muestra', () async { var ahora = DateTime(2026, 1, 1, 10, 0); final servicio = construir(ahora: () => ahora, premium: false); await servicio.intentarInterstitial(); ahora = ahora.add(const Duration(minutes: 3)); expect(await servicio.intentarInterstitial(), isTrue); }); test('premium: nunca muestra interstitial', () async { final servicio = construir( ahora: () => DateTime(2026, 1, 1, 10, 0), premium: true, ); expect(await servicio.intentarInterstitial(), isFalse); }); test( 'el conteo/temporizador solo avanza si el ad realmente se muestra', () async { final ahora = DateTime(2026, 1, 1, 10, 0); final servicio = construir( ahora: () => ahora, premium: false, mostrarInterstitialImpl: () async => false, ); final mostrado = await servicio.intentarInterstitial(); expect(mostrado, isFalse); // Un fallo de carga (mostrarInterstitialImpl -> false) no debe // consumir el cupo de la sesion. expect(await servicio.intentarInterstitial(), isFalse); }, ); }); group('debeMostrarBanner', () { test('free: true', () { final servicio = construir( ahora: () => DateTime(2026, 1, 1), premium: false, ); expect(servicio.debeMostrarBanner, isTrue); }); test('premium: false', () { final servicio = construir( ahora: () => DateTime(2026, 1, 1), premium: true, ); expect(servicio.debeMostrarBanner, isFalse); }); }); }