import { describe, expect, it, vi, beforeEach } from "vitest" import { renderHook } from "@testing-library/react" import { useInputHasValue, clearInput } from "./utils" describe("useInputHasValue", () => { const createMockRef = (value = "") => ({ current: { value } as HTMLInputElement, }) describe("controlled input (value prop)", () => { it("returns true when value has content", () => { const ref = createMockRef() const { result } = renderHook(() => useInputHasValue("hello", ref)) expect(result.current).toBe(true) }) it("returns false when value is empty string", () => { const ref = createMockRef() const { result } = renderHook(() => useInputHasValue("", ref)) expect(result.current).toBe(false) }) it("returns false when value is only whitespace", () => { const ref = createMockRef() const { result } = renderHook(() => useInputHasValue(" ", ref)) expect(result.current).toBe(false) }) it("updates when value prop changes", () => { const ref = createMockRef() const { result, rerender } = renderHook( ({ value }) => useInputHasValue(value, ref), { initialProps: { value: "" } } ) expect(result.current).toBe(false) rerender({ value: "new value" }) expect(result.current).toBe(true) }) }) }) describe("clearInput", () => { beforeEach(() => { vi.restoreAllMocks() }) it("calls onChange with empty value for controlled input", () => { const onChange = vi.fn() const inputRef = { current: { value: "test", focus: vi.fn(), } as unknown as HTMLInputElement, } clearInput({ inputRef, onChange, value: "test", }) expect(onChange).toHaveBeenCalledWith( expect.objectContaining({ target: { value: "" }, }) ) expect(inputRef.current.focus).toHaveBeenCalled() }) it("sets input value directly for uncontrolled input", () => { const input = document.createElement("input") input.value = "test" const focusSpy = vi.spyOn(input, "focus") const dispatchSpy = vi.spyOn(input, "dispatchEvent") const inputRef = { current: input } clearInput({ inputRef, onChange: undefined, value: undefined, }) expect(input.value).toBe("") expect(dispatchSpy).toHaveBeenCalled() expect(focusSpy).toHaveBeenCalled() }) it("does nothing when ref is null", () => { const onChange = vi.fn() const inputRef = { current: null } clearInput({ inputRef, onChange, value: "test", }) expect(onChange).not.toHaveBeenCalled() }) })