57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { resolvePageTitle } from "./resolve-page-title";
|
|
import type { Translations } from "@/i18n/types";
|
|
|
|
// Minimal translations stub — only the fields resolvePageTitle touches.
|
|
const t = {
|
|
app: {
|
|
webUi: "Web UI",
|
|
nav: {
|
|
analytics: "Analytics",
|
|
chat: "Chat",
|
|
config: "Config",
|
|
cron: "Cron",
|
|
documentation: "Documentation",
|
|
keys: "Keys",
|
|
logs: "Logs",
|
|
models: "Models",
|
|
profiles: "Profiles",
|
|
plugins: "Plugins",
|
|
sessions: "Sessions",
|
|
skills: "Skills",
|
|
},
|
|
},
|
|
} as unknown as Translations;
|
|
|
|
describe("resolvePageTitle", () => {
|
|
it("uses i18n nav keys for translated routes", () => {
|
|
expect(resolvePageTitle("/sessions", t, [])).toBe("Sessions");
|
|
expect(resolvePageTitle("/env", t, [])).toBe("Keys");
|
|
});
|
|
|
|
it("renders initialisms and literal labels correctly", () => {
|
|
// Regression: the naive capitalize fallback produced "Mcp".
|
|
expect(resolvePageTitle("/mcp", t, [])).toBe("MCP");
|
|
expect(resolvePageTitle("/system", t, [])).toBe("System");
|
|
expect(resolvePageTitle("/channels", t, [])).toBe("Channels");
|
|
expect(resolvePageTitle("/webhooks", t, [])).toBe("Webhooks");
|
|
expect(resolvePageTitle("/pairing", t, [])).toBe("Pairing");
|
|
expect(resolvePageTitle("/files", t, [])).toBe("Files");
|
|
});
|
|
|
|
it("prefers plugin tab labels", () => {
|
|
expect(
|
|
resolvePageTitle("/kanban", t, [{ path: "/kanban", label: "Kanban" }]),
|
|
).toBe("Kanban");
|
|
});
|
|
|
|
it("falls back to capitalized path segment for unknown routes", () => {
|
|
expect(resolvePageTitle("/whatever", t, [])).toBe("Whatever");
|
|
});
|
|
|
|
it("treats root as sessions and trailing slashes as equivalent", () => {
|
|
expect(resolvePageTitle("/", t, [])).toBe("Sessions");
|
|
expect(resolvePageTitle("/mcp/", t, [])).toBe("MCP");
|
|
});
|
|
});
|