import React from "react";
import { Button } from "./index";
import { fireEvent, render, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
describe("Button", () => {
it("renders children content", () => {
render();
expect(screen.getByRole("button")).toHaveTextContent("Click me");
});
it("has correct displayName", () => {
expect(Button.displayName).toBe("Button");
});
it("applies className", () => {
render();
expect(screen.getByRole("button")).toHaveClass("btn-primary");
});
it("applies inline style", () => {
render();
expect(screen.getByRole("button").style.color).toBe("red");
});
it("defaults className to empty string", () => {
render();
expect(screen.getByRole("button")).toHaveAttribute("class", "");
});
it("disables button when disabled prop is true", () => {
render();
expect(screen.getByRole("button")).toBeDisabled();
});
it("is enabled by default", () => {
render();
expect(screen.getByRole("button")).not.toBeDisabled();
});
it("calls onClick handler when clicked", () => {
const onClick = jest.fn();
render();
fireEvent.click(screen.getByRole("button"));
expect(onClick).toHaveBeenCalledTimes(1);
});
it("does not call onClick when disabled", () => {
const onClick = jest.fn();
render(
);
fireEvent.click(screen.getByRole("button"));
expect(onClick).not.toHaveBeenCalled();
});
it("forwards ref to button element", () => {
const ref = React.createRef();
render();
expect(ref.current).toBeInstanceOf(HTMLButtonElement);
});
it("passes additional HTML attributes", () => {
render(
);
const btn = screen.getByTestId("custom-btn");
expect(btn).toHaveAttribute("id", "my-btn");
});
it("renders without children", () => {
const { container } = render();
expect(container.querySelector("button")).toBeInTheDocument();
});
it("supports type attribute", () => {
render();
expect(screen.getByRole("button")).toHaveAttribute("type", "submit");
});
it("passes aria attributes", () => {
render();
expect(screen.getByRole("button")).toHaveAttribute("aria-label", "Close");
});
});