Files
integrations/test/bluetooth_le_tracker/test.bluetooth_le_tracker.mapper.node.ts
T

44 lines
1.9 KiB
TypeScript
Raw Normal View History

2026-05-05 18:45:46 +00:00
import { expect, tap } from '@git.zone/tstest/tapbundle';
import { BluetoothLeTrackerMapper } from '../../ts/integrations/bluetooth_le_tracker/index.js';
const lastSeen = Date.now();
const repeatedAdvertisements = Array.from({ length: 5 }, (_, indexArg) => ({
address: 'AA:BB:CC:DD:EE:FF',
name: indexArg === 4 ? 'Backpack Tag' : undefined,
rssi: -60 - indexArg,
battery: 87,
connectable: false,
time: lastSeen + indexArg,
}));
tap.test('maps tracked BLE advertisements into devices and device-tracker-like entities', async () => {
const snapshot = BluetoothLeTrackerMapper.toSnapshot({
trackNewDevices: true,
trackBattery: true,
advertisements: repeatedAdvertisements,
knownDevices: [{ mac: 'BLE_11:22:33:44:55:66', name: 'Ignored Beacon', track: false }],
});
const devices = BluetoothLeTrackerMapper.toDevices(snapshot);
const entities = BluetoothLeTrackerMapper.toEntities(snapshot);
expect(snapshot.devices.length).toEqual(1);
expect(snapshot.devices[0].address).toEqual('aa:bb:cc:dd:ee:ff');
expect(snapshot.devices[0].advertisementCount).toEqual(5);
expect(devices[0].id).toEqual('bluetooth_le_tracker.device.aa_bb_cc_dd_ee_ff');
expect(devices[0].metadata?.haMac).toEqual('BLE_AA:BB:CC:DD:EE:FF');
expect(entities.find((entityArg) => entityArg.uniqueId === 'bluetooth_le_tracker_presence_aa_bb_cc_dd_ee_ff')?.state).toEqual('on');
expect(entities.find((entityArg) => entityArg.uniqueId === 'bluetooth_le_tracker_state_aa_bb_cc_dd_ee_ff')?.state).toEqual('home');
expect(entities.find((entityArg) => entityArg.uniqueId === 'bluetooth_le_tracker_battery_aa_bb_cc_dd_ee_ff')?.state).toEqual(87);
});
tap.test('keeps new BLE devices untracked until the HA sighting threshold is reached', async () => {
const snapshot = BluetoothLeTrackerMapper.toSnapshot({
trackNewDevices: true,
advertisements: repeatedAdvertisements.slice(0, 4),
});
expect(snapshot.devices.length).toEqual(0);
});
export default tap.start();