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();
});
});