diff --git a/test/estado/estado_ecualizador_test.dart b/test/estado/estado_ecualizador_test.dart index cdfac5b..34afa09 100644 --- a/test/estado/estado_ecualizador_test.dart +++ b/test/estado/estado_ecualizador_test.dart @@ -1319,6 +1319,64 @@ void main() { eq.dispose(); }, ); + + test( + '3.10 rename persists after re-pair — composed regression ' + '(closes bt-device-identity CRITICAL-1)', + () async { + final fakeDispositivo = FakeServicioDispositivoAudio(); + const btDevice = DispositivoAudio( + id: 'bt_a2dp:AA:BB:CC:DD:EE:FF', + tipo: TipoDispositivo.bluetoothA2dp, + nombre: 'AirPods Pro', + ); + const builtinSpeaker = DispositivoAudio( + id: 'builtin_speaker', + tipo: TipoDispositivo.altavozInterno, + nombre: 'Speaker', + ); + final eq = EstadoEcualizador( + audio: FakeServicioAudio(), + servicio: FakeServicioEcualizador(eqMultiDeviceEnabled: true), + dispositivoAudio: fakeDispositivo, + emisoraActualUuid: () => stationUuid, + ); + await eq.cargarPersistido(); + + // Connect: real-MAC id, first-seen bootstrap creates a preset entry. + fakeDispositivo.emitirDispositivo(btDevice); + await Future.delayed(const Duration(milliseconds: 50)); + final presetTrasConectar = eq.presetsDispositivo[btDevice.id]; + expect(presetTrasConectar, isNotNull); + + // Rename the device via the in-app edit dialog path. + await eq.renombrarDispositivo(btDevice.id, 'My Headphones'); + expect( + eq.nombreVisible(btDevice.id, eq.nombrePlataforma(btDevice.id)), + equals('My Headphones'), + ); + final cantidadTrasRenombrar = eq.presetsDispositivo.length; + + // Disconnect: platform reports the transient builtin_speaker fallback. + fakeDispositivo.emitirDispositivo(builtinSpeaker); + await Future.delayed(const Duration(milliseconds: 50)); + + // Re-pair: same physical device reconnects, reporting the SAME MAC. + fakeDispositivo.emitirDispositivo(btDevice); + await Future.delayed(const Duration(milliseconds: 50)); + + // No duplicate entry: presetsDispositivo did not grow. + expect(eq.presetsDispositivo.length, equals(cantidadTrasRenombrar)); + // The device's own preset entry survives untouched (not overwritten). + expect(eq.presetsDispositivo[btDevice.id], equals(presetTrasConectar)); + // Custom rename still wins over the re-cached platform name. + expect( + eq.nombreVisible(btDevice.id, eq.nombrePlataforma(btDevice.id)), + equals('My Headphones'), + ); + eq.dispose(); + }, + ); }); group('FakeServicioEcualizador — nombresDispositivos preservation (WARNING-3)', () {