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);
});
});