import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/estado/estado_alarmas.dart'; import 'package:pluriwave/modelos/alarma_musical.dart'; import 'package:pluriwave/servicios/servicio_alarmas.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../helpers/fakes_alarmas.dart'; /// fix/alarmas-fallos-silenciosos, item 3: "verify the alarm is actually /// registered, and say so if it is not". `android.programar` returning /// without throwing is not proof enough by itself -- this is the check that /// would have caught the reported case immediately (the native side can /// silently fail to persist the registration even when the channel call /// itself reports success). void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); test('guardarAlarma detecta que el conteo nativo no refleja la alarma ' 'guardada, aunque android.programar no haya lanzado', () async { // Fixed at 0 regardless of what programar() does internally -- // simulates the native side accepting the channel call but never // actually persisting the registration. final android = FakePuertoAlarmasAndroid()..alarmasNativasPendientes = 0; final estado = EstadoAlarmas( servicio: ServicioAlarmas(reloj: () => DateTime(2026, 5, 25, 7)), android: android, iniciarAutomaticamente: false, ); addTearDown(estado.dispose); addTearDown(android.dispose); await estado.guardarAlarma( const AlarmaMusical( id: 'silenciosa1', nombre: 'Diaria', hora: 7, minuto: 30, tipoProgramacion: TipoProgramacionAlarma.diaria, diasSemana: [], ), ); final excepcion = estado.ultimaExcepcionPara('silenciosa1'); expect(excepcion, isNotNull); expect(excepcion!.tipo, ExcepcionAlarma.tipoFalloProgramacion); expect(estado.error, isNotNull); }); test('guardarAlarma en el camino feliz (conteo nativo coincide) no registra ' 'fallo alguno', () async { final android = FakePuertoAlarmasAndroid(); final estado = EstadoAlarmas( servicio: ServicioAlarmas(reloj: () => DateTime(2026, 5, 25, 7)), android: android, iniciarAutomaticamente: false, ); addTearDown(estado.dispose); addTearDown(android.dispose); await estado.guardarAlarma( const AlarmaMusical( id: 'sana1', nombre: 'Diaria', hora: 7, minuto: 30, tipoProgramacion: TipoProgramacionAlarma.diaria, diasSemana: [], ), ); expect(estado.ultimaExcepcionPara('sana1'), isNull); expect(estado.error, isNull); }); }