返回 CodeWhale
path.test.ts
根目录 / web / lib / i18n / path.test.ts
1 import { describe, expect, it } from "vitest";
2 import { locales } from "./config";
3 import { isDocsPath, pathLocale, replacePathLocale } from "./path";
4
5 describe("pathLocale", () => {
6 it("reads the first segment when it is a routed locale", () => {
7 expect(pathLocale("/zh")).toBe("zh");
8 expect(pathLocale("/zh/install")).toBe("zh");
9 expect(pathLocale("/pt-BR/docs/guide")).toBe("pt-BR");
10 expect(pathLocale("/ja/")).toBe("ja");
11 });
12
13 it("returns null for bare paths and unknown first segments", () => {
14 expect(pathLocale("/")).toBeNull();
15 expect(pathLocale("/install")).toBeNull();
16 expect(pathLocale("/docs/guide")).toBeNull();
17 expect(pathLocale("/pt/docs")).toBeNull();
18 });
19
20 it("resolves a miscased prefix to its canonical spelling", () => {
21 // An external link that lowercases the one regional tag still names a
22 // real route; treating it as bare lands on `/en/pt-br/...`, a 404.
23 expect(pathLocale("/pt-br/install")).toBe("pt-BR");
24 expect(pathLocale("/PT-BR")).toBe("pt-BR");
25 expect(pathLocale("/ZH/docs")).toBe("zh");
26 });
27 });
28
29 describe("replacePathLocale", () => {
30 it("swaps an existing locale prefix, including regional tags", () => {
31 expect(replacePathLocale("/zh/install", "ja")).toBe("/ja/install");
32 expect(replacePathLocale("/pt-BR/docs/guide", "en")).toBe("/en/docs/guide");
33 expect(replacePathLocale("/de", "zh")).toBe("/zh");
34 expect(replacePathLocale("/id/", "ar")).toBe("/ar/");
35 });
36
37 it("inserts a locale prefix on a bare path", () => {
38 // `/de/` would only be served after a trailing-slash redirect; every
39 // other path keeps whatever trailing slash it arrived with.
40 expect(replacePathLocale("/", "de")).toBe("/de");
41 expect(replacePathLocale("/install", "ja")).toBe("/ja/install");
42 expect(replacePathLocale("/install/", "ja")).toBe("/ja/install/");
43 expect(replacePathLocale("/docs/guide", "pt-BR")).toBe("/pt-BR/docs/guide");
44 });
45
46 it("folds a miscased prefix rather than nesting behind it", () => {
47 expect(replacePathLocale("/pt-br/install", "pt-BR")).toBe("/pt-BR/install");
48 expect(replacePathLocale("/pt-br/docs/guide", "ja")).toBe("/ja/docs/guide");
49 expect(replacePathLocale("/ZH", "de")).toBe("/de");
50 });
51
52 it("round-trips every routed locale through every other", () => {
53 for (const from of locales) {
54 for (const to of locales) {
55 const path = `/${from}/docs/guide`;
56 expect(replacePathLocale(path, to), `${from} → ${to}`).toBe(`/${to}/docs/guide`);
57 expect(pathLocale(replacePathLocale(path, to))).toBe(to);
58 }
59 }
60 });
61
62 it("does not nest a second locale prefix on a localized path", () => {
63 expect(replacePathLocale("/pt-BR/install", "pt-BR")).toBe("/pt-BR/install");
64 expect(replacePathLocale("/ja/faq", "ja")).not.toContain("/ja/ja/");
65 });
66 });
67
68 describe("isDocsPath", () => {
69 it("recognizes docs routes for two-letter and regional locales", () => {
70 expect(isDocsPath("/en/docs")).toBe(true);
71 expect(isDocsPath("/zh/docs/guide")).toBe(true);
72 expect(isDocsPath("/pt-BR/docs/hooks")).toBe(true);
73 expect(isDocsPath("/docs")).toBe(true);
74 expect(isDocsPath("/docs/guide")).toBe(true);
75 });
76
77 it("recognizes a miscased locale prefix on a docs route", () => {
78 expect(isDocsPath("/pt-br/docs/guide")).toBe(true);
79 expect(isDocsPath("/pt-br/install")).toBe(false);
80 });
81
82 it("rejects non-docs routes, including names that merely contain docs", () => {
83 expect(isDocsPath("/en/install")).toBe(false);
84 expect(isDocsPath("/pt-BR/community")).toBe(false);
85 expect(isDocsPath("/zh")).toBe(false);
86 expect(isDocsPath("/")).toBe(false);
87 expect(isDocsPath("/en/community/docs-club")).toBe(false);
88 });
89 });
90
90 lines TYPESCRIPT