51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import { afterEach, describe, expect, it } from "vitest";
|
|
|
|
import { isCliOperationFailure, logCliCommand } from "../src/cliLogging.js";
|
|
import { silentLogger } from "../src/logger.js";
|
|
|
|
const originalExitCode = process.exitCode;
|
|
|
|
afterEach(() => {
|
|
process.exitCode = originalExitCode;
|
|
});
|
|
|
|
describe("CLI operation status", () => {
|
|
it.each([
|
|
["typed error", { error: "Analysis failed", category: "timeout" }],
|
|
["unhealthy diagnostic", { healthy: false, checks: [] }],
|
|
["failed status", { status: "failed" }],
|
|
["confirmation requirement", { status: "needs_confirmation" }],
|
|
["human remediation", { status: "needs_human" }],
|
|
["unapplied plan", { status: "planned" }],
|
|
])("classifies %s as failure", (_label, value) => {
|
|
expect(isCliOperationFailure(value)).toBe(true);
|
|
});
|
|
|
|
it.each([
|
|
["ready setup", { status: "ready" }],
|
|
["complete uninstall", { status: "complete" }],
|
|
["current version", { status: "current" }],
|
|
["completed upgrade", { status: "upgraded" }],
|
|
["healthy diagnostics", { healthy: true, checks: [] }],
|
|
["bounded evidence", { evidence: [{ truncated: true }] }],
|
|
])("keeps %s successful", (_label, value) => {
|
|
expect(isCliOperationFailure(value)).toBe(false);
|
|
});
|
|
|
|
it("sets a nonzero process status without replacing structured output", async () => {
|
|
const output = {
|
|
error: "Analysis failed",
|
|
category: "integrity_mismatch",
|
|
message: "Artifact integrity check failed.",
|
|
details: { logical_path: "main.js" },
|
|
};
|
|
|
|
await expect(
|
|
logCliCommand(silentLogger, "inventory-artifact", () =>
|
|
Promise.resolve(output),
|
|
),
|
|
).resolves.toBe(output);
|
|
expect(process.exitCode).toBe(1);
|
|
});
|
|
});
|