import { render, screen, cleanup } 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 { Btn } from "./index"; describe("Btn", () => { afterEach(() => { cleanup(); }); /* COMMON */ test("renders without crashing", () => { render(); assert.notStrictEqual(screen.queryByRole("button"), null); }); test("renders label text", () => { render(); assert.notStrictEqual(screen.queryByText("Сохранить"), null); }); test("calls onClick when clicked", async () => { const onClick = mock.fn(); const user = userEvent.setup(); render(); await user.click(screen.getByRole("button")); assert.strictEqual(onClick.mock.calls.length, 1); }); test("does not call onClick when disabled", async () => { const onClick = mock.fn(); const user = userEvent.setup(); render(); await user.click(screen.getByRole("button")); assert.strictEqual(onClick.mock.calls.length, 0); const button = screen.getByRole("button"); assert.strictEqual(button.hasAttribute("disabled"), true); }); test("passes id and form attributes", () => { render(); const button = screen.getByRole("button"); assert.strictEqual(button.getAttribute("id"), "my-btn"); assert.strictEqual(button.getAttribute("form"), "my-form"); }); /* LINK */ test("renders as link when type='link'", () => { render(); const element = screen.getByRole("link"); assert.strictEqual(element.tagName, "A"); }); test("passes href and target to link", () => { render( ); const link = screen.getByRole("link"); assert.strictEqual(link.getAttribute("href"), "https://example.com"); assert.strictEqual(link.getAttribute("target"), "_blank"); }); test("prevents click and navigation for disabled link", async () => { const user = userEvent.setup(); const onClick = mock.fn(); render( ); const link = document.querySelector("a"); assert.ok(link); await user.click(link); assert.strictEqual(onClick.mock.calls.length, 0); assert.strictEqual(link.getAttribute("href"), null); assert.strictEqual(link.getAttribute("aria-disabled"), "true"); assert.strictEqual(link.getAttribute("tabindex"), "-1"); }); test("sets aria-label from title for icon-only button", () => { render(); const button = screen.getByRole("button"); assert.strictEqual(button.getAttribute("aria-label"), "Delete item"); }); /* ICON */ test("renders icon when icon prop is provided", () => { render(); assert.notStrictEqual(screen.queryByTestId("btn-icon"), null); }); /* CHILDREN */ test("renders children instead of label and icon", () => { render( Custom content ); assert.notStrictEqual(screen.queryByText("Custom content"), null); assert.strictEqual(screen.queryByText("Label"), null); }); });