diff --git a/packages/webui/test/browser/account-login.spec.mjs b/packages/webui/test/browser/account-login.spec.mjs index 4646c589..514da59f 100644 --- a/packages/webui/test/browser/account-login.spec.mjs +++ b/packages/webui/test/browser/account-login.spec.mjs @@ -48,9 +48,18 @@ test(`usage hover keeps the subscription label stable during refresh (${theme})` new MutationObserver(() => window.__railLabelChanges.push(element.querySelector("small")?.textContent ?? null)).observe(element, { childList: true, subtree: true, characterData: true }); }); const requestsBefore = await page.evaluate(() => window.__fixture.requests.filter((r) => r.operation === "getUsageQuota").length); + const points = await page.evaluate(() => { + const center = (testId) => { + const element = document.querySelector(`[data-testid="${testId}"]`); + if (!element) throw new Error(`Missing menu item: ${testId}`); + const rect = element.getBoundingClientRect(); + return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }; + }; + return { settings: center("user-menu-settings"), usage: center("user-menu-usage") }; + }); for (let index = 0; index < 12; index += 1) { - await page.getByTestId("user-menu-settings").hover(); - await usage.hover(); + await page.mouse.move(points.settings.x, points.settings.y); + await page.mouse.move(points.usage.x, points.usage.y); } expect(await page.evaluate(() => window.__fixture.requests.filter((r) => r.operation === "getUsageQuota").length)).toBe(requestsBefore); expect(await page.evaluate(() => window.__railLabelChanges.filter((label) => label !== "Explore"))).toEqual([]); diff --git a/packages/webui/test/integration/loopback-harness-path.test.ts b/packages/webui/test/integration/loopback-harness-path.test.ts index fc869336..a0ba1678 100644 --- a/packages/webui/test/integration/loopback-harness-path.test.ts +++ b/packages/webui/test/integration/loopback-harness-path.test.ts @@ -49,6 +49,7 @@ import { createWorkspaceAdapter } from "../../src/runtime/harness/workspace.js"; import { readWorkspaceFile } from "../../../local-runtime-v2/src/service/workspace/operations/workspace-path.js"; import { parseWebuiMessageFileReference } from "../../src/client/features/transcript/projection/message-file-reference.js"; import { initialWorkspacePanelState, reduceWorkspacePanelState } from "../../src/client/features/workspace/projection/workspace-panel-state.js"; +import { toPosixPath } from "../../src/client/projection/common/paths.js"; interface TestPort extends WebuiHarnessPort { /** Every harness method the run actually reached, in call order. */ @@ -332,7 +333,7 @@ describe("loopback to harness-port evidence", () => { const state = reduceWorkspacePanelState(initialWorkspacePanelState, { type: "open-file", sessionId: "external-file", workspaceDir, ...reference }); const content = state.tabs[0]?.content; if (content?.kind !== "file-preview") throw new Error("External link did not open a file tab"); - expect(content).toMatchObject({ workspaceDir: artifacts, path: "design.md", lineStart: 1 }); + expect(content).toMatchObject({ workspaceDir: toPosixPath(artifacts), path: "design.md", lineStart: 1 }); await expect(wire.request("readWorkspaceFile", { workspaceDir: content.workspaceDir, path: content.path })).resolves.toEqual({ type: "text", content: "# External architecture\n" }); const url = wire.workspaceFileUrl({ workspaceDir, path: path.join(artifacts, "图 1.png") }); const response = await fetch(url);