import { cleanup, render, screen, waitFor, } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import assert from "node:assert"; import { afterEach, describe, mock, test, } from "node:test"; import { MaskedInput } from "./index"; const selectors = { hiddenInput: "input[data-js-component-input='maskedInput']", }; const getHiddenInput = (container: HTMLElement): HTMLInputElement => { const hiddenInput = container.querySelector(selectors.hiddenInput) as HTMLInputElement | null; assert.notStrictEqual(hiddenInput, null); return hiddenInput as HTMLInputElement; }; describe("MaskedInput", () => { afterEach(() => { cleanup(); }); test("renders visible and hidden inputs", () => { const { container } = render(); const visibleInput = screen.getByRole("textbox"); const hiddenInput = getHiddenInput(container); assert.notStrictEqual(visibleInput, null); assert.strictEqual(hiddenInput.type, "hidden"); assert.strictEqual(hiddenInput.name, "phone"); }); test("syncs hidden input with initial value", () => { const { container } = render(); const hiddenInput = getHiddenInput(container); assert.strictEqual(hiddenInput.value, "123"); }); test("updates hidden input value immediately on typing", async () => { const user = userEvent.setup(); const { container } = render(); const visibleInput = screen.getByRole("textbox"); const hiddenInput = getHiddenInput(container); await user.type(visibleInput, "12"); assert.strictEqual(hiddenInput.value, "12"); await user.type(visibleInput, "3"); assert.strictEqual(hiddenInput.value, "123"); }); test("keeps hidden input synchronized by blur time", async () => { const user = userEvent.setup(); let hiddenValueOnBlur = ""; const onBlur = mock.fn((arg) => { const hiddenInput = arg.el?.querySelector(selectors.hiddenInput) as HTMLInputElement | null; hiddenValueOnBlur = hiddenInput?.value || ""; }); const { container } = render( ); const visibleInput = screen.getByRole("textbox"); const hiddenInput = getHiddenInput(container); await user.type(visibleInput, "456"); await user.tab(); await waitFor(() => { assert.strictEqual(onBlur.mock.calls.length, 1); assert.strictEqual(hiddenValueOnBlur, "456"); assert.strictEqual(hiddenInput.value, "456"); }); }); });