diff --git a/lib/servicios/servicio_anuncios.dart b/lib/servicios/servicio_anuncios.dart index f5d9fdf..669400b 100644 --- a/lib/servicios/servicio_anuncios.dart +++ b/lib/servicios/servicio_anuncios.dart @@ -15,13 +15,28 @@ const _bannerAdUnitIdReal = 'ca-app-pub-6038935671414339/5658618378'; /// Real interstitial unit id, provisioned in the AdMob console (iap-freemium-unlock). const _interstitialAdUnitIdReal = 'ca-app-pub-6038935671414339/4189478248'; -/// Real id in release builds only; test id everywhere else (debug/profile, -/// including internal-testing-track builds run via `flutter run --release` -/// on a personal device — see the "never tap your own ads" note above). +/// TESTING-PHASE SWITCH. While `true`, release builds serve Google's official +/// TEST ad units instead of the real ones, so none of the closed-testing +/// human testers can generate invalid traffic against the AdMob account +/// (they cannot be registered as AdMob test devices). Flip to `false` for +/// the production release — that is the ONLY change needed to start serving +/// real ads. This does NOT affect the AdMob application id in +/// `AndroidManifest.xml`, which stays real in every build (it only +/// initializes the SDK and carries none of the click risk). +const usarAnunciosDePruebaEnRelease = true; + +/// Real id in release builds only, and only once [usarAnunciosDePruebaEnRelease] +/// is flipped to `false`; test id everywhere else (debug/profile, including +/// internal-testing-track builds run via `flutter run --release` on a +/// personal device — see the "never tap your own ads" note above). const bannerAdUnitId = - kReleaseMode ? _bannerAdUnitIdReal : bannerAdUnitIdPrueba; + kReleaseMode && !usarAnunciosDePruebaEnRelease + ? _bannerAdUnitIdReal + : bannerAdUnitIdPrueba; const interstitialAdUnitId = - kReleaseMode ? _interstitialAdUnitIdReal : interstitialAdUnitIdPrueba; + kReleaseMode && !usarAnunciosDePruebaEnRelease + ? _interstitialAdUnitIdReal + : interstitialAdUnitIdPrueba; /// Ads port + AdMob adapter (Design "Interfaces / Contracts", ADR-6): owns /// the entitlement gate for both surfaces, the interstitial's session diff --git a/test/servicios/servicio_anuncios_test.dart b/test/servicios/servicio_anuncios_test.dart index c5f192d..0c21790 100644 --- a/test/servicios/servicio_anuncios_test.dart +++ b/test/servicios/servicio_anuncios_test.dart @@ -161,6 +161,36 @@ void main() { }); }); + group('usarAnunciosDePruebaEnRelease — interruptor de fase de pruebas', () { + test('mientras esta en true, bannerAdUnitId e interstitialAdUnitId son los ' + 'ids oficiales de prueba de Google', () { + expect(usarAnunciosDePruebaEnRelease, isTrue); + expect(bannerAdUnitId, equals('ca-app-pub-3940256099942544/6300978111')); + expect( + interstitialAdUnitId, + equals('ca-app-pub-3940256099942544/1033173712'), + ); + }); + + test('los ids reales siguen presentes como constantes en el archivo (no se ' + 'pueden perder en un futuro edit)', () { + final source = + File('lib/servicios/servicio_anuncios.dart').readAsStringSync(); + expect( + source.contains("'ca-app-pub-6038935671414339/5658618378'"), + isTrue, + reason: 'el id real del banner debe seguir presente en el archivo', + ); + expect( + source.contains("'ca-app-pub-6038935671414339/4189478248'"), + isTrue, + reason: + 'el id real del interstitial debe seguir presente en el ' + 'archivo', + ); + }); + }); + group('debeMostrarBanner', () { test('free: true', () { final servicio = construir(