import { expect, tap } from '@git.zone/tstest/tapbundle'; import { FritzMapper, type IFritzSnapshot } from '../../ts/integrations/fritz/index.js'; const snapshot: IFritzSnapshot = { connected: true, updatedAt: '2026-01-01T00:00:00.000Z', router: { host: '192.168.178.1', port: 49000, ssl: false, name: 'Home Fritz', model: 'FRITZ!Box 7590', serialNumber: 'AABBCCDDEEFF', macAddress: 'AA:BB:CC:DD:EE:FF', firmware: '8.02', latestFirmware: '8.03', updateAvailable: true, actions: ['reboot', 'reconnect', 'firmware_update'], }, devices: [ { mac: '11:22:33:44:55:66', name: 'Kitchen Phone', ipAddress: '192.168.178.45', connected: true, connectedTo: 'Repeater', connectionType: 'LAN', ssid: 'Home WiFi', wanAccess: true, }, ], interfaces: [ { name: 'wan', label: 'WAN', connected: true, rxBytes: 2_000_000_000, txBytes: 1_000_000_000, rxRateKbps: 125.5, txRateKbps: 42.5, }, ], connection: { connection: 'dsl', wanEnabled: true, ipv6Active: true, isConnected: true, isLinked: true, externalIp: '203.0.113.10', externalIpv6: '2001:db8::1', transmissionRate: [42_500, 125_500], maxBitRate: [50_000_000, 250_000_000], maxLinkedBitRate: [60_000_000, 300_000_000], noiseMargin: [80, 90], attenuation: [120, 130], bytesSent: 1_000_000_000, bytesReceived: 2_000_000_000, cpuTemperature: 56, }, sensors: {}, wifiNetworks: [ { index: 1, switchName: 'Main 2.4Ghz', ssid: 'Home WiFi', enabled: true, band: '2.4Ghz' }, ], portForwards: [ { index: 0, description: 'SSH', enabled: true, internalClient: '192.168.178.2', internalPort: 22, externalPort: 22, protocol: 'TCP', connectionType: 'WANIPConnection' }, ], callDeflections: [ { id: 1, enabled: false, type: 'fromNumber', number: '123', deflectionToNumber: '456', mode: 'eImmediately' }, ], update: { installedVersion: '8.02', latestVersion: '8.03', updateAvailable: true, releaseUrl: 'https://example.invalid/fritzos', }, actions: [ { target: 'service', action: 'set_guest_wifi_password' }, { target: 'service', action: 'dial' }, ], }; tap.test('maps FRITZ router, tracker equivalents, interfaces, traffic sensors, and controls', async () => { const normalized = FritzMapper.toSnapshot({ snapshot }); const devices = FritzMapper.toDevices(normalized); const entities = FritzMapper.toEntities(normalized); expect(devices.some((deviceArg) => deviceArg.id === 'fritz.router.aa_bb_cc_dd_ee_ff')).toBeTrue(); expect(devices.some((deviceArg) => deviceArg.id === 'fritz.client.11_22_33_44_55_66')).toBeTrue(); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_fritz_gb_received')?.state).toEqual(2); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_fritz_download_throughput')?.state).toEqual(125.5); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_fritz_wan_download')?.state).toEqual(2); expect(entities.find((entityArg) => entityArg.id === 'binary_sensor.kitchen_phone_connected')?.attributes?.nativePlatform).toEqual('device_tracker'); expect(entities.find((entityArg) => entityArg.id === 'switch.home_fritz_wi_fi_main_2_4ghz')?.state).toEqual('on'); expect(entities.find((entityArg) => entityArg.id === 'switch.kitchen_phone_internet_access')?.state).toEqual('on'); expect(entities.find((entityArg) => entityArg.id === 'button.kitchen_phone_wake_on_lan')?.available).toBeTrue(); expect(entities.find((entityArg) => entityArg.id === 'update.home_fritz_fritz_os')?.attributes?.latestVersion).toEqual('8.03'); }); tap.test('models only represented FRITZ commands safely', async () => { const normalized = FritzMapper.toSnapshot({ snapshot }); const rebootCommand = FritzMapper.commandForService(normalized, { domain: 'fritz', service: 'reboot', target: {}, }); const wifiCommand = FritzMapper.commandForService(normalized, { domain: 'switch', service: 'turn_off', target: { entityId: 'switch.home_fritz_wi_fi_main_2_4ghz' }, }); const wolCommand = FritzMapper.commandForService(normalized, { domain: 'button', service: 'press', target: { entityId: 'button.kitchen_phone_wake_on_lan' }, }); const serviceCommand = FritzMapper.commandForService(normalized, { domain: 'fritz', service: 'set_guest_wifi_password', target: {}, data: { password: 'safe-passphrase' }, }); const invalidGuestPassword = FritzMapper.commandForService(normalized, { domain: 'fritz', service: 'set_guest_wifi_password', target: {}, data: { password: 'short' }, }); expect(rebootCommand?.type).toEqual('router.action'); expect(wifiCommand?.action).toEqual('set_wifi_enabled'); expect(wifiCommand?.payload?.enabled).toBeFalse(); expect(wolCommand?.type).toEqual('client.action'); expect(wolCommand?.mac).toEqual('11:22:33:44:55:66'); expect(serviceCommand?.type).toEqual('service.action'); expect(invalidGuestPassword).toBeUndefined(); }); export default tap.start();