|
|
|
@@ -7,11 +7,7 @@ import {
|
|
|
|
|
classifyLiveDeploymentIdentity,
|
|
|
|
|
classifyLiveWebAssetIdentity,
|
|
|
|
|
parseSmokeArgs,
|
|
|
|
|
runDevCloudWorkbenchLayoutSmoke,
|
|
|
|
|
runDevCloudWorkbenchQuickPromptsFixtureSmoke,
|
|
|
|
|
runDevCloudWorkbenchSessionContinuityFixtureSmoke,
|
|
|
|
|
runDevCloudWorkbenchStaticSmoke,
|
|
|
|
|
runDevCloudWorkbenchTimeoutFixtureSmoke,
|
|
|
|
|
sanitizeAgentChatBody
|
|
|
|
|
} from "./src/dev-cloud-workbench-smoke-lib.mjs";
|
|
|
|
|
import {
|
|
|
|
@@ -22,10 +18,6 @@ import {
|
|
|
|
|
decideSmokeReportWrite,
|
|
|
|
|
smokeCliExitCode
|
|
|
|
|
} from "./dev-cloud-workbench-smoke.mjs";
|
|
|
|
|
import {
|
|
|
|
|
compactLayoutSmokeCliOutput,
|
|
|
|
|
parseLayoutSmokeArgs
|
|
|
|
|
} from "./dev-cloud-workbench-layout-smoke.mjs";
|
|
|
|
|
import { checkProfiles } from "./src/check-plan.mjs";
|
|
|
|
|
|
|
|
|
|
const sourceIdentity = Object.freeze({
|
|
|
|
@@ -90,7 +82,7 @@ test("source/default workbench report cannot claim DEV-LIVE and documents the co
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "code-agent-long-timeout-contract")?.status, "pass");
|
|
|
|
|
const traceDisclosure = report.checks.find((check) => check.id === "code-agent-trace-replay-disclosure");
|
|
|
|
|
assert.equal(traceDisclosure?.status, "pass");
|
|
|
|
|
assert.deepEqual(traceDisclosure?.evidence, ["显示全部可读事件 / 完整 trace 回放中", "复制 JSON", "下载 trace", "traceDetailsOpen", "traceScrollPositions", "internal scroll for full trace"]);
|
|
|
|
|
assert.deepEqual(traceDisclosure?.evidence, ["显示全部可读事件 / 完整 trace 回放中", "复制 JSON", "下载 trace", "traceDetailsOpen", "traceScrollPositions", "traceScrollPinnedToBottom", "internal scroll for full trace"]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("Code Agent browser failure classifier emits Chinese timeout/provider/browser categories with traceId", () => {
|
|
|
|
@@ -188,42 +180,6 @@ test("smoke args include a DOM-only live read-only mode", () => {
|
|
|
|
|
assert.equal(args.urlExplicit, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("smoke args include reusable layout-only browser mode", () => {
|
|
|
|
|
const local = parseSmokeArgs(["--layout"]);
|
|
|
|
|
assert.equal(local.mode, "layout");
|
|
|
|
|
assert.equal(local.urlExplicit, undefined);
|
|
|
|
|
|
|
|
|
|
const build = parseSmokeArgs(["--layout", "--build"]);
|
|
|
|
|
assert.equal(build.mode, "layout");
|
|
|
|
|
assert.equal(build.build, true);
|
|
|
|
|
|
|
|
|
|
const live = parseSmokeArgs(["--layout", "--url", "http://74.48.78.17:16666/"]);
|
|
|
|
|
assert.equal(live.mode, "layout");
|
|
|
|
|
assert.equal(live.url, "http://74.48.78.17:16666/");
|
|
|
|
|
assert.equal(live.urlExplicit, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("dedicated layout smoke CLI supports static build and DEV live shorthand", () => {
|
|
|
|
|
const local = parseLayoutSmokeArgs(["--static"]);
|
|
|
|
|
assert.equal(local.mode, "layout");
|
|
|
|
|
assert.equal(local.urlExplicit, undefined);
|
|
|
|
|
|
|
|
|
|
const build = parseLayoutSmokeArgs(["--build", "--report", "/tmp/hwlab-dev-gate/dev-cloud-workbench-layout.json"]);
|
|
|
|
|
assert.equal(build.mode, "layout");
|
|
|
|
|
assert.equal(build.build, true);
|
|
|
|
|
assert.equal(build.reportPath, "/tmp/hwlab-dev-gate/dev-cloud-workbench-layout.json");
|
|
|
|
|
|
|
|
|
|
const liveDefault = parseLayoutSmokeArgs(["--live"]);
|
|
|
|
|
assert.equal(liveDefault.mode, "layout");
|
|
|
|
|
assert.equal(liveDefault.url, "http://74.48.78.17:16666/");
|
|
|
|
|
assert.equal(liveDefault.urlExplicit, true);
|
|
|
|
|
|
|
|
|
|
const liveExplicit = parseLayoutSmokeArgs(["--live", "--url", "http://74.48.78.17:16666/"]);
|
|
|
|
|
assert.equal(liveExplicit.mode, "layout");
|
|
|
|
|
assert.equal(liveExplicit.url, "http://74.48.78.17:16666/");
|
|
|
|
|
assert.equal(liveExplicit.urlExplicit, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("source/default smoke covers #352 resource explorer removal contract", () => {
|
|
|
|
|
const report = runDevCloudWorkbenchStaticSmoke();
|
|
|
|
|
const check = report.checks.find((item) => item.id === "feedback-352-resource-explorer-removed");
|
|
|
|
@@ -236,7 +192,7 @@ test("source/default smoke covers Device Pod right-sidebar contract", () => {
|
|
|
|
|
const report = runDevCloudWorkbenchStaticSmoke();
|
|
|
|
|
const summary = report.checks.find((item) => item.id === "device-pod-summary-sidebar");
|
|
|
|
|
const events = report.checks.find((item) => item.id === "device-pod-event-stream");
|
|
|
|
|
const service = report.checks.find((item) => item.id === "device-pod-fake-service");
|
|
|
|
|
const service = report.checks.find((item) => item.id === "device-pod-executor-authority");
|
|
|
|
|
assert.equal(summary?.status, "pass");
|
|
|
|
|
assert.equal(events?.status, "pass");
|
|
|
|
|
assert.equal(service?.status, "pass");
|
|
|
|
@@ -539,221 +495,13 @@ test("Code Agent browser classifier blocks completed payloads without backend ev
|
|
|
|
|
assert.equal(classification.blocker, "untrusted-completion");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("local Code Agent timeout fixture keeps bounded timeout state, trace context, and retry input", async () => {
|
|
|
|
|
const report = await runDevCloudWorkbenchTimeoutFixtureSmoke({
|
|
|
|
|
responseDelayMs: 120,
|
|
|
|
|
timeoutConfigMs: 50
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (report.status === "skip") {
|
|
|
|
|
assert.match(report.summary, /Playwright is unavailable/u);
|
|
|
|
|
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, "等待超时");
|
|
|
|
|
assert.equal(timeoutCheck.observations.ui.traceHasTraceId, true);
|
|
|
|
|
assert.equal(timeoutCheck.observations.ui.retryInputPreserved, true);
|
|
|
|
|
assert.equal(timeoutCheck.observations.ui.completedMessageVisible, false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
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");
|
|
|
|
|
const continuity = report.checks.find((check) => check.id === "local-agent-session-continuity-two-turns")?.observations;
|
|
|
|
|
assert.equal(continuity.secondRequest.conversationId, continuity.firstRequest.conversationId);
|
|
|
|
|
assert.equal(continuity.secondRequest.sessionId, "ses_source_fixture_continuity");
|
|
|
|
|
assert.equal(continuity.secondRequest.threadId, "thread_source_fixture_continuity");
|
|
|
|
|
const retry = report.checks.find((check) => check.id === "local-agent-session-continuity-retry")?.observations;
|
|
|
|
|
assert.equal(retry.retryRequest.message, retry.failedRequest.message);
|
|
|
|
|
assert.equal(retry.retryRequest.sessionId, retry.failedRequest.sessionId);
|
|
|
|
|
assert.equal(retry.retryRequest.threadId, retry.failedRequest.threadId);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
const fill = report.checks.find((check) => check.id === "quick-prompts-fill-input");
|
|
|
|
|
const noAutosend = report.checks.find((check) => check.id === "quick-prompts-write-no-autosend");
|
|
|
|
|
const copy = report.checks.find((check) => check.id === "quick-prompts-copy-boundary");
|
|
|
|
|
const layout = report.checks.find((check) => check.id === "quick-prompts-mobile-layout");
|
|
|
|
|
assert.equal(fill?.status, "pass");
|
|
|
|
|
assert.equal(noAutosend?.status, "pass");
|
|
|
|
|
assert.equal(copy?.status, "pass");
|
|
|
|
|
assert.equal(layout?.status, "pass");
|
|
|
|
|
assert.equal(noAutosend.observations.every((item) => item.agentPostCountDelta === 0), true);
|
|
|
|
|
assert.equal(noAutosend.observations.every((item) => item.explicitSendRequired === true), true);
|
|
|
|
|
assert.equal(copy.observations.every((item) => item.copyBoundaryOk === true), true);
|
|
|
|
|
assert.equal(layout.observations.some((item) => item.viewport.width === 390 && item.layoutOk), true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
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");
|
|
|
|
|
assert.equal(report.sourceMode, "source-static");
|
|
|
|
|
assert.equal(report.evidenceLevel, "SOURCE");
|
|
|
|
|
assert.equal(report.devLive, false);
|
|
|
|
|
assert.equal(report.devPreconditions.status, "not_applicable");
|
|
|
|
|
assert.equal(report.localSmoke.commands.includes("npm run web:check"), true);
|
|
|
|
|
for (const command of [
|
|
|
|
|
"node --check scripts/dev-cloud-workbench-layout-smoke.mjs",
|
|
|
|
|
"npm run web:layout",
|
|
|
|
|
"npm run web:layout:build",
|
|
|
|
|
"npm run web:layout:live"
|
|
|
|
|
]) {
|
|
|
|
|
assert.equal(report.validationCommands.includes(command), true, `missing ${command}`);
|
|
|
|
|
}
|
|
|
|
|
for (const id of [
|
|
|
|
|
"layout-desktop-default",
|
|
|
|
|
"layout-narrow-desktop-default",
|
|
|
|
|
"layout-mobile-default",
|
|
|
|
|
"layout-feedback-352-resource-explorer-removed",
|
|
|
|
|
"layout-feedback-437-live-build-overlay",
|
|
|
|
|
"layout-left-sidebar-collapse",
|
|
|
|
|
"layout-gate-desktop",
|
|
|
|
|
"layout-gate-narrow-desktop",
|
|
|
|
|
"layout-gate-mobile"
|
|
|
|
|
]) {
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === id)?.status, "pass", id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.deepEqual(
|
|
|
|
|
report.viewports.map((viewport) => `${viewport.width}x${viewport.height}`),
|
|
|
|
|
["1366x768", "1024x768", "390x844"]
|
|
|
|
|
);
|
|
|
|
|
assert.equal(Array.isArray(report.failures), true);
|
|
|
|
|
assert.equal(Array.isArray(report.skipped), true);
|
|
|
|
|
assert.equal(report.artifacts.reportPath, null);
|
|
|
|
|
assert.match(report.reportLifecycle.summary, /cannot be used as DEV-LIVE evidence/u);
|
|
|
|
|
assert.match(report.devPreconditions.summary, /not required for SOURCE\/static gates/u);
|
|
|
|
|
assert.equal(report.safety.hitTestMethod.includes("elementsFromPoint"), true);
|
|
|
|
|
assert.match(report.safety.statement, /does not send Code Agent chat, call Device Pod or hardware write APIs/u);
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-device-pod-summary-sidebar")?.status, "pass");
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-device-pod-event-stream")?.status, "pass");
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-device-pod-detail-dialog")?.status, "pass");
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-feedback-352-resource-explorer-removed")?.status, "pass");
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-feedback-437-live-build-overlay")?.status, "pass");
|
|
|
|
|
assert.equal(report.checks.find((check) => check.id === "layout-issue-288-future-single-table-gate")?.status, "skip");
|
|
|
|
|
|
|
|
|
|
const desktopDefault = report.checks.find((check) => check.id === "layout-desktop-default")?.observations;
|
|
|
|
|
const resourceExplorerRemoval = report.checks.find((check) => check.id === "layout-feedback-352-resource-explorer-removed")?.observations;
|
|
|
|
|
assert.equal(resourceExplorerRemoval.forbiddenSelectors.includes("#explorer-resize"), true);
|
|
|
|
|
assert.equal(resourceExplorerRemoval.forbiddenCopy.includes("常用能力"), true);
|
|
|
|
|
assert.equal(resourceExplorerRemoval.coverage.desktop.covered, true);
|
|
|
|
|
assert.equal(resourceExplorerRemoval.coverage.mobile.removedVisibleCopyAbsent, true);
|
|
|
|
|
assert.equal(desktopDefault.removedSelectorsAbsent, true);
|
|
|
|
|
assert.equal(desktopDefault.removedVisibleCopyAbsent, true);
|
|
|
|
|
assert.equal(desktopDefault.resourceExplorerRemovalGuard, true);
|
|
|
|
|
assert.equal(desktopDefault.keyTargetsReachable, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.summaryOk, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.noInternalDisclosure, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.noLegacySelectors, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.detailDialogOk, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.eventStreamOk, true);
|
|
|
|
|
assert.equal(desktopDefault.devicePod.summaryTileCount >= 2, true);
|
|
|
|
|
assert.equal(desktopDefault.noHorizontalOverflow.right, true);
|
|
|
|
|
assert.equal(desktopDefault.liveBuildLayout.overlayPositioned, true);
|
|
|
|
|
assert.equal(desktopDefault.liveBuildLayout.dialogVisible, true);
|
|
|
|
|
assert.equal(desktopDefault.liveBuildLayout.dialogViewportContained, true);
|
|
|
|
|
assert.equal(desktopDefault.liveBuildLayout.stableGeometry, true);
|
|
|
|
|
assert.equal(desktopDefault.liveBuildLayout.closedByButton, true);
|
|
|
|
|
assert.equal(Object.hasOwn(desktopDefault.boxes.shell, "text"), false);
|
|
|
|
|
assert.equal(Object.hasOwn(desktopDefault.semanticOverlapChecks[0].boxes[".right-sidebar"], "text"), false);
|
|
|
|
|
assert.equal(desktopDefault.failures.length, 0);
|
|
|
|
|
assert.equal(desktopDefault.semanticOverlapChecks.every((check) => !check.overlaps), true);
|
|
|
|
|
assert.equal(desktopDefault.overflowChecks.every((check) => check.ok), true);
|
|
|
|
|
|
|
|
|
|
const mobileDefault = report.checks.find((check) => check.id === "layout-mobile-default")?.observations;
|
|
|
|
|
assert.equal(mobileDefault.removedSelectorsAbsent, true);
|
|
|
|
|
assert.equal(mobileDefault.removedVisibleCopyAbsent, true);
|
|
|
|
|
assert.equal(mobileDefault.resourceExplorerRemovalGuard, true);
|
|
|
|
|
assert.equal(mobileDefault.keyTargetsReachable, true);
|
|
|
|
|
assert.equal(mobileDefault.devicePod.summaryOk, true);
|
|
|
|
|
assert.equal(mobileDefault.devicePod.noInternalDisclosure, true);
|
|
|
|
|
assert.equal(mobileDefault.devicePod.noLegacySelectors, true);
|
|
|
|
|
assert.equal(mobileDefault.devicePod.detailDialogOk, true);
|
|
|
|
|
assert.equal(mobileDefault.devicePod.eventStreamOk, true);
|
|
|
|
|
assert.equal(mobileDefault.noHorizontalOverflow.right, true);
|
|
|
|
|
assert.equal(mobileDefault.liveBuildLayout.overlayPositioned, true);
|
|
|
|
|
assert.equal(mobileDefault.liveBuildLayout.dialogVisible, true);
|
|
|
|
|
assert.equal(mobileDefault.liveBuildLayout.dialogViewportContained, true);
|
|
|
|
|
assert.equal(mobileDefault.liveBuildLayout.stableGeometry, true);
|
|
|
|
|
|
|
|
|
|
const leftCollapse = report.checks.find((check) => check.id === "layout-left-sidebar-collapse")?.observations;
|
|
|
|
|
assert.equal(leftCollapse.status, "pass");
|
|
|
|
|
assert.equal(leftCollapse.coverage.desktop.widthReclaimed, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage["narrow-desktop"].widthReclaimed, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage.mobile.widthReclaimed, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage.desktop.collapsed.keyTargetsReachable, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage.mobile.collapsed.keyTargetsReachable, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage.desktop.restoredCollapsed.collapsed, true);
|
|
|
|
|
assert.equal(leftCollapse.coverage.mobile.expanded.routeButtonsVisible, true);
|
|
|
|
|
|
|
|
|
|
const compact = compactLayoutSmokeCliOutput(report);
|
|
|
|
|
assert.equal(compact.status, "pass");
|
|
|
|
|
assert.equal(compact.artifacts.screenshotCount >= 18, true);
|
|
|
|
|
assert.equal(compact.failures.length, 0);
|
|
|
|
|
assert.equal(compact.blockers.length, 0);
|
|
|
|
|
assert.equal(JSON.stringify(compact).includes('"checks"'), false);
|
|
|
|
|
assert.equal(JSON.stringify(compact).includes('"boxes"'), false);
|
|
|
|
|
assert.equal(JSON.stringify(compact).includes('"text"'), false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("repo-owned web checks expose source build and DEV live layout smoke gates", () => {
|
|
|
|
|
test("repo-owned web checks keep cloud-web semantic checks out of old browser gates", () => {
|
|
|
|
|
const checkCommands = checkProfiles.check.map((task) => task.command.join(" "));
|
|
|
|
|
assert.match(rootPackage.scripts["web:check"], /cd web\/hwlab-cloud-web && bun run check/u);
|
|
|
|
|
assert.match(rootPackage.scripts["web:check"], /bun test web\/hwlab-cloud-web\/message-markdown\.test\.ts/u);
|
|
|
|
|
assert.equal(
|
|
|
|
|
rootPackage.scripts["web:layout"],
|
|
|
|
|
"node scripts/dev-cloud-workbench-layout-smoke.mjs --static --report /tmp/hwlab-dev-gate/dev-cloud-workbench-layout.json"
|
|
|
|
|
);
|
|
|
|
|
assert.equal(
|
|
|
|
|
rootPackage.scripts["web:layout:build"],
|
|
|
|
|
"node scripts/dev-cloud-workbench-layout-smoke.mjs --build --report /tmp/hwlab-dev-gate/dev-cloud-workbench-layout-build.json"
|
|
|
|
|
);
|
|
|
|
|
assert.equal(
|
|
|
|
|
rootPackage.scripts["web:layout:live"],
|
|
|
|
|
"node scripts/dev-cloud-workbench-layout-smoke.mjs --live --url http://74.48.78.17:16666/ --report /tmp/hwlab-dev-gate/dev-cloud-workbench-layout-live.json"
|
|
|
|
|
);
|
|
|
|
|
assert.ok(checkCommands.some((command) => command === "node --check scripts/dev-cloud-workbench-layout-smoke.mjs"));
|
|
|
|
|
assert.match(cloudWebPackage.scripts.check, /bun test && bun run scripts\/check\.ts/u);
|
|
|
|
|
assert.ok(checkProfiles.check.some((task) => task.cwd === "web/hwlab-cloud-web" && task.command.join(" ") === "bun run check"));
|
|
|
|
|
assert.doesNotMatch(checkCommands.join("\n"), /gate-summary\.mjs|export-web-gate-summary/u);
|
|
|
|
|
assert.equal(cloudWebPackage.scripts.layout.includes("--static"), true);
|
|
|
|
|
assert.equal(cloudWebPackage.scripts["layout:build"].includes("--build"), true);
|
|
|
|
|
assert.equal(cloudWebPackage.scripts["layout:live"].includes("--live --url http://74.48.78.17:16666/"), true);
|
|
|
|
|
assert.match(cloudWebCheckSource, /runJavaScriptSyntaxCheck/u);
|
|
|
|
|
assert.doesNotMatch(checkCommands.join("\n"), /dev-cloud-workbench-layout-smoke|gate-summary\.mjs|export-web-gate-summary/u);
|
|
|
|
|
assert.match(cloudWebCheckSource, /assertTraceHelpersBound/u);
|
|
|
|
|
assert.match(cloudWebCheckSource, /Device Pod summary sidebar/u);
|
|
|
|
|
assert.match(cloudWebCheckSource, /device-detail-dialog/u);
|
|
|
|
|
assert.match(cloudWebCheckSource, /device-event-text/u);
|
|
|
|
|