import 'dart:async'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/modelos/dispositivo_audio.dart'; import 'package:pluriwave/servicios/servicio_dispositivo_audio.dart'; import '../helpers/fakes.dart'; /// Null (toggle-off) implementation that returns empty data without errors. /// Represents the behavior when `eqMultiDeviceEnabled` is false. class NullServicioDispositivoAudio extends ServicioDispositivoAudio { @override DispositivoAudio? get dispositivoActual => null; @override Stream get onDispositivoCambiado => const Stream.empty(); @override Future obtenerDispositivoActual() async { return const DispositivoAudio( id: 'builtin_speaker', tipo: TipoDispositivo.altavozInterno, nombre: 'Speaker', ); } @override Future dispose() async {} } void main() { group('Toggle-off path: NullServicioDispositivoAudio', () { late NullServicioDispositivoAudio servicio; setUp(() { servicio = NullServicioDispositivoAudio(); }); test('dispositivoActual is always null', () { expect(servicio.dispositivoActual, isNull); }); test('onDispositivoCambiado emits no events', () async { final received = []; final sub = servicio.onDispositivoCambiado.listen(received.add); await Future.delayed(const Duration(milliseconds: 10)); await sub.cancel(); expect(received, isEmpty); }); test('obtenerDispositivoActual returns fallback builtin_speaker', () async { final device = await servicio.obtenerDispositivoActual(); expect(device.id, 'builtin_speaker'); expect(device.tipo, TipoDispositivo.altavozInterno); }); test('dispose completes without error', () async { await expectLater(servicio.dispose(), completes); }); test('no platform channel code is invoked (fake, not real)', () async { // Verify that FakeServicioDispositivoAudio also produces no events // when no emitirDispositivo is called — simulating toggle-off behavior. final fake = FakeServicioDispositivoAudio(); final received = []; final sub = fake.onDispositivoCambiado.listen(received.add); await Future.delayed(const Duration(milliseconds: 10)); await sub.cancel(); expect(received, isEmpty); await fake.dispose(); }); }); }