Files
pikasTech-HWLAB/tools/hwlab-cli/lib/cli.test.mjs
T
2026-05-23 18:41:34 +00:00

108 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import {
HWLAB_M3_IO_API_ROUTE,
HWLAB_M3_STATUS_API_ROUTE
} from "../../../skills/hwlab-agent-runtime/scripts/src/m3-io-skill-client.mjs";
import { runCli } from "./cli.mjs";
async function captureCli(args, options = {}) {
let stdout = "";
let stderr = "";
const exitCode = await runCli(args, {
cwd: options.cwd ?? process.cwd(),
env: options.env ?? {
PATH: process.env.PATH
},
requestJson: options.requestJson,
stdout: {
write(chunk) {
stdout += chunk;
}
},
stderr: {
write(chunk) {
stderr += chunk;
}
}
});
return { exitCode, stdout, stderr };
}
test("repo hwlab-cli m3 status uses Skill CLI and calls only HWLAB API /v1/m3/status", async () => {
const calls = [];
const result = await captureCli(
[
"m3",
"status",
"--api-base-url",
"http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667",
"--trace-id",
"trc_hwlab_cli_status"
],
{
requestJson: async (url, request) => {
calls.push({ url, request });
assert.equal(url, `http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667${HWLAB_M3_STATUS_API_ROUTE}`);
assert.equal(request.method, "GET");
return {
ok: true,
status: 200,
body: {
status: "live",
sourceKind: "DEV-LIVE",
traceId: "trc_hwlab_cli_status",
boxes: [{
id: "boxsimu_2",
resourceId: "res_boxsimu_2",
online: true,
ports: {
DI1: {
value: false
}
}
}]
}
};
}
}
);
assert.equal(result.exitCode, 0, result.stderr);
const body = JSON.parse(result.stdout);
assert.equal(body.route, HWLAB_M3_STATUS_API_ROUTE);
assert.equal(body.method, "GET");
assert.equal(body.readback.value, false);
assert.equal(body.command.includes("hwlab-cloud-api.hwlab-dev"), false);
assert.equal(calls.length, 1);
});
test("repo hwlab-cli m3 io blocks direct hardware targets before request", async () => {
const result = await captureCli(
[
"m3",
"io",
"--action",
"di.read",
"--api-base-url",
"http://hwlab-patch-panel.hwlab-dev.svc.cluster.local:7301",
"--trace-id",
"trc_hwlab_cli_direct_blocked"
],
{
requestJson: async () => {
throw new Error("direct hardware target must not be called");
}
}
);
assert.equal(result.exitCode, 2);
const body = JSON.parse(result.stderr);
assert.equal(body.route, HWLAB_M3_IO_API_ROUTE);
assert.equal(body.blocker.code, "direct_hardware_target_blocked");
assert.equal(body.hwlabApi.redactedUrl, null);
assert.equal(JSON.stringify(body).includes("patch-panel.hwlab-dev"), false);
});