Files
pikasTech-HWLAB/scripts/l6-cli-web-smoke.mjs
T
2026-05-22 07:17:33 +00:00

87 lines
3.3 KiB
JavaScript

#!/usr/bin/env node
import assert from "node:assert/strict";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { loadMvpGateSummary } from "../internal/mvp-gate/summary.mjs";
import { runCli } from "../tools/hwlab-cli/lib/cli.mjs";
import { gateSummary } from "../web/hwlab-cloud-web/gate-summary.mjs";
import { runCloudWebM3ReadonlyContract } from "../web/hwlab-cloud-web/scripts/m3-readonly-contract.mjs";
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
async function captureCli(args) {
let stdout = "";
let stderr = "";
const exitCode = await runCli(args, {
cwd: repoRoot,
stdout: {
write(chunk) {
stdout += chunk;
}
},
stderr: {
write(chunk) {
stderr += chunk;
}
}
});
return { exitCode, stdout, stderr };
}
const summary = loadMvpGateSummary(repoRoot);
assert.equal(summary.endpoint, "http://74.48.78.17:16667");
assert.deepEqual(
summary.milestones.map((item) => item.id),
["M0", "M1", "M2", "M3", "M4", "M5"]
);
const dryRun = await captureCli(["test", "e2e", "--env", "dev", "--mvp"]);
assert.equal(dryRun.exitCode, 0, dryRun.stderr);
const dryRunJson = JSON.parse(dryRun.stdout);
assert.equal(dryRunJson.mode, "dry-run");
assert.equal(dryRunJson.environment, "dev");
assert.equal(dryRunJson.endpoint, summary.endpoint);
assert.equal(dryRunJson.contractStatus.artifacts.count, 13);
assert.equal(dryRunJson.contractStatus.health.count, 14);
assert.equal(dryRunJson.contractStatus.topology.gatewaySessions, 2);
assert.equal(dryRunJson.contractStatus.topology.boxResources, 2);
assert.equal(dryRunJson.contractStatus.topology.patchPanelStatusId, "pps_m5-0001");
assert.equal(dryRunJson.contractStatus.agent.agentSessionId, "agt_m5-0001");
assert.equal(dryRunJson.contractStatus.evidence.records.length, 2);
assert.match(dryRunJson.statement, /no DEV\/PROD changes/);
const explicitDryRun = await captureCli(["test", "e2e", "--env", "dev", "--mvp", "--dry-run"]);
assert.equal(explicitDryRun.exitCode, 0, explicitDryRun.stderr);
assert.equal(JSON.parse(explicitDryRun.stdout).mode, "dry-run");
const liveBlocked = await captureCli([
"test",
"e2e",
"--env",
"dev",
"--mvp",
"--live",
"--confirm-dev",
"--confirmed-non-production"
]);
assert.equal(liveBlocked.exitCode, 2);
const liveBlockedJson = JSON.parse(liveBlocked.stderr);
assert.equal(liveBlockedJson.code, "BLOCKED");
assert.equal(liveBlockedJson.blockers[0].type, "runtime_blocker");
assert.equal(liveBlockedJson.blockers[0].scope, "db-live");
assert.ok(liveBlockedJson.blockers.some((blocker) => blocker.scope === "m3-hardware-loop-runtime"));
assert.equal(gateSummary.endpoint, summary.endpoint);
assert.equal(gateSummary.gateStatus, "blocked");
assert.equal(gateSummary.artifactCount, 13);
assert.equal(gateSummary.healthCount, 14);
assert.equal(gateSummary.gatewaySessionCount, 2);
assert.equal(gateSummary.boxResourceCount, 2);
assert.equal(gateSummary.topology.patchPanel.serviceId, "hwlab-patch-panel");
assert.equal(gateSummary.agent.agentServiceId, "hwlab-agent-mgr");
assert.equal(gateSummary.agent.workerServiceId, "hwlab-agent-worker");
assert.equal(gateSummary.evidenceRecords.length, 2);
runCloudWebM3ReadonlyContract();
console.log("L6 CLI/Web smoke passed: CLI and Web read the M0-M5 gate report and Cloud Web stays read-only for M3 diagnostics");