diff --git a/__tests__/components/button.spec.tsx b/__tests__/components/button.spec.tsx new file mode 100644 index 0000000..257a8e3 --- /dev/null +++ b/__tests__/components/button.spec.tsx @@ -0,0 +1,58 @@ +import { render, screen } from "@testing-library/react" + +import { Button } from "@/components/Button/Button" + +describe("Button component", () => { + it("renders with default intent and size", () => { + render() + const btn = screen.getByRole("link", { name: /default button/i }) + expect(btn).toBeInTheDocument() + expect(btn).toHaveClass("bg-blue-400") + expect(btn).toHaveClass("text-lg") + }) + + it("renders secondary intent correctly", () => { + render() + const btn = screen.getByRole("link", { name: /secondary button/i }) + expect(btn).toHaveClass("bg-transparent") + expect(btn).toHaveClass("text-blue-400") + }) + + it("renders small size correctly", () => { + render() + const btn = screen.getByRole("link", { name: /small button/i }) + expect(btn).toHaveClass("text-sm") + expect(btn).toHaveClass("min-w-20") + }) + + it("applies underline when underline prop is true", () => { + render() + const btn = screen.getByRole("link", { name: /underlined button/i }) + expect(btn).toHaveClass("underline") + }) + + it("does not apply underline class when underline prop is false or omitted", () => { + render() + const btn = screen.getByRole("link", { name: /no underline/i }) + expect(btn).not.toHaveClass("underline") + }) + + it("merges custom className with variant classes", () => { + render() + const btn = screen.getByRole("link", { name: /custom class button/i }) + expect(btn).toHaveClass("custom-class") + expect(btn).toHaveClass("bg-blue-400") + }) + + it("forwards href and other props correctly", () => { + render() + const btn = screen.getByRole("link", { name: /link button/i }) + expect(btn).toHaveAttribute("href", "/test") + expect(btn).toHaveAttribute("rel", "noopener noreferrer") + }) + + it("renders children inside the anchor tag", () => { + render() + expect(screen.getByText("Click Me")).toBeInTheDocument() + }) +})