import { expect, test, describe, it, vi } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import Toggle from "../../app/components/Toggle"; describe("Toggle Component", () => { test("renders with default props", () => { render(); const toggle = screen.getByRole("switch"); const label = screen.getByText("Test Toggle"); expect(toggle).toBeInTheDocument(); expect(label).toBeInTheDocument(); expect(toggle).toHaveAttribute("type", "button"); }); test("renders with custom props", () => { render( ); const toggle = screen.getByRole("switch"); expect(toggle).toBeInTheDocument(); expect(toggle).toHaveAttribute("aria-checked", "true"); expect(toggle).toHaveAttribute("disabled"); }); test("handles checked state", () => { const { rerender } = render(); let toggle = screen.getByRole("switch"); expect(toggle).toHaveAttribute("aria-checked", "false"); rerender(); toggle = screen.getByRole("switch"); expect(toggle).toHaveAttribute("aria-checked", "true"); }); test("handles disabled state", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveAttribute("disabled"); expect(toggle).toHaveClass("cursor-not-allowed"); }); test("handles state prop", () => { const { rerender } = render(); let toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("shadow-[0_0_5px_1px_#3281F8]"); rerender(); toggle = screen.getByRole("switch"); expect(toggle).not.toHaveClass("shadow-[0_0_5px_1px_#3281F8]"); }); test("handles showIcon and icon props", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveTextContent("I"); }); test("handles showText and text props", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveTextContent("Toggle"); }); test("handles both icon and text", () => { render( ); const toggle = screen.getByRole("switch"); expect(toggle).toHaveTextContent("I"); expect(toggle).toHaveTextContent("Toggle"); }); test("calls onChange when clicked", () => { const handleChange = vi.fn(); render(); const toggle = screen.getByRole("switch"); fireEvent.click(toggle); expect(handleChange).toHaveBeenCalledTimes(1); }); test("does not call onChange when disabled", () => { const handleChange = vi.fn(); render( ); const toggle = screen.getByRole("switch"); fireEvent.click(toggle); expect(handleChange).not.toHaveBeenCalled(); }); test("applies correct classes for different states", () => { const { rerender } = render(); let toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("bg-[var(--color-surface-default-primary)]"); rerender(); toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("bg-[var(--color-magenta-magenta100)]"); rerender(); toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("bg-[var(--color-surface-default-tertiary)]"); }); test("applies hover classes when not checked", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveClass( "hover:!bg-[var(--color-surface-default-secondary)]" ); }); test("does not apply hover classes when checked", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).not.toHaveClass( "hover:!bg-[var(--color-surface-default-secondary)]" ); }); test("applies focus-visible classes", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("focus-visible:shadow-[0_0_5px_1px_#3281F8]"); }); test("applies correct size classes", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("h-[var(--measures-sizing-032)]"); expect(toggle).toHaveClass("px-[16px]"); expect(toggle).toHaveClass("py-[8px]"); expect(toggle).toHaveClass("gap-[4px]"); }); test("applies correct text classes", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("text-[12px]"); expect(toggle).toHaveClass("leading-[16px]"); }); test("applies correct label classes", () => { render(); const label = screen.getByText("Test Toggle"); expect(label).toHaveClass("text-[12px]"); expect(label).toHaveClass("leading-[16px]"); expect(label).toHaveClass("text-[var(--color-content-default-secondary)]"); }); test("forwards ref correctly", () => { const ref = vi.fn(); render(); expect(ref).toHaveBeenCalled(); }); test("applies custom className", () => { render(); const toggle = screen.getByRole("switch"); expect(toggle).toHaveClass("custom-class"); }); });