import { cleanup, render, screen } from "@testing-library/react"; import assert from "node:assert"; import { afterEach, describe, test } from "node:test"; import { ContentPlaceholder } from "./index"; describe("ContentPlaceholder", () => { afterEach(() => { cleanup(); }); test("renders with default props", () => { render(); const container = screen.getByRole("progressbar"); assert.notStrictEqual(container, null); assert.ok(container.classList.contains("contentPlaceholder")); }); test("renders correct number of lines", () => { const { container } = render(); const rects = container.querySelectorAll(".contentPlaceholder__line"); assert.strictEqual(rects.length, 5); }); test("passes extra HTML attributes", () => { render( ); const container = screen.getByTestId("placeholder"); assert.strictEqual(container.getAttribute("aria-label"), "Loading content"); assert.strictEqual(container.getAttribute("id"), "loader-1"); }); test("handles single value for line properties", () => { const { container } = render( ); const rects = container.querySelectorAll(".contentPlaceholder__line"); rects.forEach((rect) => { assert.strictEqual(rect.getAttribute("width"), "400"); assert.strictEqual(rect.getAttribute("height"), "30"); assert.strictEqual(rect.getAttribute("rx"), "4"); assert.strictEqual(rect.getAttribute("ry"), "4"); }); }); test("renders custom children instead of lines", () => { render( ); assert.notStrictEqual(screen.queryByTestId("custom-circle"), null); assert.notStrictEqual(screen.queryByTestId("custom-rect"), null); const standardRects = screen.queryAllByTestId((_, element) => element?.getAttribute("data-testid")?.startsWith("line-") ?? false ); assert.strictEqual(standardRects.length, 0); }); test("calculates correct Y position for each line", () => { const { container } = render( ); const rects = container.querySelectorAll(".contentPlaceholder__line"); // Expected y positions: 0, 30, 60, 90 const expectedY = [ 0, 30, 60, 90 ]; rects.forEach((rect, index) => { assert.strictEqual(rect.getAttribute("y"), String(expectedY[index])); }); }); test("calculates cumulative Y position for variable line heights and margins", () => { const { container } = render( ); const rects = container.querySelectorAll(".contentPlaceholder__line"); const expectedY = [ 0, 15, 45 ]; rects.forEach((rect, index) => { assert.strictEqual(rect.getAttribute("y"), String(expectedY[index])); }); }); test("handles zero lines", () => { const { container } = render(); const rects = container.querySelectorAll(".contentPlaceholder__line"); assert.strictEqual(rects.length, 0); }); });