// @vitest-environment jsdom // // E28 review F3: the tab rail was a row of `aria-pressed` toggle buttons — every tab a Tab stop, no // arrow keys, and nothing tying a tab to the content it shows. It is an ARIA tab list now. import { useState } from "react"; import { afterEach, describe, expect, it } from "vitest"; import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import Tabs from "./Tabs"; import { useTabPanel } from "./tabPanel"; afterEach(cleanup); const TABS = [ { id: "a", label: "Alpha" }, { id: "b", label: "Beta" }, { id: "c", label: "Gamma" }, ]; function Harness() { const [active, setActive] = useState("a"); const panel = useTabPanel(); return ( <>
content of {active}
); } const tab = (name: string) => screen.getByRole("tab", { name }); describe("Tabs", () => { it("is a tab list with one Tab stop, the selected tab", () => { render(); expect(screen.getByRole("tablist", { name: "Pick" })).toBeTruthy(); expect(tab("Alpha").getAttribute("aria-selected")).toBe("true"); expect(tab("Beta").getAttribute("aria-selected")).toBe("false"); expect(TABS.map((t) => tab(t.label).tabIndex)).toEqual([0, -1, -1]); }); it("moves and selects with the arrows, and Home/End jump to the ends", () => { render(); tab("Alpha").focus(); fireEvent.keyDown(document.activeElement!, { key: "ArrowRight" }); expect(document.activeElement).toBe(tab("Beta")); expect(tab("Beta").getAttribute("aria-selected")).toBe("true"); fireEvent.keyDown(document.activeElement!, { key: "End" }); expect(document.activeElement).toBe(tab("Gamma")); fireEvent.keyDown(document.activeElement!, { key: "ArrowRight" }); // wraps expect(document.activeElement).toBe(tab("Alpha")); fireEvent.keyDown(document.activeElement!, { key: "ArrowUp" }); // either axis expect(document.activeElement).toBe(tab("Gamma")); fireEvent.keyDown(document.activeElement!, { key: "Home" }); expect(tab("Alpha").getAttribute("aria-selected")).toBe("true"); }); it("ties each tab to the panel, and the panel to the selected tab", () => { render(); const panel = screen.getByRole("tabpanel"); expect(tab("Beta").getAttribute("aria-controls")).toBe(panel.id); fireEvent.click(tab("Beta")); expect(screen.getByRole("tabpanel", { name: "Beta" })).toBe(panel); }); });