66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
import { readFileSync, readdirSync } from "node:fs";
|
|
import { join, relative } from "node:path";
|
|
|
|
import { describe, expect, it } from "@rstest/core";
|
|
|
|
import { localizeDocsHref } from "@/components/docs/localized-links";
|
|
|
|
const CONTENT_ROOT = join(process.cwd(), "src/content");
|
|
|
|
function findMdxFiles(directory: string): string[] {
|
|
return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
|
|
const path = join(directory, entry.name);
|
|
return entry.isDirectory()
|
|
? findMdxFiles(path)
|
|
: entry.name.endsWith(".mdx")
|
|
? [path]
|
|
: [];
|
|
});
|
|
}
|
|
|
|
describe("localizeDocsHref", () => {
|
|
it.each([
|
|
["/docs", "en", "/en/docs"],
|
|
["/docs/introduction", "en", "/en/docs/introduction"],
|
|
[
|
|
"/docs/introduction?tab=overview#next",
|
|
"zh",
|
|
"/zh/docs/introduction?tab=overview#next",
|
|
],
|
|
])("localizes %s for %s", (href, lang, expected) => {
|
|
expect(localizeDocsHref(href, lang)).toBe(expected);
|
|
});
|
|
|
|
it.each([
|
|
["/en/docs/introduction", "zh"],
|
|
["/zh/docs/introduction", "en"],
|
|
["https://example.com/docs", "en"],
|
|
["#overview", "zh"],
|
|
["mailto:docs@example.com", "en"],
|
|
["/workspace", "zh"],
|
|
["/docs-extra", "en"],
|
|
["/docs/introduction", "fr"],
|
|
["/docs/introduction", undefined],
|
|
])("leaves %s unchanged for language %s", (href, lang) => {
|
|
expect(localizeDocsHref(href, lang)).toBe(href);
|
|
});
|
|
});
|
|
|
|
describe("documentation Cards imports", () => {
|
|
it("does not bypass the locale-aware MDX Cards component", () => {
|
|
const violations = findMdxFiles(CONTENT_ROOT)
|
|
.filter((path) => {
|
|
const source = readFileSync(path, "utf8");
|
|
const nextraImports = source.matchAll(
|
|
/import\s*\{([^}]*)\}\s*from\s*["']nextra\/components["']/g,
|
|
);
|
|
return [...nextraImports].some((match) =>
|
|
match[1]?.split(",").some((name) => name.trim() === "Cards"),
|
|
);
|
|
})
|
|
.map((path) => relative(CONTENT_ROOT, path));
|
|
|
|
expect(violations).toEqual([]);
|
|
});
|
|
});
|