import React from "react"; import { render, screen } from "@testing-library/react"; import { Box } from "./box"; describe("Box", () => { // ============================================================================ // Rendering Tests // ============================================================================ it("renders with default props", () => { render(Content); expect(screen.getByText("Content")).toBeInTheDocument(); }); it("renders children correctly", () => { render( Child 1 Child 2 ); expect(screen.getByText("Child 1")).toBeInTheDocument(); expect(screen.getByText("Child 2")).toBeInTheDocument(); }); it("renders as div by default", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("DIV"); }); // ============================================================================ // Polymorphic Rendering Tests // ============================================================================ it("renders as different elements via as prop", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("SECTION"); }); it("renders as article", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("ARTICLE"); }); it("renders as main", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("MAIN"); }); it("renders as header", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("HEADER"); }); it("renders as footer", () => { render(Content); const box = screen.getByTestId("box"); expect(box.tagName).toBe("FOOTER"); }); // ============================================================================ // Padding Class Tests // ============================================================================ it("applies padding class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); }); it("applies paddingInline class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-inline-lg"); }); it("applies paddingBlock class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-block-sm"); }); it("applies multiple padding classes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); expect(box).toHaveClass("box-padding-inline-lg"); expect(box).toHaveClass("box-padding-block-sm"); }); it("applies padding-0 class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-0"); }); // ============================================================================ // Margin Class Tests // ============================================================================ it("applies margin class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-margin-lg"); }); it("applies marginInline class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-margin-inline-xl"); }); it("applies marginBlock class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-margin-block-md"); }); it("applies margin-0 class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-margin-0"); }); // ============================================================================ // Width Class Tests // ============================================================================ it("applies width auto class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-width-auto"); }); it("applies width full class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-width-full"); }); it("applies width fit class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-width-fit"); }); it("applies width max class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-width-max"); }); // ============================================================================ // Max-Width Class Tests // ============================================================================ it("applies maxWidth xs class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-xs"); }); it("applies maxWidth sm class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-sm"); }); it("applies maxWidth md class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-md"); }); it("applies maxWidth lg class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-lg"); }); it("applies maxWidth xl class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-xl"); }); it("applies maxWidth container class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-max-width-container"); }); // ============================================================================ // Border Radius Class Tests // ============================================================================ it("applies radius xs class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-xs"); }); it("applies radius sm class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-sm"); }); it("applies radius md class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-md"); }); it("applies radius lg class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-lg"); }); it("applies radius xl class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-xl"); }); it("applies radius full class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-full"); }); it("applies radius 0 class", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-radius-0"); }); // ============================================================================ // Multiple Props Tests // ============================================================================ it("applies multiple utility classes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); expect(box).toHaveClass("box-margin-lg"); expect(box).toHaveClass("box-width-full"); expect(box).toHaveClass("box-max-width-container"); expect(box).toHaveClass("box-radius-md"); }); // ============================================================================ // Custom Class Tests // ============================================================================ it("merges custom className with utility classes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); expect(box).toHaveClass("custom-class"); }); it("merges custom classes with utility classes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); expect(box).toHaveClass("legacy-class"); }); it("merges both className and classes with utility classes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveClass("box-padding-md"); expect(box).toHaveClass("custom-class"); expect(box).toHaveClass("legacy-class"); }); // ============================================================================ // Inline Styles Tests // ============================================================================ it("applies custom styles", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveStyle({ backgroundColor: "rgb(255, 0, 0)" }); expect(box).toHaveStyle({ color: "rgb(255, 255, 255)" }); }); it("accepts CSS custom properties in styles", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveAttribute("style"); }); // ============================================================================ // Ref Forwarding Tests // ============================================================================ it("forwards ref correctly", () => { const ref = React.createRef(); render( Content ); expect(ref.current).toBeInstanceOf(HTMLDivElement); }); it("forwards ref with polymorphic as prop", () => { const ref = React.createRef(); render( Content ); expect(ref.current).toBeInstanceOf(HTMLElement); expect(ref.current?.tagName).toBe("SECTION"); }); // ============================================================================ // Accessibility Tests // ============================================================================ it("forwards ARIA attributes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveAttribute("aria-label", "Test Box"); expect(box).toHaveAttribute("role", "region"); }); it("forwards data attributes", () => { render( Content ); const box = screen.getByTestId("box"); expect(box).toHaveAttribute("data-custom", "value"); }); // ============================================================================ // Edge Cases // ============================================================================ it("handles empty children", () => { render(); const box = screen.getByTestId("box"); expect(box).toBeInTheDocument(); expect(box).toBeEmptyDOMElement(); }); it("handles no props gracefully", () => { render(Content); const box = screen.getByTestId("box"); expect(box).toBeInTheDocument(); expect(box.tagName).toBe("DIV"); }); it("does not apply classes when no spacing props provided", () => { render(Content); const box = screen.getByTestId("box"); // Should not have any box-* utility classes const classList = Array.from(box.classList); const hasBoxUtilityClass = classList.some((cls) => cls.startsWith("box-")); expect(hasBoxUtilityClass).toBe(false); }); });