/** * @vitest-environment jsdom */ import { describe, it, expect, afterEach } from "vitest"; import "@testing-library/jest-dom/vitest"; import { render, screen, cleanup } from "@testing-library/react"; import { Button } from "./Button.tsx"; import { Input } from "./Input.tsx"; import { Card } from "./Card.tsx"; afterEach(cleanup); describe("Button", () => { it("renders with text", () => { render(); expect(screen.getByRole("button", { name: "Click me" })).toBeDefined(); }); it("applies primary variant by default", () => { render(); expect(screen.getByRole("button").className).toContain("bg-blue-600"); }); it("applies secondary variant", () => { render(); expect(screen.getByRole("button").className).toContain("bg-gray-100"); }); it("applies ghost variant", () => { render(); expect(screen.getByRole("button").className).toContain("text-gray-700"); }); it("applies size classes", () => { render(); expect(screen.getByRole("button").className).toContain("px-6"); }); it("forwards disabled prop", () => { render(); expect(screen.getByRole("button")).toBeDisabled(); }); }); describe("Input", () => { it("renders with label", () => { render(); expect(screen.getByLabelText("Email")).toBeDefined(); }); it("generates id from label", () => { render(); expect(screen.getByLabelText("First Name").id).toBe("first-name"); }); it("uses provided id over generated one", () => { render(); expect(screen.getByLabelText("Email").id).toBe("custom-id"); }); it("shows error message", () => { render(); expect(screen.getByText("Required")).toBeDefined(); }); it("applies error border class", () => { render(); expect(screen.getByLabelText("Email").className).toContain("border-red-500"); }); it("renders without label", () => { render(); expect(screen.getByPlaceholderText("Type here")).toBeDefined(); }); }); describe("Card", () => { it("renders children", () => { render(Card content); expect(screen.getByText("Card content")).toBeDefined(); }); it("applies additional className", () => { const { container } = render(Content); expect(container.firstElementChild?.className).toContain("mt-4"); }); });