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(); expect(screen.getAllByRole("link")).toHaveLength(3); // «Обзор» + два раздела expect(err.mock.calls.flat().join(" ")).not.toMatch(/same key/); err.mockRestore(); vi.doUnmock("../modules/index.ts"); }); });