import React from "react"; import "@testing-library/jest-dom"; import { fireEvent, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import Switch from "./Switch"; describe("Switch", () => { test("renders the label text", () => { render(); expect(screen.getByText("Enable notifications")).toBeInTheDocument(); }); test("renders without a label span when label is omitted", () => { const { container } = render(); expect(container.querySelector(".switch-label")).not.toBeInTheDocument(); }); test("is unchecked by default", () => { render(); expect(screen.getByRole("switch")).not.toBeChecked(); }); test("is checked when defaultChecked is true", () => { render(); expect(screen.getByRole("switch")).toBeChecked(); }); test("toggles on click in uncontrolled mode", () => { render(); const input = screen.getByRole("switch"); fireEvent.click(input); expect(input).toBeChecked(); fireEvent.click(input); expect(input).not.toBeChecked(); }); test("calls onChange when toggled", () => { const handleChange = vi.fn(); render( , ); fireEvent.click(screen.getByRole("switch")); expect(handleChange).toHaveBeenCalledTimes(1); expect(handleChange.mock.calls[0][0].target.checked).toBe(true); }); test("does not toggle when disabled", async () => { const user = userEvent.setup(); render(); const input = screen.getByRole("switch"); await user.click(input); expect(input).not.toBeChecked(); }); test("applies the switch-disabled class when disabled", () => { const { container } = render(); expect(container.firstChild).toHaveClass("switch-disabled"); }); test("applies an additional className to the label", () => { const { container } = render( , ); expect(container.firstChild).toHaveClass("switch", "my-switch"); }); test("does not apply switch-disabled class when enabled", () => { const { container } = render(); expect(container.firstChild).not.toHaveClass("switch-disabled"); }); test("sets the name attribute on the input", () => { render(); expect(screen.getByRole("switch")).toHaveAttribute("name", "notifications"); }); test("has role switch on the input", () => { render(); expect(screen.getByRole("switch")).toBeInTheDocument(); }); test("forwards the ref to the input element", () => { const ref = React.createRef(); render(); expect(ref.current).toBeInstanceOf(HTMLInputElement); }); test("reflects the checked prop in controlled mode", () => { const { rerender } = render( {}} />, ); expect(screen.getByRole("switch")).not.toBeChecked(); rerender( {}} />); expect(screen.getByRole("switch")).toBeChecked(); }); });