Files
pikasTech-HWLAB/web/hwlab-cloud-web/scripts/workbench-fixed-transactional-architecture.test.ts
T
2026-07-14 12:43:46 +02:00

76 lines
3.6 KiB
TypeScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
import { fileURLToPath } from "node:url";
const repositoryRoot = fileURLToPath(new URL("../../..", import.meta.url));
const requiredProductionIdentifiers = [
["internal/cloud/kafka-event-bridge.ts", "startLiveHwlabKafkaEventBridge"],
["internal/cloud/kafka-event-bridge.ts", "queryHwlabEventRetention"],
["internal/cloud/server-workbench-realtime-http.ts", "handleLiveKafkaWorkbenchRealtimeHttp"],
["internal/cloud/server-workbench-realtime-http.ts", "handleKafkaRefreshReplayWorkbenchRealtimeHttp"],
["web/hwlab-cloud-web/src/stores/workbench.ts", "applyLiveKafkaBusinessEvent"],
["web/hwlab-cloud-web/src/stores/workbench-event-reducer.ts", "hwlab.event.v1"],
["web/hwlab-cloud-web/src/utils/workbench-stream-transport.ts", "workbenchRealtimeTraceIdForCapabilities"]
] as const;
const forbiddenRepairIdentifiers = [
"handleWorkbenchSyncHttp",
"/v1/workbench/sync",
"scheduleSessionListRefresh",
"invalidateSessionList",
"fetchWorkbenchTurnStatus",
"refreshTurnStatusByTraceId",
"refreshMessageProjectionForTrace",
"forceRead",
"sealRestoredActiveTurnMessages",
"messageNeedsRestoredTurnSeal",
"refreshSessionStatusAuthority",
"readTerminalTraceDetailGaps"
];
const productionFiles = [
"internal/cloud/server-workbench-facts.ts",
"internal/cloud/server-workbench-realtime-http.ts",
"web/hwlab-cloud-web/src/stores/workbench.ts",
"web/hwlab-cloud-web/src/stores/workbench-colada-queries.ts"
];
test("Workbench production source fixes Kafka as the realtime and replay authority", async () => {
for (const [relativePath, identifier] of requiredProductionIdentifiers) {
const source = await readFile(`${repositoryRoot}/${relativePath}`, "utf8");
assert.ok(source.includes(identifier), `${relativePath} must contain ${identifier}`);
}
});
test("Workbench production source keeps HTTP repair and sync authority deleted", async () => {
const violations: string[] = [];
for (const relativePath of productionFiles) {
const source = await readFile(`${repositoryRoot}/${relativePath}`, "utf8");
for (const identifier of forbiddenRepairIdentifiers) if (source.includes(identifier)) violations.push(`${relativePath}: ${identifier}`);
}
assert.deepEqual(violations, []);
});
test("production deploy selects direct publish, live SSE and retention replay without transactional startup authority", async () => {
const deploySource = await readFile(`${repositoryRoot}/deploy/deploy.yaml`, "utf8");
for (const expected of [
"HWLAB_KAFKA_DIRECT_PUBLISH_ENABLED: \"true\"",
"HWLAB_WORKBENCH_LIVE_KAFKA_SSE_ENABLED: \"true\"",
"HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_ENABLED: \"true\"",
"HWLAB_KAFKA_TRANSACTIONAL_PROJECTOR_ENABLED: \"false\"",
"HWLAB_KAFKA_PROJECTION_OUTBOX_RELAY_ENABLED: \"false\"",
"HWLAB_WORKBENCH_PROJECTION_REALTIME_ENABLED: \"false\""
]) assert.ok(deploySource.includes(expected), `deploy must contain ${expected}`);
});
test("feature schema remains product-only and excludes architecture environment keys", async () => {
const schemaSource = await readFile(`${repositoryRoot}/config/feature-config.schema.json`, "utf8");
for (const name of [
"HWLAB_KAFKA_DIRECT_PUBLISH_ENABLED",
"HWLAB_WORKBENCH_LIVE_KAFKA_SSE_ENABLED",
"HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_ENABLED",
"HWLAB_KAFKA_TRANSACTIONAL_PROJECTOR_ENABLED",
"HWLAB_KAFKA_PROJECTION_OUTBOX_RELAY_ENABLED",
"HWLAB_WORKBENCH_PROJECTION_REALTIME_ENABLED"
]) assert.equal(schemaSource.includes(name), false, `${name} must not enter feature schema`);
});