Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
89 lines
2.9 KiB
TypeScript
89 lines
2.9 KiB
TypeScript
import { describe, expect, it, afterEach, vi } from "vitest";
|
|
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
import { Button } from "./Button.js";
|
|
|
|
afterEach(() => {
|
|
cleanup();
|
|
});
|
|
|
|
describe("Button", () => {
|
|
it("should render children", () => {
|
|
render(<Button>Click me</Button>);
|
|
expect(screen.getByRole("button")).toHaveTextContent("Click me");
|
|
});
|
|
|
|
describe("variants", () => {
|
|
it("should apply primary variant styles by default", () => {
|
|
render(<Button>Primary</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.style.background).toBe("var(--ms-blue-500)");
|
|
});
|
|
|
|
it("should apply secondary variant styles", () => {
|
|
render(<Button variant="secondary">Secondary</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.style.background).toBe("transparent");
|
|
expect(button.style.border).toBe("1px solid var(--border)");
|
|
});
|
|
|
|
it("should apply danger variant styles", () => {
|
|
render(<Button variant="danger">Delete</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.style.background).toBe("rgba(229, 72, 77, 0.12)");
|
|
expect(button.style.color).toBe("var(--danger)");
|
|
});
|
|
});
|
|
|
|
describe("sizes", () => {
|
|
it("should apply medium size by default", () => {
|
|
render(<Button>Medium</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.className).toContain("px-4");
|
|
});
|
|
|
|
it("should apply small size styles", () => {
|
|
render(<Button size="sm">Small</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.className).toContain("px-3");
|
|
});
|
|
|
|
it("should apply large size styles", () => {
|
|
render(<Button size="lg">Large Button</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.className).toContain("px-6");
|
|
});
|
|
});
|
|
|
|
describe("onClick", () => {
|
|
it("should call onClick handler when clicked", () => {
|
|
const handleClick = vi.fn();
|
|
render(<Button onClick={handleClick}>Click me</Button>);
|
|
fireEvent.click(screen.getByRole("button"));
|
|
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it("should not call onClick when disabled", () => {
|
|
const handleClick = vi.fn();
|
|
render(
|
|
<Button onClick={handleClick} disabled>
|
|
Disabled
|
|
</Button>
|
|
);
|
|
fireEvent.click(screen.getByRole("button"));
|
|
expect(handleClick).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
it("should pass through additional props", () => {
|
|
render(<Button disabled>Disabled</Button>);
|
|
expect(screen.getByRole("button")).toBeDisabled();
|
|
});
|
|
|
|
it("should merge custom className with default styles", () => {
|
|
render(<Button className="custom-class">Custom</Button>);
|
|
const button = screen.getByRole("button");
|
|
expect(button.className).toContain("custom-class");
|
|
expect(button.style.background).toBe("var(--ms-blue-500)");
|
|
});
|
|
});
|