sdlc-hub/web/src/modules/modules.test.tsx
Andrey Epifancev 611ed830c4 Веб: страница «Kanban» (#108)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 20:21:04 +04:00

51 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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");
});
});