import { render, screen, cleanup } from "@testing-library/react"; import assert from "node:assert"; import { describe, test, afterEach } from "node:test"; import { FormattedValue } from "./index"; describe("FormattedValue", () => { afterEach(() => { cleanup(); }); /* COMMON */ test("renders without crashing", () => { render(); const element = document.querySelector(".formattedValue"); assert.notStrictEqual(element, null); }); test("applies extra classes with prefix", () => { render( ); const element = document.querySelector(".formattedValue"); assert.strictEqual(element?.classList.contains("formattedValue--large"), true); assert.strictEqual(element?.classList.contains("formattedValue--bold"), true); }); test("passes extra attributes", () => { render( ); const element = screen.getByTestId("formatted-value"); assert.strictEqual(element.getAttribute("aria-label"), "Formatted number"); }); /* TAG PROP */ test("renders with custom tag", () => { render(); const element = document.querySelector("span.formattedValue"); assert.notStrictEqual(element, null); }); /* VALUE FORMATTING */ test("formats numbers correctly", () => { render( <> ); const values = document.querySelectorAll(".formattedValue__value"); assert.strictEqual(values[0]?.textContent, "1 234 567"); assert.strictEqual(values[1]?.textContent, "1,234,567"); assert.strictEqual(values[2]?.textContent, "1 234.56"); }); test("handles string values", () => { render( <> ); const values = document.querySelectorAll(".formattedValue__value"); assert.strictEqual(values[0]?.textContent, "1 234 567"); assert.strictEqual(values[1]?.textContent, "1 234 567"); }); /* PREFIX AND POSTFIX */ test("renders with prefix and postfix", () => { render(); assert.strictEqual(document.querySelector(".formattedValue__prefix")?.textContent, "$"); assert.strictEqual(document.querySelector(".formattedValue__value")?.textContent, "1 000"); assert.strictEqual(document.querySelector(".formattedValue__postfix")?.textContent, "USD"); }); /* CHILDREN */ test("renders children instead of formatted value", () => { render( Custom ); assert.notStrictEqual(screen.getByTestId("custom"), null); assert.strictEqual(document.querySelector(".formattedValue__value"), null); }); /* EDGE CASES */ test("handles edge values", () => { render( <> ); const values = document.querySelectorAll(".formattedValue__value"); const texts = Array.from(values).map((el) => el.textContent); assert.strictEqual(texts.includes("0"), true); assert.strictEqual(texts.includes("-1 000"), true); assert.strictEqual(texts.includes(""), true); assert.strictEqual(texts.includes("abc"), true); }); /* STRUCTURE */ test("renders with correct structure", () => { render(); const container = document.querySelector(".formattedValue"); assert.strictEqual(container?.children.length, 3); assert.notStrictEqual(document.querySelector(".formattedValue__prefix"), null); assert.notStrictEqual(document.querySelector(".formattedValue__value"), null); assert.notStrictEqual(document.querySelector(".formattedValue__postfix"), null); }); test("does not render prefix/postfix when not provided", () => { render(); assert.strictEqual(document.querySelector(".formattedValue__prefix"), null); assert.strictEqual(document.querySelector(".formattedValue__postfix"), null); assert.strictEqual(document.querySelector(".formattedValue")?.children.length, 1); }); });