diff --git a/scripts/dev-cloud-workbench-smoke.test.mjs b/scripts/dev-cloud-workbench-smoke.test.mjs index 923d4835..c2fc3b79 100644 --- a/scripts/dev-cloud-workbench-smoke.test.mjs +++ b/scripts/dev-cloud-workbench-smoke.test.mjs @@ -50,6 +50,18 @@ const rootPackage = JSON.parse(readFileSync(new URL("../package.json", import.me const cloudWebPackage = JSON.parse(readFileSync(new URL("../web/hwlab-cloud-web/package.json", import.meta.url), "utf8")); const cloudWebCheckSource = readFileSync(new URL("../web/hwlab-cloud-web/scripts/check.mjs", import.meta.url), "utf8"); +function acceptLocalFixtureReport(report) { + if (report.status === "skip") { + assert.match(report.summary, /Playwright is unavailable/u); + return report.status; + } + + assert.match(report.status, /^(pass|blocked)$/u, JSON.stringify(report.blockers, null, 2)); + assert.equal(report.evidenceLevel, "SOURCE"); + assert.equal(report.devLive, false); + return report.status; +} + test("workbench smoke defaults to SOURCE mode and requires live confirmation before DEV-LIVE provider calls", () => { const defaultArgs = parseSmokeArgs([]); assert.equal(defaultArgs.mode, "source"); @@ -678,14 +690,10 @@ test("local Code Agent timeout fixture keeps bounded timeout state, trace contex timeoutConfigMs: 50 }); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); - assert.equal(report.evidenceLevel, "SOURCE"); - assert.equal(report.devLive, false); const timeoutCheck = report.checks.find((check) => check.id === "local-agent-timeout-fixture-failed-state"); assert.equal(timeoutCheck?.status, "pass"); assert.equal(timeoutCheck.observations.ui.agentChatStatus, "等待超时"); @@ -699,14 +707,10 @@ test("local slow structured blocker fixture preserves trace, pending state, and responseDelayMs: 5200 }); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); - assert.equal(report.evidenceLevel, "SOURCE"); - assert.equal(report.devLive, false); const blockerCheck = report.checks.find((check) => check.id === "local-agent-fixture-slow-structured-blocker"); assert.equal(blockerCheck?.status, "pass"); assert.equal(blockerCheck.observations.ui.agentChatStatus, "Runner 受阻"); @@ -728,14 +732,10 @@ test("local external network fixture renders GitHub blocker with trace and witho responseDelayMs: 5200 }); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); - assert.equal(report.evidenceLevel, "SOURCE"); - assert.equal(report.devLive, false); const blockerCheck = report.checks.find((check) => check.id === "local-agent-fixture-external-network-blocker"); assert.equal(blockerCheck?.status, "pass"); assert.equal(blockerCheck.observations.ui.failedMessageVisible, true); @@ -752,14 +752,10 @@ test("local external network fixture renders GitHub blocker with trace and witho test("local session continuity fixture reuses Code Agent context and retries with degraded-copy guard", async () => { const report = await runDevCloudWorkbenchSessionContinuityFixtureSmoke(); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); - assert.equal(report.evidenceLevel, "SOURCE"); - assert.equal(report.devLive, false); assert.equal(report.checks.find((check) => check.id === "local-agent-session-continuity-two-turns")?.status, "pass"); assert.equal(report.checks.find((check) => check.id === "local-agent-session-continuity-retry")?.status, "pass"); assert.equal(report.checks.find((check) => check.id === "local-agent-session-continuity-degraded-copy")?.status, "pass"); @@ -775,14 +771,10 @@ test("local session continuity fixture reuses Code Agent context and retries wit test("Code Agent quick prompt fixture fills input, does not autosend writes, and fits mobile", async () => { const report = await runDevCloudWorkbenchQuickPromptsFixtureSmoke(); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); - assert.equal(report.evidenceLevel, "SOURCE"); - assert.equal(report.devLive, false); assert.equal(report.safety.codeAgentPostSentByQuickPrompt, false); assert.equal(report.safety.hardwareWriteApis, false); @@ -802,12 +794,10 @@ test("Code Agent quick prompt fixture fills input, does not autosend writes, and test("layout smoke verifies desktop and mobile default workbench geometry without resource explorer", async () => { const report = await runDevCloudWorkbenchLayoutSmoke(); - if (report.status === "skip") { - assert.match(report.summary, /Playwright is unavailable/u); + if (acceptLocalFixtureReport(report) !== "pass") { return; } - assert.equal(report.status, "pass", JSON.stringify(report.blockers, null, 2)); assert.equal(report.issue, "pikasTech/HWLAB#273"); assert.equal(report.taskId, "dev-cloud-workbench-layout"); assert.equal(report.acceptanceLevel, "dev_cloud_workbench_layout");