import { describe, expect, it, vi } from "vitest"; import type { Page } from "playwright"; import { isCargoEditorOpen } from "@/workers/rpa/cargo-editor"; function mockPage(visible: (selector: string) => boolean): Page { const getByRole = vi.fn((_role: string, opts?: { name?: RegExp }) => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue( opts?.name?.test("ADD ITEM") ?? false, ), }), })); const getByPlaceholder = vi.fn((pattern: RegExp) => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(/weight/i.test(pattern.source)), }), })); return { locator: vi.fn((selector: string) => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(visible(selector)), }), last: () => ({ isVisible: vi.fn().mockResolvedValue(visible(selector)), }), })), getByRole, getByPlaceholder, getByText: vi.fn(() => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(false) }), })), } as unknown as Page; } describe("isCargoEditorOpen", () => { it("role=dialog 可见时视为已打开", async () => { const page = mockPage((s) => s.includes("dialog")); expect(await isCargoEditorOpen(page)).toBe(true); }); it("popover:Weight placeholder 可见时视为已打开(无 dialog)", async () => { const page = mockPage(() => false); expect(await isCargoEditorOpen(page)).toBe(true); }); it("无 dialog 且无 editor 信号时未打开", async () => { const page = { locator: vi.fn(() => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(false), }), })), getByRole: vi.fn(() => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(false), }), })), getByPlaceholder: vi.fn(() => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(false), }), })), getByText: vi.fn(() => ({ first: () => ({ isVisible: vi.fn().mockResolvedValue(false), }), })), } as unknown as Page; expect(await isCargoEditorOpen(page)).toBe(false); }); });