import { test, expect } from "@playwright/test"; import { fillQuoteForm, mockQuoteApi } from "./helpers"; test.describe("查价页 E2E 核心路径(task-089)", () => { test.beforeEach(async ({ page }) => { await page.goto("/embed-demo"); await expect( page.getByRole("heading", { name: "卡派查价" }), ).toBeVisible({ timeout: 30_000 }); }); test("路径1:L2 缓存命中 → 四档报价展示", async ({ page }) => { await mockQuoteApi(page, "cache"); await fillQuoteForm(page); await page.getByRole("button", { name: "获取报价" }).click(); await expect(page.getByRole("button", { name: "标准" })).toBeVisible({ timeout: 15_000, }); await expect(page.getByRole("button", { name: "保证送达" })).toBeVisible(); }); test("路径2:processing → Skeleton → 成功", async ({ page }) => { await mockQuoteApi(page, "processing"); await fillQuoteForm(page); await page.getByRole("button", { name: "获取报价" }).click(); await expect(page.getByText("正在查询报价")).toBeVisible(); await expect(page.getByRole("button", { name: "标准" })).toBeVisible({ timeout: 15_000, }); }); test("路径3:stale 降级 → WarningBanner", async ({ page }) => { await mockQuoteApi(page, "stale"); await fillQuoteForm(page); await page.getByRole("button", { name: "获取报价" }).click(); await expect( page.getByText("非实时报价,仅供参考(已使用历史缓存降级)"), ).toBeVisible({ timeout: 15_000 }); }); test("路径4:API 错误 → ErrorBanner + 重试", async ({ page }) => { await mockQuoteApi(page, "error"); await fillQuoteForm(page); await page.getByRole("button", { name: "获取报价" }).click(); await expect(page.getByRole("button", { name: "重试" })).toBeVisible({ timeout: 10_000, }); }); test("路径5:空闲态占位文案", async ({ page }) => { await expect(page.getByText("填写信息后获取报价")).toBeVisible(); await expect(page.getByText("四档运价")).toBeVisible(); }); });