import { render, screen, cleanup } from "@testing-library/react";
import assert from "node:assert";
import { describe, test, afterEach } from "node:test";
import { Grid, GridItem } from "./index";
describe("Grid", () => {
afterEach(() => {
cleanup();
});
/* COMMON */
test("renders without crashing", () => {
render();
assert.notStrictEqual(document.querySelector(".grid"), null);
});
test("applies classes", () => {
render(
);
const element = document.querySelector(".grid");
assert.strictEqual(element?.classList.contains("grid--isGrid"), true);
assert.strictEqual(element?.classList.contains("grid--large"), true);
});
test("passes extra attributes", () => {
render(
);
assert.notStrictEqual(screen.getByTestId("grid"), null);
});
/* TAG PROP */
test("renders with custom tag", () => {
render();
assert.notStrictEqual(document.querySelector("ul.grid"), null);
});
/* COLUMNS */
test("sets columns CSS variables", () => {
const { rerender } = render();
let element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridColumnsDesktop"), "4");
assert.strictEqual(element.style.getPropertyValue("--gridColumnsTablet"), "3");
assert.strictEqual(element.style.getPropertyValue("--gridColumnsMobile"), "2");
rerender();
element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridColumnsDesktop"), "2");
assert.strictEqual(element.style.getPropertyValue("--gridColumnsTablet"), "2");
assert.strictEqual(element.style.getPropertyValue("--gridColumnsMobile"), "1");
rerender();
element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridColumnsDesktop"), "auto");
});
/* GAPS */
test("sets gaps CSS variables", () => {
const { rerender } = render();
let element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridGapDesktop"), "2rem");
assert.strictEqual(element.style.getPropertyValue("--gridGapTablet"), "1rem");
assert.strictEqual(element.style.getPropertyValue("--gridGapMobile"), "0.5rem");
rerender();
element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridGapDesktop"), "1rem");
});
/* ALIGN & JUSTIFY */
test("sets align and justify CSS variables", () => {
const { rerender } = render();
let element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridAlignItemsDesktop"), "center");
assert.strictEqual(element.style.getPropertyValue("--gridAlignItemsTablet"), "start");
assert.strictEqual(element.style.getPropertyValue("--gridAlignItemsMobile"), "end");
rerender();
element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridAlignItemsDesktop"), "center");
rerender();
element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridJustifyContentDesktop"), "center");
assert.strictEqual(element.style.getPropertyValue("--gridJustifyContentTablet"), "space-between");
assert.strictEqual(element.style.getPropertyValue("--gridJustifyContentMobile"), "end");
});
/* STYLES */
test("merges custom styles", () => {
render(
);
const element = document.querySelector(".grid") as HTMLElement;
assert.strictEqual(element.style.getPropertyValue("--gridColumnsDesktop"), "4");
assert.strictEqual(element.style.backgroundColor, "red");
});
/* CHILDREN */
test("renders children", () => {
render(
Child
);
assert.notStrictEqual(screen.getByTestId("child"), null);
});
/* GRID ITEM */
test("renders GridItem with correct tag", () => {
// Первый случай: Grid с tag="ul"
render(
Item
);
const item1 = screen.getByTestId("item");
assert.strictEqual(item1.tagName.toLowerCase(), "li");
// Очищаем и рендерим второй случай
cleanup();
// Второй случай: Grid с tag="div"
render(
Item
);
const item2 = screen.getByTestId("item");
assert.strictEqual(item2.tagName.toLowerCase(), "div");
});
test("GridItem applies classes and styles", () => {
render(
Item
);
const item = screen.getByTestId("item") as HTMLElement;
// Проверяем классы
assert.strictEqual(item.classList.contains("grid__item--large"), true);
assert.strictEqual(item.classList.contains("first"), true);
// Проверяем стили
assert.strictEqual(item.style.getPropertyValue("--gridItemAlignSelf"), "center");
assert.strictEqual(item.style.getPropertyValue("--gridItemJustifySelf"), "end");
assert.strictEqual(item.style.color, "red");
});
/* EDGE CASES */
test("handles no props", () => {
render();
assert.notStrictEqual(document.querySelector(".grid"), null);
});
});