import 'dart:ui' show Locale; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/l10n/gen/app_localizations.dart'; import 'package:pluriwave/modelos/alarma_musical.dart'; import 'package:pluriwave/servicios/servicio_alarmas_android.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const channel = MethodChannel('pluriwave/alarm_scheduler'); late List llamadas; setUp(() { llamadas = []; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (call) async { llamadas.add(call); if (call.method == 'scheduleAlarm') return true; return null; }); }); tearDown(() { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, null); }); test( 'configurarLocalizaciones pushes localized notification strings with {minutes} templates', () async { final servicio = ServicioAlarmasAndroid(channel: channel); final l10n = lookupAppLocalizations(const Locale('es')); servicio.configurarLocalizaciones(l10n); // configurarLocalizaciones fires setNotificationStrings as unawaited; let // the microtask/event queue drain so the MethodChannel call is recorded. await Future.delayed(Duration.zero); final llamada = llamadas.singleWhere( (c) => c.method == 'setNotificationStrings', ); final args = llamada.arguments as Map; expect( args['preNoticeTemplate'], contains('{minutes}'), reason: 'pre-notice template must keep the {minutes} placeholder', ); expect( args['snoozeCountdownTemplate'], contains('{minutes}'), reason: 'snooze countdown template must keep the {minutes} placeholder', ); expect( args['missedTemplate'], contains('{name}'), reason: 'missed template must keep the {name} placeholder', ); // Every notification/channel/chooser string must be present and non-empty // so the native side never falls back to English for a configured locale. const claves = [ 'ringTitle', 'snoozeLabel', 'stopLabel', 'skipLabel', 'snoozeAgainLabel', 'fireChannelName', 'fireChannelDescription', 'preNoticeChannelName', 'preNoticeChannelDescription', 'openFolderTitle', 'openRecordingTitle', 'recordingsRootTitle', 'missedTitle', ]; for (final clave in claves) { expect(args[clave], isA(), reason: '$clave missing'); expect( (args[clave] as String).isNotEmpty, isTrue, reason: '$clave is empty', ); } }, ); test('scheduleAlarm no longer carries notification string templates', () async { final servicio = ServicioAlarmasAndroid(channel: channel); final alarma = AlarmaMusical( id: 'no-template', nombre: 'Alarm', hora: 8, minuto: 30, tipoProgramacion: TipoProgramacionAlarma.diaria, diasSemana: const [], proximaEjecucion: DateTime(2099, 1, 2, 8, 30), ); await servicio.programar(alarma); final llamada = llamadas.singleWhere((c) => c.method == 'scheduleAlarm'); final args = llamada.arguments as Map; expect(args.containsKey('preNoticeTemplate'), isFalse); expect(args.containsKey('snoozeCountdownTemplate'), isFalse); }); }