import { describe, expect, it, vi } from "vitest"; import type { Page } from "playwright"; function mockOverlayPage(overlays: Array<{ visible: boolean; hasCargo: boolean }>): Page { const overlayLocs = overlays.map((o) => ({ isVisible: vi.fn(async () => o.visible), locator: vi.fn(() => ({ first: vi.fn(() => ({ isVisible: vi.fn(async () => o.hasCargo), })), })), })); return { locator: vi.fn(() => ({ count: vi.fn(async () => overlayLocs.length), nth: vi.fn((i: number) => overlayLocs[i]), })), keyboard: { press: vi.fn(async () => undefined) }, waitForTimeout: vi.fn(async () => undefined), } as unknown as Page; } describe("isCargoOverlayPopoverOpen", () => { it("无 dialog 货物弹层时返回 false", async () => { const { isCargoOverlayPopoverOpen } = await import("@/workers/rpa/cargo-lock"); const page = mockOverlayPage([]); expect(await isCargoOverlayPopoverOpen(page)).toBe(false); }); it("dialog 含 pallet 输入时返回 true", async () => { const { isCargoOverlayPopoverOpen } = await import("@/workers/rpa/cargo-lock"); const page = mockOverlayPage([{ visible: true, hasCargo: true }]); expect(await isCargoOverlayPopoverOpen(page)).toBe(true); }); }); describe("dismissCargoPopoverOnly", () => { it("内联货物(无 overlay)不按 Escape", async () => { const { dismissCargoPopoverOnly } = await import("@/workers/rpa/cargo-lock"); const page = mockOverlayPage([]); await dismissCargoPopoverOnly(page, "#widget"); expect(page.keyboard.press).not.toHaveBeenCalled(); }); });