import React from "react";
import { List } from "./index";
import { ListItem } from "./list-item";
import { render, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
describe("List", () => {
describe("Rendering", () => {
it("renders as ul by default", () => {
const { container } = render(
);
expect(container.querySelector("ul")).toBeInTheDocument();
});
it("renders as ol when type='ol'", () => {
const { container } = render(
);
expect(container.querySelector("ol")).toBeInTheDocument();
});
it("has correct displayName", () => {
expect(List.displayName).toBe("List");
});
it("renders children content", () => {
render(
Item 1
);
expect(screen.getByText("Item 1")).toBeInTheDocument();
});
it("renders items from items prop", () => {
const items = [
{ id: 1, content: "First" },
{ id: 2, content: "Second" },
];
render(
);
expect(screen.getByText("First")).toBeInTheDocument();
expect(screen.getByText("Second")).toBeInTheDocument();
});
it("renders nothing when items is empty", () => {
const { container } = render(
);
expect(container.querySelector("ul")?.children).toHaveLength(0);
});
it("uses renderItem when provided", () => {
const items = [
{ id: 1, content: "First" },
{ id: 2, content: "Second" },
];
const renderItem = (item: any, index: number) => (
Custom: {item.content}
);
render(
);
expect(screen.getByText("Custom: First")).toBeInTheDocument();
expect(screen.getByTestId("custom-0")).toBeInTheDocument();
});
});
describe("Variants", () => {
it("applies unstyled variant with no extra classes", () => {
const { container } = render(
);
const el = container.querySelector("ul");
expect(el?.className).toContain("list--unstyled");
});
it("applies default variant classes for ul", () => {
const { container } = render(
);
const el = container.querySelector("ul");
expect(el?.className).toContain("list--default");
expect(el?.className).toContain("list-disc");
});
it("applies default variant classes for ol", () => {
const { container } = render(
);
const el = container.querySelector("ol");
expect(el?.className).toContain("list-decimal");
});
});
describe("Props", () => {
it("applies custom className", () => {
const { container } = render(
);
expect(container.querySelector("ul")?.className).toContain("my-list");
});
it("applies inline style", () => {
const { container } = render(
);
expect(container.querySelector("ul")?.style.color).toBe("blue");
});
it("forwards ref to ul element", () => {
const ref = React.createRef();
render(
);
expect(ref.current).toBeInstanceOf(HTMLUListElement);
});
it("forwards ref to ol element", () => {
const ref = React.createRef();
render(
);
expect(ref.current).toBeInstanceOf(HTMLOListElement);
});
it("passes item className to ListItem", () => {
const items = [{ id: 1, content: "Item", className: "item-class" }];
render(
);
const li = screen.getByText("Item");
expect(li.className).toContain("item-class");
});
});
});
describe("ListItem", () => {
it("renders children content", () => {
render(Hello);
expect(screen.getByText("Hello")).toBeInTheDocument();
});
it("has correct displayName", () => {
expect(ListItem.displayName).toBe("ListItem");
});
it("renders as li element", () => {
render(Item);
expect(screen.getByText("Item").tagName).toBe("LI");
});
it("applies custom className", () => {
render(Item);
expect(screen.getByText("Item").className).toContain("custom");
});
it("applies unstyled variant", () => {
render(Item);
const el = screen.getByText("Item");
expect(el.className).toContain("list-item--unstyled");
});
it("applies default variant classes", () => {
render(Item);
const el = screen.getByText("Item");
expect(el.className).toContain("list-item--default");
expect(el.className).toContain("mb-1");
});
it("applies inline style", () => {
render(Item);
expect(screen.getByText("Item").style.color).toBe("green");
});
it("forwards ref to li element", () => {
const ref = React.createRef();
render(Item);
expect(ref.current).toBeInstanceOf(HTMLLIElement);
});
it("passes additional HTML attributes", () => {
render(Item);
expect(screen.getByTestId("li-item")).toBeInTheDocument();
});
});