67 lines
2.6 KiB
TypeScript
67 lines
2.6 KiB
TypeScript
|
|
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||
|
|
import { OpnsenseConfigFlow, createOpnsenseDiscoveryDescriptor, type IOpnsenseSnapshot } from '../../ts/integrations/opnsense/index.js';
|
||
|
|
|
||
|
|
const snapshot: IOpnsenseSnapshot = {
|
||
|
|
connected: true,
|
||
|
|
router: { name: 'Snapshot Firewall', macAddress: 'AA:BB:CC:DD:EE:FF' },
|
||
|
|
devices: [],
|
||
|
|
interfaces: [],
|
||
|
|
gateways: [],
|
||
|
|
firewall: {},
|
||
|
|
system: {},
|
||
|
|
telemetry: {},
|
||
|
|
services: [],
|
||
|
|
vpn: {},
|
||
|
|
sensors: {},
|
||
|
|
switches: [],
|
||
|
|
};
|
||
|
|
|
||
|
|
tap.test('matches and validates manual local HTTPS OPNsense candidates', async () => {
|
||
|
|
const descriptor = createOpnsenseDiscoveryDescriptor();
|
||
|
|
const matcher = descriptor.getMatchers()[0];
|
||
|
|
const result = await matcher.matches({
|
||
|
|
url: 'https://firewall.local:8443',
|
||
|
|
name: 'OPNsense Firewall',
|
||
|
|
model: 'OPNsense',
|
||
|
|
macAddress: 'AA-BB-CC-DD-EE-FF',
|
||
|
|
}, {});
|
||
|
|
|
||
|
|
expect(result.matched).toBeTrue();
|
||
|
|
expect(result.candidate?.integrationDomain).toEqual('opnsense');
|
||
|
|
expect(result.candidate?.port).toEqual(8443);
|
||
|
|
expect(result.normalizedDeviceId).toEqual('aa:bb:cc:dd:ee:ff');
|
||
|
|
expect(result.candidate?.metadata?.verifySsl).toBeFalse();
|
||
|
|
|
||
|
|
const validator = descriptor.getValidators()[0];
|
||
|
|
const validation = await validator.validate(result.candidate!, {});
|
||
|
|
expect(validation.matched).toBeTrue();
|
||
|
|
expect(validation.metadata?.liveHttpImplemented).toBeFalse();
|
||
|
|
});
|
||
|
|
|
||
|
|
tap.test('accepts snapshot-only setup and rejects non-HTTPS endpoints', async () => {
|
||
|
|
const descriptor = createOpnsenseDiscoveryDescriptor();
|
||
|
|
const matcher = descriptor.getMatchers()[0];
|
||
|
|
const snapshotResult = await matcher.matches({ snapshot }, {});
|
||
|
|
const httpResult = await matcher.matches({ url: 'http://firewall.local', name: 'OPNsense' }, {});
|
||
|
|
|
||
|
|
expect(snapshotResult.matched).toBeTrue();
|
||
|
|
expect(snapshotResult.confidence).toEqual('certain');
|
||
|
|
expect(httpResult.matched).toBeFalse();
|
||
|
|
expect(httpResult.reason).toInclude('HTTPS');
|
||
|
|
});
|
||
|
|
|
||
|
|
tap.test('builds OPNsense config flow output without claiming live HTTP support', async () => {
|
||
|
|
const flow = new OpnsenseConfigFlow();
|
||
|
|
const step = await flow.start({ source: 'manual', host: 'firewall.local', metadata: { trackerInterfaces: ['LAN'] } }, {});
|
||
|
|
const done = await step.submit!({ url: 'firewall.local', apiKey: 'key', apiSecret: 'secret', trackerInterfaces: 'LAN,WAN' });
|
||
|
|
|
||
|
|
expect(done.kind).toEqual('done');
|
||
|
|
expect(done.config?.url).toEqual('https://firewall.local');
|
||
|
|
expect(done.config?.ssl).toBeTrue();
|
||
|
|
expect(done.config?.verifySsl).toBeFalse();
|
||
|
|
expect(done.config?.trackerInterfaces).toEqual(['LAN', 'WAN']);
|
||
|
|
expect(done.config?.metadata?.liveHttpImplemented).toBeFalse();
|
||
|
|
});
|
||
|
|
|
||
|
|
export default tap.start();
|