import { fireEvent, render, screen } from "@solidjs/testing-library";
import { createSignal } from "solid-js";
import { describe, expect, it, vi } from "vitest";
import { Combobox } from "../../../src/components/combobox/index";
describe("Combobox – roles", () => {
it("input has role=combobox", () => {
render(() => (
A
B
));
expect(screen.getByRole("combobox")).toBeTruthy();
});
it("content has role=listbox when open", () => {
render(() => (
A
B
));
expect(screen.getByRole("listbox")).toBeTruthy();
});
});
describe("Combobox – input", () => {
it("typing opens content", () => {
const onInput = vi.fn();
render(() => (
A
B
));
fireEvent.input(screen.getByRole("combobox"), { target: { value: "a" } });
expect(onInput).toHaveBeenCalled();
});
it("controlled value works", () => {
render(() => (
{}}>
A
B
));
expect(screen.getByRole("combobox")).toBeTruthy();
});
});
describe("Combobox – keyboard", () => {
it("ArrowDown highlights first item", () => {
render(() => (
A
B
));
fireEvent.keyDown(screen.getByRole("combobox"), { key: "ArrowDown" });
const options = screen.getAllByRole("option");
expect(options[0].getAttribute("data-highlighted")).toBe("");
});
it("Enter selects highlighted item", () => {
const onChange = vi.fn();
render(() => (
A
B
));
fireEvent.keyDown(screen.getByRole("combobox"), { key: "ArrowDown" });
fireEvent.keyDown(screen.getByRole("combobox"), { key: "Enter" });
expect(onChange).toHaveBeenCalledWith("a");
});
it("Escape closes", () => {
render(() => (
A
));
fireEvent.keyDown(screen.getByRole("combobox"), { key: "Escape" });
expect(screen.queryByRole("listbox")).toBeNull();
});
});
describe("Combobox – empty and custom", () => {
it("Empty message shown when no items", () => {
render(() => (
No results
));
expect(screen.getByText("No results")).toBeTruthy();
});
it("allowCustomValue works", () => {
const onChange = vi.fn();
render(() => (
No results
));
const input = screen.getByRole("combobox") as HTMLInputElement;
fireEvent.input(input, { target: { value: "custom" } });
fireEvent.keyDown(input, { key: "Enter" });
expect(onChange).toHaveBeenCalledWith("custom");
});
});