import { cleanup, render, screen, } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { useContext } from "react"; import assert from "node:assert"; import { afterEach, describe, mock, test, } from "node:test"; import { PaginationContext } from "./context"; import { Pagination } from "./index"; describe("Pagination", () => { afterEach(() => { cleanup(); }); test("renders radio inputs when name prop is provided", () => { const items = [ { page: 1, isActive: true }, { page: 2, isActive: false }, ]; render( ); assert.strictEqual(screen.getAllByRole("radio").length, 2); }); test("renders navigation landmark", () => { render(); assert.notStrictEqual(screen.queryByRole("navigation"), null); }); test("calls onClick callback for link item", async () => { const user = userEvent.setup(); const onClick = mock.fn(({ event }) => { event.preventDefault(); }); const items = [ { page: 1, href: "/page-1" }, ]; render( ); await user.click(screen.getByRole("link")); assert.strictEqual(onClick.mock.calls.length, 1); }); test("does not mutate source items when active page changes", async () => { const user = userEvent.setup(); const items = [ { page: 1, isActive: true }, { page: 2, isActive: false }, ]; const sourceSnapshot = JSON.stringify(items); render(); const radios = screen.getAllByRole("radio"); await user.click(radios[1] as HTMLElement); assert.strictEqual(JSON.stringify(items), sourceSnapshot); }); test("provides updated pages via context after state change", async () => { const user = userEvent.setup(); const items = [ { page: 1, isActive: true }, { page: 2, isActive: false }, ]; const ActivePage = () => { const { pages } = useContext(PaginationContext); const active = (pages || []).find((item) => (item as { isActive?: boolean; }).isActive) as { page?: number; } | undefined; return
{active?.page ?? "none"}
; }; render( ); assert.strictEqual(screen.getByTestId("active-page").textContent, "1"); const radios = screen.getAllByRole("radio"); await user.click(radios[1] as HTMLElement); assert.strictEqual(screen.getByTestId("active-page").textContent, "2"); }); });