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");
});
});