import { expect, tap } from '@git.zone/tstest/tapbundle'; import { AdguardMapper, type IAdguardSnapshot } from '../../ts/integrations/adguard/index.js'; const snapshot: IAdguardSnapshot = { online: true, host: '192.168.1.2', port: 3000, name: 'Home DNS', status: { running: true, version: 'v0.107.45', protection_enabled: true, language: 'en', dns_port: 53, }, filtering: { enabled: true, filters: [ { id: 1, name: 'AdGuard DNS filter', url: 'https://example.test/filter.txt', enabled: false, rules_count: 1200 }, ], }, queryLog: { enabled: false, interval: 604800000, anonymize_client_ip: false, ignored: [], ignored_enabled: false, }, safebrowsing: { enabled: true }, safesearch: { enabled: false, google: true, youtube: true }, parental: { enabled: true, sensitivity: 13 }, stats: { num_dns_queries: 200, num_blocked_filtering: 50, num_replaced_parental: 3, num_replaced_safebrowsing: 4, num_replaced_safesearch: 5, avg_processing_time: 0.012345, }, update: { disabled: false, new_version: 'v0.107.46', announcement: 'AdGuard Home v0.107.46 is available.', announcement_url: 'https://github.com/AdguardTeam/AdGuardHome/releases/tag/v0.107.46', }, }; tap.test('maps AdGuard Home status, controls, update, and statistics sensors', async () => { const devices = AdguardMapper.toDevices(snapshot); const entities = AdguardMapper.toEntities(snapshot); expect(devices[0].id).toEqual('adguard.service.192_168_1_2_3000'); expect(devices[0].online).toBeTrue(); expect(entities.find((entityArg) => entityArg.id === 'switch.home_dns_protection')?.state).toEqual('on'); expect(entities.find((entityArg) => entityArg.id === 'switch.home_dns_query_log')?.state).toEqual('off'); expect(entities.find((entityArg) => entityArg.id === 'switch.home_dns_safe_browsing')?.state).toEqual('on'); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_dns_dns_queries')?.state).toEqual(200); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_dns_dns_queries_blocked_ratio')?.state).toEqual(25); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_dns_average_processing_speed')?.state).toEqual(12.35); expect(entities.find((entityArg) => entityArg.id === 'sensor.home_dns_rules_count')?.state).toEqual(1200); expect(entities.find((entityArg) => entityArg.id === 'update.home_dns')?.attributes?.latestVersion).toEqual('v0.107.46'); }); tap.test('models safe AdGuard service commands with validated payloads', async () => { const turnOffCommand = AdguardMapper.commandForService(snapshot, { domain: 'switch', service: 'turn_off', target: { entityId: 'switch.home_dns_protection' }, }); const enableUrlCommand = AdguardMapper.commandForService(snapshot, { domain: 'adguard', service: 'enable_url', target: {}, data: { url: 'https://example.test/filter.txt' }, }); const unsafeAddCommand = AdguardMapper.commandForService(snapshot, { domain: 'adguard', service: 'add_url', target: {}, data: { name: 'Bad', url: 'relative.txt' }, }); expect(Boolean(turnOffCommand && !('error' in turnOffCommand))).toBeTrue(); if (turnOffCommand && !('error' in turnOffCommand)) { expect(turnOffCommand.path).toEqual('/protection'); expect(turnOffCommand.payload).toEqual({ enabled: false }); } expect(Boolean(enableUrlCommand && !('error' in enableUrlCommand))).toBeTrue(); if (enableUrlCommand && !('error' in enableUrlCommand)) { expect(enableUrlCommand.path).toEqual('/filtering/set_url'); expect(enableUrlCommand.payload).toEqual({ url: 'https://example.test/filter.txt', whitelist: false, data: { name: 'AdGuard DNS filter', url: 'https://example.test/filter.txt', enabled: true }, }); } expect('error' in unsafeAddCommand!).toBeTrue(); }); export default tap.start();