import { expect, type Page } from "@playwright/test"; export type WecomEntryConfig = { enabled: boolean; entryEnabled: boolean; oauthEnabled: boolean; corpId: string; agentId: string; loginUrl: string | null; bindEnabled: boolean; defaultReturnTo: string; status: string; statusReasons: string[]; }; type Envelope = { data: T; error?: { code?: string; message?: string; }; }; export async function assertPortalLoaded(page: Page) { await expect(page).toHaveURL(/\/portal/); await expect(page.getByRole("link", { name: "工作台", exact: true }).first()).toBeVisible(); await expect(page.getByRole("heading", { name: "今日待处理" })).toBeVisible(); } export async function assertForbiddenPage(page: Page) { await expect(page).toHaveURL(/\/403/); await expect(page.getByRole("heading", { name: "无权限访问", exact: true })).toBeVisible(); } export async function assertMainNavVisible(page: Page) { await expect(page.getByRole("link", { name: "工作台", exact: true }).first()).toBeVisible(); await expect(page.getByRole("link", { name: "团队" }).first()).toBeVisible(); await expect(page.getByRole("link", { name: "项目" }).first()).toBeVisible(); } export async function assertBackupModulesCollapsed(page: Page) { const summary = page.locator("summary").filter({ hasText: "更多" }).first(); await expect(summary).toBeVisible(); const details = summary.locator("xpath=ancestor::details[1]"); const isOpen = await details.evaluate((node) => (node as HTMLDetailsElement).open); expect(isOpen).toBe(false); await expect(page.getByRole("link", { name: "差旅申请" })).not.toBeVisible(); } export async function assertWecomBindingCardVisible(page: Page) { await expect(page.getByRole("heading", { name: "企业微信绑定" })).toBeVisible(); await expect(page.getByText("企业微信入口", { exact: true })).toBeVisible(); await expect(page.getByText("当前绑定", { exact: true })).toBeVisible(); } export async function fetchWecomConfig(page: Page) { const response = await page.request.get("/api/auth/wecom/config"); const text = await response.text(); let parsed: Envelope | null = null; try { parsed = text ? JSON.parse(text) as Envelope : null; } catch { parsed = null; } return { status: response.status(), ok: response.ok(), body: text, data: parsed?.data ?? null, }; }