import type { ComponentProps } from "react"; import { describe, expect, it, vi } from "vitest"; import { cleanup, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { CustomModelDropdown } from "../CustomModelDropdown"; vi.mock("../ProviderIcon", () => ({ ProviderIcon: () => , })); const models = [{ provider: "openai", id: "gpt-4o", name: "GPT-4o", reasoning: false, contextWindow: 128000 }]; async function openDropdown(props: Partial>) { const user = userEvent.setup(); render(); await user.click(screen.getByRole("button", { name: "Model" })); return user; } describe("CustomModelDropdown credential instance", () => { it.each([undefined, {}, { openai: { instances: [] } }, { openai: { instances: [{ id: "only", isDefault: true }] } }])( "renders no instance control unless the selected provider has two instances", async (credentialInstances) => { await openDropdown({ credentialInstances }); expect(screen.queryByTestId("custom-model-dropdown-credential-instance")).toBeNull(); expect(screen.queryByTestId("custom-model-dropdown-credential-instance-badge")).toBeNull(); }, ); it("keeps hidden menus structurally free of an instance shell at desktop and mobile breakpoints", async () => { for (const width of [1024, 768, 480]) { Object.defineProperty(window, "innerWidth", { configurable: true, value: width }); const user = await openDropdown({ credentialInstances: { openai: { instances: [{ id: "only", isDefault: true }] } } }); const menu = screen.getAllByTestId("model-combobox-portal").at(-1)!; expect([...menu.children].map((element) => element.className)).not.toContain("model-combobox-instance"); expect(screen.queryByTestId("custom-model-dropdown-credential-instance")).toBeNull(); expect(screen.queryByTestId("custom-model-dropdown-credential-instance-badge")).toBeNull(); await user.keyboard("{Escape}"); cleanup(); } }); it("shows availability-driven control even before an owner supplies a persistence callback", async () => { await openDropdown({ credentialInstances: { openai: { instances: [{ id: "primary", isDefault: true }, { id: "backup", isDefault: false }] } }, }); expect(screen.getByTestId("custom-model-dropdown-credential-instance")).toBeDisabled(); }); it("deduplicates instances, preserves a stale selection, and emits empty only for Default", async () => { const onCredentialInstanceChange = vi.fn(); const user = await openDropdown({ credentialInstanceId: "stale", onCredentialInstanceChange, credentialInstances: { openai: { instances: [{ id: "primary", isDefault: true }, { id: "primary", isDefault: false }, { id: "backup", isDefault: false }] }, }, }); const select = screen.getByTestId("custom-model-dropdown-credential-instance") as HTMLSelectElement; expect([...select.options].map((option) => option.value)).toEqual(["", "primary", "backup", "stale"]); expect(select.value).toBe("stale"); await user.selectOptions(select, "backup"); expect(onCredentialInstanceChange).toHaveBeenLastCalledWith("backup"); await user.selectOptions(select, ""); expect(onCredentialInstanceChange).toHaveBeenLastCalledWith(""); }); it("recomputes availability after the selected provider changes without affecting keyboard dismissal", async () => { const user = userEvent.setup(); const onChange = vi.fn(); const onCredentialInstanceChange = vi.fn(); const { rerender } = render( , ); await user.click(screen.getByRole("button", { name: "Model" })); expect(screen.getByTestId("custom-model-dropdown-credential-instance")).toBeTruthy(); rerender( , ); expect(screen.queryByTestId("custom-model-dropdown-credential-instance")).toBeNull(); await user.keyboard("{Escape}"); expect(screen.queryByTestId("model-combobox-portal")).toBeNull(); }); });