import { expect, test } from "@playwright/test"; test.describe("裸 / 重定向", () => { test("默认 Accept-Language (en-US) 跳 /en", async ({ request }) => { const res = await request.get("/", { headers: { "accept-language": "en-US" }, maxRedirects: 0, }); expect(res.status()).toBeGreaterThanOrEqual(300); expect(res.status()).toBeLessThan(400); expect(res.headers()["location"]).toContain("/en"); }); test("Accept-Language zh-CN 跳 /zh-CN", async ({ request }) => { const res = await request.get("/", { headers: { "accept-language": "zh-CN,zh;q=0.9" }, maxRedirects: 0, }); expect(res.status()).toBeGreaterThanOrEqual(300); expect(res.status()).toBeLessThan(400); expect(res.headers()["location"]).toContain("/zh-CN"); }); test("cookie app-lang 优先于 Accept-Language", async ({ request }) => { const res = await request.get("/", { headers: { cookie: "app-lang=zh-CN", "accept-language": "en-US", }, maxRedirects: 0, }); expect(res.headers()["location"]).toContain("/zh-CN"); }); }); test.describe("locale 规范化", () => { test("小写 /zh-cn 重定向到 /zh-CN", async ({ request }) => { const res = await request.get("/zh-cn", { maxRedirects: 0 }); expect(res.status()).toBeGreaterThanOrEqual(300); expect(res.status()).toBeLessThan(400); expect(res.headers()["location"]).toBe("/zh-CN"); }); }); test("header 语言下拉显示当前语言并可切换", async ({ page }) => { await page.goto("/zh-CN"); const trigger = page.getByRole("button", { name: "语言" }); await expect(trigger).toBeVisible(); await expect(trigger).toContainText("中文"); await trigger.click(); const item = page.locator('[data-switch-locale="en"]'); await expect(item).toBeVisible(); await item.click(); await expect(page).toHaveURL(/\/en$/); const enTrigger = page.getByRole("button", { name: "Language" }); await expect(enTrigger).toContainText("English"); });