import { render, screen } from "@testing-library/react"; import { BookOpenIcon } from "lucide-react"; import { beforeEach, describe, expect, it } from "vitest"; import { configureJsonApi } from "../../../../client/config"; import { configureI18n } from "../../../../i18n"; import { AdminIndexGrid } from "../AdminIndexContainer"; import type { AdminGroup } from "../../data/admin-section.types"; // next-intl is globally mocked in vitest.setup.ts with `t = (key) => key`, so // every label below renders as its own key. That is what the assertions match. const configure = (stripePublishableKey?: string) => { configureJsonApi({ apiUrl: "http://api.test", stripePublishableKey }); configureI18n({ useRouter: () => ({ push: () => {}, replace: () => {}, back: () => {}, forward: () => {}, refresh: () => {}, prefetch: () => {}, }), useTranslations: () => (key: string) => key, usePathname: () => "/administration", Link: ({ href, children, ...props }: any) => ( {children} ), }); }; const extraGroup: AdminGroup = { key: "documentation", labelKey: "administration.group.documentation", sections: [ { key: "howtos", icon: BookOpenIcon, labelKey: "entities.howtos", labelValues: { count: 2 }, descriptionKey: "administration.howtos.description", href: "/administration/howtos", }, ], }; describe("AdminIndexGrid", () => { beforeEach(() => configure()); it("renders the four unconditional platform entries with their hrefs", () => { render(); expect(screen.getByTestId("admin-index-companies")).toHaveAttribute("href", "/administration/companies"); expect(screen.getByTestId("admin-index-users")).toHaveAttribute("href", "/administration/users"); expect(screen.getByTestId("admin-index-token-usage")).toHaveAttribute("href", "/administration/token-usage"); expect(screen.getByTestId("admin-index-rbac")).toHaveAttribute("href", "/administration/rbac"); }); it("omits the billing entry when no Stripe publishable key is configured", () => { render(); expect(screen.queryByTestId("admin-index-billing")).not.toBeInTheDocument(); }); it("includes the billing entry when a Stripe publishable key is configured", () => { configure("pk_test_123"); render(); expect(screen.getByTestId("admin-index-billing")).toHaveAttribute("href", "/administration/products"); }); it("appends additionalGroups after the platform group, in order", () => { render(); const headings = screen.getAllByRole("heading", { level: 3 }).map((h) => h.textContent); expect(headings).toEqual(["administration.group.platform", "administration.group.documentation"]); expect(screen.getByTestId("admin-index-howtos")).toHaveAttribute("href", "/administration/howtos"); }); it("skips a group that has no sections", () => { render( , ); expect(screen.queryByText("administration.group.empty")).not.toBeInTheDocument(); }); it("renders the subtitle but not a page title of its own", () => { render(); expect(screen.getByText("administration.subtitle")).toBeInTheDocument(); // The page's name comes from AdministrationProvider via // RoundPageContainerTitle, so the grid must not repeat it. expect(screen.queryByText("administration.title")).not.toBeInTheDocument(); }); });