diff --git a/extensions/qa-lab/src/artifact-assertion.ts b/extensions/qa-lab/src/artifact-assertion.ts new file mode 100644 index 000000000000..930a73cd89ba --- /dev/null +++ b/extensions/qa-lab/src/artifact-assertion.ts @@ -0,0 +1,18 @@ +import fs from "node:fs/promises"; +import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; +import { QaSuiteArtifactError } from "./errors.js"; + +export async function assertQaSuiteArtifactWritten( + kind: "evidence" | "report" | "summary", + filePath: string, +) { + try { + await fs.access(filePath); + } catch (error) { + throw new QaSuiteArtifactError( + `${kind}_missing`, + `QA suite did not produce ${kind} artifact at ${filePath}: ${formatErrorMessage(error)}`, + { cause: error }, + ); + } +} diff --git a/extensions/qa-lab/src/suite.ts b/extensions/qa-lab/src/suite.ts index 9915c722a14f..8905a860d40f 100644 --- a/extensions/qa-lab/src/suite.ts +++ b/extensions/qa-lab/src/suite.ts @@ -12,7 +12,7 @@ import { type QaReportScenario, } from "openclaw/plugin-sdk/qa-runtime"; import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime"; -import { QaSuiteArtifactError } from "./errors.js"; +import { assertQaSuiteArtifactWritten } from "./artifact-assertion.js"; import { buildQaSuiteEvidenceSummary, QA_EVIDENCE_FILENAME } from "./evidence-summary.js"; import { startQaGatewayChild, type QaCliBackendAuthMode } from "./gateway-child.js"; import type { @@ -884,21 +884,6 @@ async function writeQaSuiteArtifacts(params: { return { evidencePath, report, reportPath, summaryPath }; } -async function assertQaSuiteArtifactWritten( - kind: "evidence" | "report" | "summary", - filePath: string, -) { - try { - await fs.access(filePath); - } catch (error) { - throw new QaSuiteArtifactError( - `${kind}_missing`, - `QA suite did not produce ${kind} artifact at ${filePath}: ${formatErrorMessage(error)}`, - { cause: error }, - ); - } -} - function buildQaSuiteRuntimeMetrics(params: { startedAt: Date; finishedAt: Date; diff --git a/extensions/qa-lab/src/test-file-scenario-runner.ts b/extensions/qa-lab/src/test-file-scenario-runner.ts index 178beebbe78c..0fa38792af08 100644 --- a/extensions/qa-lab/src/test-file-scenario-runner.ts +++ b/extensions/qa-lab/src/test-file-scenario-runner.ts @@ -2,8 +2,8 @@ import { spawn } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; +import { assertQaSuiteArtifactWritten } from "./artifact-assertion.js"; import { isRepoRootRelativeRef, toRepoRelativePath } from "./cli-paths.js"; -import { QaSuiteArtifactError } from "./errors.js"; import { buildPlaywrightEvidenceSummary, buildScriptEvidenceSummary, @@ -542,22 +542,10 @@ async function writeTestFileEvidenceFile(params: { }): Promise> { const evidencePath = path.join(params.outputDir, QA_EVIDENCE_FILENAME); await fs.writeFile(evidencePath, `${JSON.stringify(params.evidence, null, 2)}\n`, "utf8"); - await assertQaTestFileArtifactWritten("evidence", evidencePath); + await assertQaSuiteArtifactWritten("evidence", evidencePath); return { evidencePath }; } -async function assertQaTestFileArtifactWritten(kind: "evidence", filePath: string) { - try { - await fs.access(filePath); - } catch (error) { - throw new QaSuiteArtifactError( - `${kind}_missing`, - `QA suite did not produce ${kind} artifact at ${filePath}: ${formatErrorMessage(error)}`, - { cause: error }, - ); - } -} - export async function runQaTestFileScenarios( params: QaTestFileScenarioRunParams, ): Promise {