import { fireEvent, render, screen } from "@solidjs/testing-library"; import { describe, expect, it, vi } from "vitest"; import { NumberField } from "../../../src/components/number-field/index"; describe("NumberField basics", () => { it("input has role=spinbutton", () => { render(() => ( )); expect(screen.getByRole("spinbutton")).toBeTruthy(); }); it("sets aria-valuenow", () => { render(() => ( )); expect(screen.getByRole("spinbutton").getAttribute("aria-valuenow")).toBe("5"); }); it("label linked to input", () => { render(() => ( Quantity )); const label = screen.getByText("Quantity"); const input = screen.getByRole("spinbutton"); expect(label.getAttribute("for")).toBe(input.id); }); }); describe("NumberField interactions", () => { it("increment button increases value", () => { const onChange = vi.fn(); render(() => ( + )); fireEvent.click(screen.getByText("+")); expect(onChange).toHaveBeenCalledWith(6); }); it("decrement button decreases value", () => { const onChange = vi.fn(); render(() => ( - )); fireEvent.click(screen.getByText("-")); expect(onChange).toHaveBeenCalledWith(4); }); it("respects min/max", () => { const onChange = vi.fn(); render(() => ( + )); fireEvent.click(screen.getByText("+")); expect(onChange).not.toHaveBeenCalled(); }); it("ArrowUp increments", () => { const onChange = vi.fn(); render(() => ( )); fireEvent.keyDown(screen.getByRole("spinbutton"), { key: "ArrowUp" }); expect(onChange).toHaveBeenCalledWith(6); }); });