import { render, screen, cleanup } from "@testing-library/react"; import assert from "node:assert"; import { describe, test, afterEach, } from "node:test"; import { Captcha } from "./index"; describe("Captcha", () => { afterEach(() => { cleanup(); }); /* COMMON */ test("renders without crashing", () => { render(); const div = screen.queryByTestId?.("captcha") || document.querySelector("[data-js-google-captcha]"); assert.notStrictEqual(div, null); }); test("renders children when provided", () => { render( Child content ); assert.notStrictEqual(screen.queryByText("Child content"), null); }); /* BASE CLASS */ test("applies base class", () => { render(); const div = screen.queryByTestId?.("captcha") || document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.classList.contains("customCaptcha"), true); }); test("applies extra classes with baseClass prefix", () => { render( ); const div = screen.queryByTestId?.("captcha") || document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.classList.contains("captcha"), true); assert.strictEqual(div?.classList.contains("captcha--large"), true); assert.strictEqual(div?.classList.contains("captcha--bordered"), true); }); /* EXTRA ATTRIBUTES */ test("passes extra attributes", () => { render( ); const div = screen.getByTestId("captcha-container"); assert.strictEqual(div?.getAttribute("aria-label"), "Google Captcha"); assert.strictEqual(div?.getAttribute("id"), "captcha-1"); }); /* DATA ATTRIBUTES */ test("renders with data-js-google-captcha attribute", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.notStrictEqual(div, null); }); test("passes theme to data-theme attribute", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.getAttribute("data-theme"), "dark"); }); test("renders with light theme", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.getAttribute("data-theme"), "light"); }); test("does not render data-theme when theme not provided", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.hasAttribute("data-theme"), false); }); /* SITEKEY */ test("passes siteKey to data-sitekey attribute", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.getAttribute("data-sitekey"), "test-key-123"); }); /* COMBINED PROPS */ test("renders with multiple props combined", () => { render(
Test content
); const div = screen.getByTestId("combined-captcha"); assert.strictEqual(div?.getAttribute("data-theme"), "dark"); assert.strictEqual(div?.classList.contains("customCaptcha"), true); assert.strictEqual(div?.classList.contains("customCaptcha--rounded"), true); assert.strictEqual(div?.getAttribute("data-custom"), "value"); assert.notStrictEqual(screen.queryByText("Test content"), null); }); /* EDGE CASES */ test("handles undefined theme", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.strictEqual(div?.hasAttribute("data-theme"), false); }); test("handles no props", () => { render(); const div = document.querySelector("[data-js-google-captcha]"); assert.notStrictEqual(div, null); assert.strictEqual(div?.hasAttribute("data-theme"), false); assert.strictEqual(div?.hasAttribute("data-sitekey"), false); }); });