166 lines
4.8 KiB
JavaScript
166 lines
4.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import { createM3Topology } from "./fixture.mjs";
|
|
import { createWiringConfig } from "./model.mjs";
|
|
import { createPatchPanelRuntime } from "./runtime.mjs";
|
|
|
|
test("runtime applies config and delivers DO->DI through endpoint map", async () => {
|
|
const writes = [];
|
|
const runtime = createPatchPanelRuntime({
|
|
wiringConfig: createWiringConfig({
|
|
wiringConfigId: "wir_runtime_unit",
|
|
projectId: "prj_runtime_unit",
|
|
gatewaySessionId: "gws_runtime_unit",
|
|
connections: [
|
|
{
|
|
from: {
|
|
resourceId: "res_alpha",
|
|
port: "DO1"
|
|
},
|
|
to: {
|
|
resourceId: "res_beta",
|
|
port: "DI1"
|
|
},
|
|
mode: "exclusive"
|
|
}
|
|
],
|
|
now: "2026-01-01T00:00:00.000Z"
|
|
}),
|
|
endpointMap: {
|
|
res_beta: "http://127.0.0.1:7202"
|
|
},
|
|
now: () => "2026-01-01T00:00:01.000Z",
|
|
requestJson: async (url, body) => {
|
|
writes.push({ url, body });
|
|
return {
|
|
status: 200,
|
|
json: {
|
|
accepted: true
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
assert.equal(runtime.status().state, "active");
|
|
const result = await runtime.tick({
|
|
signals: [
|
|
{
|
|
fromResourceId: "res_alpha",
|
|
fromPort: "DO1",
|
|
value: true
|
|
}
|
|
]
|
|
});
|
|
|
|
assert.equal(result.accepted, true);
|
|
assert.equal(result.deliveryCount, 1);
|
|
assert.equal(writes.length, 1);
|
|
assert.equal(writes[0].url, "http://127.0.0.1:7202/internal/ports/write");
|
|
assert.deepEqual(writes[0].body, {
|
|
port: "DI1",
|
|
value: true,
|
|
source: "patch-panel",
|
|
sourceResourceId: "res_alpha",
|
|
sourcePort: "DO1",
|
|
propagatedBy: "hwlab-patch-panel",
|
|
observedAt: "2026-01-01T00:00:01.000Z"
|
|
});
|
|
assert.equal(runtime.evidenceSummary.configApplied, true);
|
|
assert.equal(runtime.evidenceSummary.tickCount, 1);
|
|
assert.equal(runtime.evidenceSummary.deliveryCount, 1);
|
|
});
|
|
|
|
test("runtime reports missing target endpoint as readable diagnostics", async () => {
|
|
const runtime = createPatchPanelRuntime({
|
|
wiringConfig: createWiringConfig({
|
|
wiringConfigId: "wir_runtime_missing_endpoint",
|
|
projectId: "prj_runtime_unit",
|
|
gatewaySessionId: "gws_runtime_unit",
|
|
connections: [
|
|
{
|
|
from: {
|
|
resourceId: "res_alpha",
|
|
port: "AO1"
|
|
},
|
|
to: {
|
|
resourceId: "res_beta",
|
|
port: "AI1"
|
|
},
|
|
mode: "exclusive"
|
|
}
|
|
],
|
|
now: "2026-01-01T00:00:00.000Z"
|
|
}),
|
|
endpointMap: {},
|
|
now: () => "2026-01-01T00:00:01.000Z",
|
|
requestJson: async () => {
|
|
throw new Error("requestJson should not be called without endpoint");
|
|
}
|
|
});
|
|
|
|
assert.equal(runtime.status().state, "faulted");
|
|
assert.ok(runtime.diagnostics().diagnostics.some((diagnostic) => diagnostic.code === "target_endpoint_missing"));
|
|
|
|
const result = await runtime.routeSignal({
|
|
fromResourceId: "res_alpha",
|
|
fromPort: "AO1",
|
|
value: 1.5
|
|
});
|
|
assert.equal(result.accepted, false);
|
|
assert.equal(result.deliveryCount, 1);
|
|
assert.ok(result.diagnostics.some((diagnostic) => diagnostic.code === "target_endpoint_missing"));
|
|
});
|
|
|
|
test("runtime applies first-class DEV M3 wiring config for res_boxsimu_1 DO1 to res_boxsimu_2 DI1", async () => {
|
|
const topology = createM3Topology();
|
|
const writes = [];
|
|
const runtime = createPatchPanelRuntime({
|
|
wiringConfig: topology.wiringConfig,
|
|
endpointMap: {
|
|
res_boxsimu_2: "http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201"
|
|
},
|
|
configSource: "env:HWLAB_PATCH_PANEL_WIRING_CONFIG",
|
|
now: () => "2026-05-21T00:00:01.000Z",
|
|
requestJson: async (url, body) => {
|
|
writes.push({ url, body });
|
|
return {
|
|
status: 200,
|
|
json: {
|
|
accepted: true
|
|
}
|
|
};
|
|
}
|
|
});
|
|
|
|
assert.equal(runtime.status().state, "active");
|
|
assert.equal(runtime.status().metadata.configSource, "env:HWLAB_PATCH_PANEL_WIRING_CONFIG");
|
|
assert.deepEqual(runtime.status().activeConnections, [
|
|
{
|
|
fromResourceId: "res_boxsimu_1",
|
|
fromPort: "DO1",
|
|
toResourceId: "res_boxsimu_2",
|
|
toPort: "DI1"
|
|
}
|
|
]);
|
|
|
|
const result = await runtime.routeSignal({
|
|
fromResourceId: "res_boxsimu_1",
|
|
fromPort: "DO1",
|
|
value: true
|
|
});
|
|
|
|
assert.equal(result.accepted, true);
|
|
assert.equal(result.propagatedBy, "hwlab-patch-panel");
|
|
assert.equal(result.deliveryCount, 1);
|
|
assert.equal(writes.length, 1);
|
|
assert.equal(
|
|
writes[0].url,
|
|
"http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201/internal/ports/write"
|
|
);
|
|
assert.equal(writes[0].body.port, "DI1");
|
|
assert.equal(writes[0].body.sourceResourceId, "res_boxsimu_1");
|
|
assert.equal(writes[0].body.sourcePort, "DO1");
|
|
assert.equal(writes[0].body.propagatedBy, "hwlab-patch-panel");
|
|
});
|