fix(qa): reject duplicate qa e2e outputs

This commit is contained in:
Vincent Koc
2026-06-23 13:34:20 +02:00
parent e856a24754
commit 7374ecc777
2 changed files with 27 additions and 4 deletions

View File

@@ -44,11 +44,17 @@ export function parseQaE2eArgs(argv: readonly string[]): QaE2eArgs {
const args = argv[0] === "--" ? argv.slice(1) : argv;
let outputPath = "";
let positionalMode = false;
const setOutputPath = (value: string) => {
if (outputPath) {
throw new Error("qa:e2e output path was provided more than once");
}
outputPath = value;
};
for (let index = 0; index < args.length; index += 1) {
const arg = args[index] ?? "";
if (positionalMode) {
if (!outputPath && arg.trim()) {
outputPath = arg.trim();
setOutputPath(arg.trim());
continue;
}
throw new Error(`Unexpected qa:e2e argument: ${arg}`);
@@ -65,7 +71,7 @@ export function parseQaE2eArgs(argv: readonly string[]): QaE2eArgs {
if (!inlineOutput) {
throw new Error("--output requires a value");
}
outputPath = inlineOutput;
setOutputPath(inlineOutput);
continue;
}
if (arg === "--output") {
@@ -73,7 +79,7 @@ export function parseQaE2eArgs(argv: readonly string[]): QaE2eArgs {
if (!value || value.startsWith("-")) {
throw new Error("--output requires a value");
}
outputPath = value;
setOutputPath(value);
index += 1;
continue;
}
@@ -83,7 +89,7 @@ export function parseQaE2eArgs(argv: readonly string[]): QaE2eArgs {
if (outputPath) {
throw new Error(`Unexpected qa:e2e argument: ${arg}`);
}
outputPath = arg.trim();
setOutputPath(arg.trim());
}
return outputPath ? { help: false, outputPath } : { help: false };
}

View File

@@ -95,6 +95,23 @@ describe("qa-e2e script", () => {
expect(() => parseQaE2eArgs(["--output", "--help"])).toThrow("--output requires a value");
});
it("rejects duplicate output destinations before loading QA Lab", async () => {
const env: NodeJS.ProcessEnv = {};
const loadRuntime = vi.fn(async () => {
throw new Error("runtime loaded");
});
expect(() =>
parseQaE2eArgs(["--output", ".artifacts/first.md", "--output=.artifacts/second.md"]),
).toThrow("qa:e2e output path was provided more than once");
await expect(
main([".artifacts/first.md", "--output", ".artifacts/second.md"], { env, loadRuntime }),
).rejects.toThrow("qa:e2e output path was provided more than once");
expect(loadRuntime).not.toHaveBeenCalled();
expect(env.OPENCLAW_BUILD_PRIVATE_QA).toBeUndefined();
});
it.each([
{ status: "pass" as const, exitCode: 0 },
{ status: "fail" as const, exitCode: 1 },