44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
|
|
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();
|