app-template/e2e/i18n.spec.ts

56 lines
2.0 KiB
TypeScript

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$/);
});