fix(system): preserve MQTT interval draft editing

This commit is contained in:
DCCONSTRUCTIONS
2026-07-28 01:56:36 +03:00
parent d2964a0ddc
commit 65a72d40a8
4 changed files with 185 additions and 19 deletions
@@ -1,6 +1,7 @@
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import { test } from "node:test";
import ts from "typescript";
const sourceRoot = new URL("../src/", import.meta.url);
@@ -19,6 +20,7 @@ test("Worker 006 telemetry remains a bounded system feature slice", async () =>
telemetryPolling,
contourSettings,
contourContract,
pollIntervalContract,
telemetryStyles,
styles,
] = await Promise.all([
@@ -31,6 +33,7 @@ test("Worker 006 telemetry remains a bounded system feature slice", async () =>
read("core/system/useWorkerTelemetry.ts"),
read("components/system/ComputeContourSettingsWindow.tsx"),
read("core/system/computeContours.ts"),
read("core/system/telemetryPollInterval.ts"),
read("styles/system-telemetry.css"),
read("styles.css"),
]);
@@ -71,6 +74,49 @@ test("Worker 006 telemetry remains a bounded system feature slice", async () =>
assert.doesNotMatch(networkWorkspace, /8765/);
assert.match(contourSettings, /FieldFrame label="Операционная система"/);
assert.match(contourSettings, /label="Интервал MQTT"/);
assert.match(contourSettings, /value=\{telemetryPollIntervalDraft\}/);
assert.match(contourSettings, /onBlur=\{commitTelemetryPollInterval\}/);
assert.match(contourSettings, /event\.key === "Escape"/);
assert.doesNotMatch(
contourSettings,
/telemetry_poll_interval_seconds:\s*Number\(event\.currentTarget\.value\)/,
);
assert.match(contourContract, /telemetry_poll_interval_seconds: number/);
assert.match(pollIntervalContract, /MIN_TELEMETRY_POLL_INTERVAL_SECONDS\s*=\s*1/);
assert.match(telemetryPolling, /normalizeWorkerTelemetryPollMilliseconds/);
assert.match(styles, /system-telemetry\.css/);
});
test("MQTT polling interval keeps an unrestricted draft until explicit commit", async () => {
const source = await read("core/system/telemetryPollInterval.ts");
const javascript = ts.transpileModule(source, {
compilerOptions: {
module: ts.ModuleKind.ES2022,
target: ts.ScriptTarget.ES2022,
},
}).outputText;
const contract = await import(
`data:text/javascript;base64,${Buffer.from(javascript).toString("base64")}`
);
assert.equal(contract.parseTelemetryPollIntervalDraft(""), null);
assert.equal(contract.parseTelemetryPollIntervalDraft("0"), null);
assert.equal(contract.parseTelemetryPollIntervalDraft("0,1"), null);
assert.equal(contract.parseTelemetryPollIntervalDraft("0.1"), null);
assert.equal(contract.parseTelemetryPollIntervalDraft("1"), 1);
assert.equal(contract.parseTelemetryPollIntervalDraft("60"), 60);
assert.equal(contract.parseTelemetryPollIntervalDraft("61"), null);
assert.deepEqual(contract.resolveTelemetryPollIntervalDraft("", 3), {
accepted: false,
draft: "3",
seconds: 3,
});
assert.deepEqual(contract.resolveTelemetryPollIntervalDraft("01", 3), {
accepted: true,
draft: "1",
seconds: 1,
});
assert.equal(contract.normalizeWorkerTelemetryPollMilliseconds(100), 1_000);
assert.equal(contract.normalizeWorkerTelemetryPollMilliseconds(3_000), 3_000);
});