import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/modelos/alarma_musical.dart'; void main() { AlarmaMusical base({DateTime? snoozeHasta, DateTime? fechaUnica}) => AlarmaMusical( id: 'f1', nombre: 'Fechas', hora: 7, minuto: 30, tipoProgramacion: fechaUnica != null ? TipoProgramacionAlarma.unica : TipoProgramacionAlarma.diaria, diasSemana: const [], fechaUnica: fechaUnica, snoozeHasta: snoozeHasta, snoozeOrigen: snoozeHasta?.subtract(const Duration(minutes: 5)), ultimaEjecucionGestionada: snoozeHasta?.subtract( const Duration(minutes: 5), ), ); test('los instantes se serializan como UTC con offset explicito (Z)', () { // A local toIso8601String() carries no offset, so re-parsing it after a // device timezone change reinterprets the same wall fields as a // DIFFERENT instant (a snooze set in Madrid would shift hours after // landing in New York). Instants must round-trip offset-carrying. final snooze = DateTime(2026, 7, 13, 7, 10); final json = base(snoozeHasta: snooze).toJson(); expect((json['snoozeHasta'] as String).endsWith('Z'), isTrue); expect((json['snoozeOrigen'] as String).endsWith('Z'), isTrue); expect( (json['ultimaEjecucionGestionada'] as String).endsWith('Z'), isTrue, ); }); test('el round-trip de instantes preserva el instante exacto', () { final snooze = DateTime(2026, 7, 13, 7, 10); final recuperada = AlarmaMusical.fromJson(base(snoozeHasta: snooze).toJson()); expect(recuperada.snoozeHasta, snooze); expect( recuperada.snoozeOrigen, snooze.subtract(const Duration(minutes: 5)), ); }); test('los payloads legados sin offset siguen leyendose como hora local ' '(sin migracion)', () { final legado = base().toJson() ..['snoozeHasta'] = '2026-07-13T07:10:00.000'; final recuperada = AlarmaMusical.fromJson(legado); expect(recuperada.snoozeHasta, DateTime(2026, 7, 13, 7, 10)); }); test('fechaUnica sigue siendo fecha de pared: conserva y/m/d en local', () { final unica = DateTime(2026, 7, 13); final recuperada = AlarmaMusical.fromJson( base(fechaUnica: unica).toJson(), ); expect(recuperada.fechaUnica!.year, 2026); expect(recuperada.fechaUnica!.month, 7); expect(recuperada.fechaUnica!.day, 13); }); }