collabSupport/tests/paloalto.topology.test.js
jmcqueen 90a56c4640 Fix Prisma overlay tunnel discovery with site-scoped query_params.
Use topology/links and anynetlinks filters with eq/in operators so
store WAN follow-ups return real peer tunnels instead of unscoped dumps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 09:01:40 -04:00

97 lines
3.7 KiB
JavaScript

// tests/paloalto.topology.test.js
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import path from 'node:path';
import {
normalizeTunnelRow,
extractVpnLinkIdsFromAlarmInfo,
siteIdsFromTunnelRaw,
} from '../integrations/paloalto/topology.js';
import { normalizeWanInterfaceStatus } from '../integrations/paloalto/sites.js';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const FIX = path.join(__dirname, 'fixtures/prisma');
test('normalizeWanInterfaceStatus: fixture operational/admin up', () => {
const raw = JSON.parse(readFileSync(path.join(FIX, 'waninterface-status.json'), 'utf8'));
const s = normalizeWanInterfaceStatus(raw);
assert.equal(s.operationalUp, true);
assert.equal(s.adminUp, true);
assert.equal(s.elementId, 'el-fixture-1');
});
test('normalizeTunnelRow: topology link fixture', () => {
const topo = JSON.parse(readFileSync(path.join(FIX, 'topology-links.json'), 'utf8'));
const up = normalizeTunnelRow(topo.items[0], null, { localSiteId: 'site-A' });
assert.equal(up.id, 'topo-link-1');
assert.equal(up.up, true);
assert.equal(up.relatedInterfaceId, 'wi-mpls');
assert.equal(up.peerSiteId, 'site-HUB');
assert.match(up.peerLabel, /HUB/);
assert.deepEqual(up.vpnLinkIds, ['vpn-link-1']);
const down = normalizeTunnelRow(topo.items[1], null, { localSiteId: 'site-A' });
assert.equal(down.up, false);
assert.equal(down.relatedInterfaceId, 'wi-bb');
});
test('normalizeTunnelRow: merges vpnlink status', () => {
const status = JSON.parse(readFileSync(path.join(FIX, 'vpnlink-status.json'), 'utf8'));
const row = normalizeTunnelRow({ id: 'vpn-link-1', target_site_name: 'Hub' }, status);
assert.equal(row.up, true);
assert.equal(row.relatedInterfaceId, 'wi-mpls');
});
test('siteIdsFromTunnelRaw: ep1/ep2 style', () => {
const ids = siteIdsFromTunnelRaw({
id: 'x',
ep1_site_id: 'site-A',
ep2_site_id: 'site-HUB',
});
assert.deepEqual(ids.sort(), ['site-A', 'site-HUB'].sort());
});
test('normalizeTunnelRow: picks peer opposite local site', () => {
const row = normalizeTunnelRow({
id: 'vpn-1',
ep1_site_id: 'site-A',
ep2_site_id: 'site-HUB',
admin_up: true,
al_state: 'up',
}, null, { localSiteId: 'site-A' });
assert.equal(row.peerSiteId, 'site-HUB');
assert.equal(row.up, true);
});
test('normalizeTunnelRow: live vpnlink shape (al_id/vep, no site fields)', () => {
const vpn = JSON.parse(readFileSync(path.join(FIX, 'vpnlinks-by-al.json'), 'utf8')).items[0];
const row = normalizeTunnelRow(vpn, null, {
localSiteId: '16239359004050019',
peerSiteIdOverride: 'site-HUB',
peerLabelOverride: 'CG00001-HUB',
});
assert.equal(row.id, 'vpn-inet-1');
assert.equal(row.anynetId, 'al-hub-1');
assert.equal(row.peerLabel, 'CG00001-HUB');
assert.equal(row.vep1Id, 'vep-local-1');
assert.equal(siteIdsFromTunnelRaw(vpn).length, 0, 'live vpnlinks carry no site ids');
});
test('normalizeTunnelRow: anynetlink fixture has ep1/ep2 site endpoints', () => {
const al = JSON.parse(readFileSync(path.join(FIX, 'anynetlinks.json'), 'utf8')).items[0];
const ids = siteIdsFromTunnelRaw(al);
assert.ok(ids.includes('16239359004050019'));
assert.ok(ids.includes('site-HUB'));
const row = normalizeTunnelRow(al, null, { localSiteId: '16239359004050019' });
assert.equal(row.peerSiteId, 'site-HUB');
assert.equal(row.relatedInterfaceId, '16239359007870072');
assert.equal(row.adminUp, true);
});
test('extractVpnLinkIdsFromAlarmInfo: nested vpn_reasons', () => {
const info = JSON.parse(readFileSync(path.join(FIX, 'alarm-info-vpn.json'), 'utf8'));
assert.deepEqual(extractVpnLinkIdsFromAlarmInfo(info), ['vpn-link-2']);
});