// packages/core/tests/components/tabs/tabs.test.tsx
import { fireEvent, render, screen } from "@solidjs/testing-library";
import { describe, expect, it } from "vitest";
import { Tabs } from "../../../src/components/tabs/index";
describe("Tabs", () => {
it("first tab is selected when defaultValue matches", () => {
render(() => (
Tab A
Tab B
Panel A
Panel B
));
expect(screen.getByText("Tab A").getAttribute("aria-selected")).toBe("true");
expect(screen.getByText("Tab B").getAttribute("aria-selected")).toBe("false");
});
it("clicking a tab activates it", () => {
render(() => (
Tab A
Tab B
Panel A
Panel B
));
fireEvent.click(screen.getByText("Tab B"));
expect(screen.getByText("Tab B").getAttribute("aria-selected")).toBe("true");
expect(screen.getByText("Tab A").getAttribute("aria-selected")).toBe("false");
});
it("inactive panels are hidden", () => {
render(() => (
Tab A
Tab B
Panel A
Panel B
));
expect(screen.getByTestId("panel-a")).not.toHaveAttribute("hidden");
expect(screen.getByTestId("panel-b")).toHaveAttribute("hidden");
});
it("tab has role=tab and panel has role=tabpanel", () => {
render(() => (
Tab A
Panel A
));
expect(screen.getByRole("tab")).toBeTruthy();
expect(screen.getByRole("tabpanel")).toBeTruthy();
});
it("tab aria-controls matches panel id", () => {
render(() => (
Tab A
Panel A
));
const tab = screen.getByRole("tab");
const panel = screen.getByTestId("panel");
expect(tab.getAttribute("aria-controls")).toBe(panel.id);
});
it("ArrowRight moves to next tab", () => {
render(() => (
Tab A
Tab B
Panel A
Panel B
));
const tabA = screen.getByText("Tab A");
tabA.focus();
fireEvent.keyDown(tabA, { key: "ArrowRight" });
expect(document.activeElement).toBe(screen.getByText("Tab B"));
});
it("controlled value", () => {
render(() => (
{}}>
Tab A
Tab B
Panel A
Panel B
));
expect(screen.getByText("Tab B").getAttribute("aria-selected")).toBe("true");
});
});