test(devices): cover rename surviving a re-pair cycle end to end
The rename-priority and reconnect-dedup behaviors were each tested in isolation but never composed: connect, rename, disconnect, re-pair with the same MAC. Adds that regression test asserting no duplicate entry appears, the preset entry survives untouched, and the custom name still wins after reconnection.
This commit is contained in:
@@ -1319,6 +1319,64 @@ void main() {
|
|||||||
eq.dispose();
|
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<void>.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<void>.delayed(const Duration(milliseconds: 50));
|
||||||
|
|
||||||
|
// Re-pair: same physical device reconnects, reporting the SAME MAC.
|
||||||
|
fakeDispositivo.emitirDispositivo(btDevice);
|
||||||
|
await Future<void>.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)', () {
|
group('FakeServicioEcualizador — nombresDispositivos preservation (WARNING-3)', () {
|
||||||
|
|||||||
Reference in New Issue
Block a user