/**
* @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");
});
});