import { cleanup, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import assert from "node:assert"; import { describe, test, mock, afterEach, } from "node:test"; import { Checker } from "./index"; describe("Checker", () => { /* COMMON */ afterEach(() => { cleanup(); }); test("renders input with passed label", () => { render(); const input = screen.queryByRole("checkbox"); const label = document.querySelector(".checkbox__label"); assert.notStrictEqual(input, null); assert.notStrictEqual(label, null); assert.strictEqual(label?.textContent, "Text label"); }); test("renders initial isChecked and isDisabled states", () => { render(); const input = screen.getByRole("checkbox") as HTMLInputElement; assert.strictEqual(input.checked, true); assert.strictEqual(input.disabled, true); }); test("should render as checkbox by default", () => { render(); const input = screen.getByRole("checkbox") as HTMLInputElement; assert.notStrictEqual(input, null); assert.strictEqual(input.getAttribute("type"), "checkbox"); }); test("should render as radio when type='radio'", () => { render(); const input = screen.getByRole("radio") as HTMLInputElement; assert.notStrictEqual(input, null); assert.strictEqual(input.getAttribute("type"), "radio"); assert.strictEqual(input.getAttribute("value"), "option1"); }); test("changes state on props change", () => { const { rerender } = render(); const input = screen.getByRole("checkbox") as HTMLInputElement; assert.strictEqual(input.checked, false); rerender(); assert.strictEqual(input.checked, true); }); /* HANDLERS */ test("calls onChange when checker is changed", async () => { const user = userEvent.setup(); const onChange = mock.fn(); render(); await user.click(screen.getByRole("checkbox")); assert.strictEqual(onChange.mock.calls.length, 1); const arg = onChange.mock.calls[0]?.arguments?.[0]; assert.ok(arg && typeof arg === "object"); assert.ok("stateActions" in arg); }); test("does not change checked state and does not call onChange when disabled", async () => { const user = userEvent.setup(); const onChange = mock.fn(); render(); const checker = screen.getByRole("checkbox") as HTMLInputElement; await user.click(checker); assert.strictEqual(onChange.mock.calls.length, 0); assert.strictEqual(checker.checked, true); }); /* CHILDREN */ test("renders children instead of default content", () => { render(
Custom Child
); assert.notStrictEqual(screen.queryByTestId("custom-child"), null); assert.strictEqual(screen.queryByRole("checkbox"), null); }); test("renders html inside label with dangerouslySetInnerHTML", () => { render(Bold Label"} />); const label = document.querySelector(".checkbox__label") as HTMLElement | null; assert.ok(label); assert.strictEqual(label.innerHTML, "Bold Label"); }); });