import React from "react"; import { describe, expect, it, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { TrackingRepoSelect } from "../TrackingRepoSelect"; describe("TrackingRepoSelect", () => { it("renders suggestions and selected option", () => { render( , ); const select = screen.getByRole("combobox"); expect(select).toHaveValue("octo/widgets"); expect(screen.queryByRole("textbox")).toBeNull(); }); it("fires onChange when selecting suggestion", async () => { const user = userEvent.setup(); const onChange = vi.fn(); render( , ); await user.selectOptions(screen.getByRole("combobox"), "acme/cli"); expect(onChange).toHaveBeenCalledWith("acme/cli"); }); it("shows custom input and edits custom value", async () => { const user = userEvent.setup(); const onChange = vi.fn(); function Harness() { const [value, setValue] = React.useState(""); return ( { setValue(next); onChange(next); }} options={[{ value: "octo/widgets", label: "octo/widgets" }]} /> ); } render(); await user.selectOptions(screen.getByRole("combobox"), "__custom__"); const input = screen.getByRole("textbox"); await user.type(input, "custom/repo"); expect(onChange).toHaveBeenLastCalledWith("custom/repo"); }); it("treats non-suggestion value as custom", () => { render( , ); expect(screen.getByRole("combobox")).toHaveValue("__custom__"); expect(screen.getByRole("textbox")).toHaveValue("other/repo"); }); it("deduplicates duplicate suggestions", () => { render( , ); const options = screen.getAllByRole("option"); expect(options.filter((option) => option.getAttribute("value") === "octo/widgets")).toHaveLength(1); }); it("renders loading/error hints without disabling custom entry", () => { const { rerender } = render( , ); expect(screen.getByText("Loading detected GitHub remotes…")).toBeInTheDocument(); expect(screen.getByRole("textbox")).toBeInTheDocument(); rerender( , ); expect(screen.getByText("Unable to load remotes")).toBeInTheDocument(); expect(screen.getByRole("textbox")).toBeInTheDocument(); }); });