import { resolve } from "node:path"; import { describe, expect, it, vi } from "vitest"; import { render, fireEvent } from "@testing-library/preact"; import { Input } from "./Input.js"; describe("Input", () => { it("renders an input element", () => { const { getByRole } = render(); expect(getByRole("textbox")).toBeTruthy(); }); it("defaults to type text", () => { const { getByRole } = render(); expect(getByRole("textbox")).toHaveAttribute("type", "text"); }); it("accepts type email", () => { const { container } = render(); expect(container.querySelector("input")).toHaveAttribute("type", "email"); }); it("accepts type password", () => { const { container } = render(); expect(container.querySelector("input")).toHaveAttribute("type", "password"); }); it("accepts type number", () => { const { container } = render(); expect(container.querySelector("input")).toHaveAttribute("type", "number"); }); it("accepts type search", () => { const { getByRole } = render(); expect(getByRole("searchbox")).toBeTruthy(); }); it("renders placeholder text", () => { const { getByPlaceholderText } = render( ); expect(getByPlaceholderText("Enter name")).toBeTruthy(); }); it("calls onChange when value changes", () => { const onChange = vi.fn(); const { getByRole } = render( ); fireEvent.input(getByRole("textbox"), { target: { value: "hello" } }); expect(onChange).toHaveBeenCalled(); }); it("sets disabled attribute", () => { const { getByRole } = render(); expect(getByRole("textbox")).toBeDisabled(); }); it("applies error class when error prop is true", () => { const { container } = render(); expect(container.querySelector(".strand-input--error")).toBeTruthy(); }); it("sets aria-invalid when error is true", () => { const { getByRole } = render(); expect(getByRole("textbox")).toHaveAttribute("aria-invalid", "true"); }); it("renders leading addon", () => { const { container } = render( $} /> ); expect(container.querySelector(".strand-input__leading")).toBeTruthy(); }); it("renders trailing addon", () => { const { container } = render( kg} /> ); expect(container.querySelector(".strand-input__trailing")).toBeTruthy(); }); it("forwards ref to input element", () => { let inputEl: HTMLInputElement | null = null; render( { inputEl = el; }} /> ); expect(inputEl).toBeInstanceOf(HTMLInputElement); }); }); import { snapshotFixtures } from "../../test/snapshot.js"; import { snapshotStylesheet } from "../../test/stylesheet.js"; import { fixtures } from "./Input.fixtures.js"; snapshotFixtures(Input, fixtures); snapshotStylesheet(resolve(__dirname, "./Input.css"));