51 lines
2.7 KiB
TypeScript
51 lines
2.7 KiB
TypeScript
import { render, screen } from "@testing-library/react";
|
||
import { MemoryRouter } from "react-router";
|
||
import { describe, expect, it, vi } from "vitest";
|
||
import { PAGE_ROUTES } from "../shell/pages.tsx";
|
||
import { MODULES } from "./index.ts";
|
||
|
||
describe("сборка оболочки из модулей", () => {
|
||
it("страницы: «Обзор», адреса jira, перенаправления, вики, NotFound последним", () => {
|
||
expect(PAGE_ROUTES.map((r) => r.path)).toEqual(["/", "/jira/links", "/jira/backlog", "/jira/sprint", "/jira/kanban", "/jira/issues", "/jira/feed", "/jira/board", "/board", "/issues", "/issues/:key", "/feed", "/wiki", "*"]);
|
||
});
|
||
|
||
it("пункты панели: подписи прежние, адреса jira с префиксом, плюс вики", () => {
|
||
expect(MODULES.flatMap((m) => m.nav).map((n) => [n.label, n.to])).toEqual([
|
||
["Связи", "/jira/links"], ["Бэклог", "/jira/backlog"], ["Спринт", "/jira/sprint"], ["Kanban", "/jira/kanban"], ["Задачи", "/jira/issues"], ["Лента", "/jira/feed"], ["Вики", "/wiki"],
|
||
]);
|
||
});
|
||
|
||
it("имена модулей уникальны", () => {
|
||
const names = MODULES.map((m) => m.name);
|
||
expect(new Set(names).size).toBe(names.length);
|
||
});
|
||
|
||
it("имена модулей уникальны: сообщение называет дубль", () => {
|
||
const names = MODULES.map((m) => m.name);
|
||
const dups = names.filter((n, i) => names.indexOf(n) !== i);
|
||
expect(dups, `повтор имени модуля: ${dups.join(", ")}`).toEqual([]);
|
||
});
|
||
|
||
it("адреса пунктов панели уникальны: сообщение называет дубль", () => {
|
||
const paths = MODULES.flatMap((m) => m.nav).map((n) => n.to);
|
||
const dups = paths.filter((p, i) => paths.indexOf(p) !== i);
|
||
expect(dups, `повтор адреса пункта: ${dups.join(", ")}`).toEqual([]);
|
||
});
|
||
});
|
||
|
||
describe("NotFound при повторе адреса", () => {
|
||
it("ключ ссылки уникален: дубль адреса не даёт предупреждения React", async () => {
|
||
vi.resetModules();
|
||
vi.doMock("../modules/index.ts", () => ({
|
||
MODULES: [{ name: "a", nav: [{ to: "/x", label: "A", icon: null }, { to: "/x", label: "B", icon: null }] }],
|
||
}));
|
||
const { NotFound: NF } = await import("../shell/NotFound.tsx");
|
||
const err = vi.spyOn(console, "error").mockImplementation(() => {});
|
||
render(<MemoryRouter><NF /></MemoryRouter>);
|
||
expect(screen.getAllByRole("link")).toHaveLength(3); // «Обзор» + два раздела
|
||
expect(err.mock.calls.flat().join(" ")).not.toMatch(/same key/);
|
||
err.mockRestore();
|
||
vi.doUnmock("../modules/index.ts");
|
||
});
|
||
});
|