import { render, screen, fireEvent } from "@testing-library/react"; import { expect, it, describe } from "vitest"; import { Disclosure, DisclosureGroup } from "."; describe("Disclosure", () => { describe("Single Disclosure", () => { it("matches snapshot", () => { const { asFragment } = render( Toggle Content ); expect(asFragment()).toMatchSnapshot(); }); it("renders collapsed by default", () => { render( Toggle Content ); expect(screen.getByRole("button")).toHaveAttribute( "aria-expanded", "false" ); expect(screen.queryByText("Content")).not.toBeVisible(); }); it("expands/collapses when clicked", () => { render( Toggle Content ); const trigger = screen.getByRole("button"); fireEvent.click(trigger); expect(trigger).toHaveAttribute("aria-expanded", "true"); expect(screen.getByText("Content")).toBeVisible(); fireEvent.click(trigger); expect(trigger).toHaveAttribute("aria-expanded", "false"); expect(screen.queryByText("Content")).not.toBeVisible(); }); it("respects disabled state", () => { render( Toggle Content ); const trigger = screen.getByRole("button"); expect(trigger).toBeDisabled(); fireEvent.click(trigger); expect(screen.queryByText("Content")).not.toBeVisible(); }); }); describe("DisclosureGroup", () => { it("allows only one panel open at a time by default", () => { render( First Content 1 Second Content 2 ); const [first, second] = screen.getAllByRole("button"); fireEvent.click(first); expect(screen.getByText("Content 1")).toBeVisible(); expect(screen.queryByText("Content 2")).not.toBeVisible(); fireEvent.click(second); expect(screen.queryByText("Content 1")).not.toBeVisible(); expect(screen.getByText("Content 2")).toBeVisible(); }); it("supports multiple expanded panels when allowMultiple is true", () => { render( First Content 1 Second Content 2 ); const [first, second] = screen.getAllByRole("button"); fireEvent.click(first); fireEvent.click(second); expect(screen.getByText("Content 1")).toBeVisible(); expect(screen.getByText("Content 2")).toBeVisible(); }); }); describe("Custom Icons", () => { it("renders custom icons when provided", () => { render( Toggle Content ); const icon = screen.getByText("add"); expect(icon).toBeInTheDocument(); fireEvent.click(screen.getByRole("button")); expect(screen.getByText("remove")).toBeInTheDocument(); }); }); });