diff --git a/test/basic/slice35-graph-perf-and-uid-uniqueness.basic.test.js b/test/basic/slice35-graph-perf-and-uid-uniqueness.basic.test.js new file mode 100644 index 0000000..7da587f --- /dev/null +++ b/test/basic/slice35-graph-perf-and-uid-uniqueness.basic.test.js @@ -0,0 +1,75 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const DashboardApi = require('../../src/specificClass.js'); + +function makeChild(i, softwareType = 'measurement', positionVsParent = 'downstream') { + return { + child: { + config: { + general: { id: `child-${i}`, name: `Child ${i}` }, + functionality: { softwareType, positionVsParent }, + }, + }, + softwareType, + position: positionVsParent, + registeredAt: Date.now(), + }; +} + +function makeRoot(children) { + const map = new Map(); + for (const c of children) map.set(c.child.config.general.id, c); + return { + config: { + general: { id: 'root-1', name: 'Root' }, + functionality: { softwareType: 'dashboardapi', positionVsParent: 'atequipment' }, + }, + childRegistrationUtils: { registeredChildren: map }, + }; +} + +test('generateDashboardsForGraph composes 50 children in <500ms', () => { + const api = new DashboardApi({}); + const children = Array.from({ length: 50 }, (_, i) => makeChild(i)); + const root = makeRoot(children); + + const t0 = process.hrtime.bigint(); + const dashboards = api.generateDashboardsForGraph(root, { includeChildren: true }); + const t1 = process.hrtime.bigint(); + + const durationMs = Number(t1 - t0) / 1e6; + assert.ok(durationMs < 500, `composition took ${durationMs.toFixed(1)}ms, expected <500ms`); + assert.ok(dashboards.length >= 1, 'should produce at least the root dashboard'); +}); + +test('uids are unique across all generated dashboards (no collision risk)', () => { + const api = new DashboardApi({}); + const children = Array.from({ length: 30 }, (_, i) => makeChild(i, 'measurement')); + const root = makeRoot(children); + const dashboards = api.generateDashboardsForGraph(root); + const uids = dashboards.map((d) => d.uid); + const unique = new Set(uids); + assert.equal(unique.size, uids.length, `expected ${uids.length} unique uids, got ${unique.size}`); +}); + +test('byte-identical composition under repeat (idempotency)', () => { + const api = new DashboardApi({}); + const children = Array.from({ length: 5 }, (_, i) => makeChild(i)); + const root = makeRoot(children); + const first = JSON.stringify(api.generateDashboardsForGraph(root).map((d) => d.dashboard)); + const second = JSON.stringify(api.generateDashboardsForGraph(root).map((d) => d.dashboard)); + assert.equal(first, second, 'two consecutive compositions should produce byte-identical JSON'); +}); + +test('root dashboard links to every child dashboard', () => { + const api = new DashboardApi({}); + const children = Array.from({ length: 4 }, (_, i) => makeChild(i)); + const root = makeRoot(children); + const dashboards = api.generateDashboardsForGraph(root); + const rootDash = dashboards[0].dashboard; + assert.ok(Array.isArray(rootDash.links), 'root dashboard should have links array'); + assert.equal(rootDash.links.length, 4, 'one link per registered child'); +});