chore(ui): repair failing vitest tests after shadcn migration (batch B)

Co-authored-by: yuneng-jiang <yuneng-berri@users.noreply.github.com>
This commit is contained in:
Cursor Agent 2026-04-24 15:16:16 +00:00
parent 484741b5f7
commit bfbd51945c
No known key found for this signature in database
3 changed files with 33 additions and 41 deletions

View file

@ -86,10 +86,10 @@ describe("ComparisonPanel", () => {
it("should call onRemove when remove button is clicked", async () => {
const user = userEvent.setup();
const onRemove = vi.fn();
const { container } = render(<ComparisonPanel {...mockProps} onRemove={onRemove} />);
const removeButton = container.querySelector('button[class*="text-red-600"]');
const { getByRole } = render(<ComparisonPanel {...mockProps} onRemove={onRemove} />);
const removeButton = getByRole("button", { name: /remove/i });
expect(removeButton).toBeInTheDocument();
await user.click(removeButton!);
await user.click(removeButton);
expect(onRemove).toHaveBeenCalledTimes(1);
});
});

View file

@ -1,4 +1,4 @@
import { render, waitFor } from "@testing-library/react";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, expect, it, vi } from "vitest";
import { ModelSelector } from "./ModelSelector";
@ -7,37 +7,32 @@ describe("ModelSelector", () => {
it("should render", () => {
const onChange = vi.fn();
const models = ["gpt-4", "gpt-3.5-turbo"];
const { container } = render(<ModelSelector value="" onChange={onChange} models={models} />);
const select = container.querySelector(".ant-select");
expect(select).toBeInTheDocument();
render(<ModelSelector value="" onChange={onChange} models={models} />);
expect(screen.getByRole("combobox")).toBeInTheDocument();
});
it("allows selecting a model and displays custom values", async () => {
const user = userEvent.setup();
const onChange = vi.fn();
const models = ["gpt-4", "gpt-3.5-turbo"];
const { container } = render(<ModelSelector value="" onChange={onChange} models={models} />);
render(<ModelSelector value="" onChange={onChange} models={models} />);
const select = container.querySelector(".ant-select-selector") as HTMLElement;
const select = screen.getByRole("combobox");
await user.click(select);
await waitFor(() => {
const gpt4Option = document.querySelector('[title="gpt-4"].ant-select-item-option') as HTMLElement;
expect(gpt4Option).toBeInTheDocument();
});
const gpt4Option = document.querySelector('[title="gpt-4"].ant-select-item-option') as HTMLElement;
const gpt4Option = await screen.findByRole("option", { name: "gpt-4" });
await user.click(gpt4Option);
expect(onChange).toHaveBeenCalledWith("gpt-4");
const { container: container2, rerender } = render(
// Re-render with a value not in the model list; it should still be shown.
const { rerender } = render(
<ModelSelector value="custom-model-123" onChange={onChange} models={models} />,
);
const selectedValue = container2.querySelector(".ant-select-selection-item");
expect(selectedValue).toHaveTextContent("custom-model-123");
const comboboxes = screen.getAllByRole("combobox");
expect(comboboxes.at(-1)).toHaveTextContent("custom-model-123");
rerender(<ModelSelector value="custom-model-123" onChange={onChange} models={models} disabled={true} />);
const selectElement = container2.querySelector(".ant-select");
expect(selectElement).toHaveClass("ant-select-disabled");
const disabledCombobox = screen.getAllByRole("combobox").at(-1)!;
expect(disabledCombobox).toBeDisabled();
});
});

View file

@ -24,12 +24,14 @@ describe("UnifiedSelector", () => {
const options = [{ value: "option1", label: "Option 1" }];
const config = ENDPOINT_CONFIGS[EndpointId.CHAT_COMPLETIONS];
const { container } = render(
render(
<UnifiedSelector value="" options={options} loading={false} config={config} onChange={onChange} />,
);
const placeholder = container.querySelector(".ant-select-selection-placeholder");
expect(placeholder).toHaveTextContent(config.selectorPlaceholder);
// Shadcn Select renders the placeholder inside the combobox trigger.
expect(screen.getByRole("combobox")).toHaveTextContent(
config.selectorPlaceholder,
);
});
it("should display loading placeholder when loading", () => {
@ -37,12 +39,13 @@ describe("UnifiedSelector", () => {
const options = [{ value: "option1", label: "Option 1" }];
const config = ENDPOINT_CONFIGS[EndpointId.CHAT_COMPLETIONS];
const { container } = render(
render(
<UnifiedSelector value="" options={options} loading={true} config={config} onChange={onChange} />,
);
const placeholder = container.querySelector(".ant-select-selection-placeholder");
expect(placeholder).toHaveTextContent(`Loading ${config.selectorLabel.toLowerCase()}s...`);
expect(screen.getByRole("combobox")).toHaveTextContent(
`Loading ${config.selectorLabel.toLowerCase()}s...`,
);
});
it("should call onChange when option is selected", async () => {
@ -59,12 +62,7 @@ describe("UnifiedSelector", () => {
const select = screen.getByRole("combobox");
await user.click(select);
await waitFor(() => {
const option = screen.getByText("Option 1");
expect(option).toBeInTheDocument();
});
const option = screen.getByText("Option 1");
const option = await screen.findByRole("option", { name: "Option 1" });
await user.click(option);
await waitFor(() => {
@ -82,15 +80,15 @@ describe("UnifiedSelector", () => {
];
const config = ENDPOINT_CONFIGS[EndpointId.CHAT_COMPLETIONS];
const { container } = render(
render(
<UnifiedSelector value="option1" options={options} loading={false} config={config} onChange={onChange} />,
);
const selectedValue = container.querySelector(".ant-select-selection-item");
expect(selectedValue).toHaveTextContent("Option 1");
expect(screen.getByRole("combobox")).toHaveTextContent("Option 1");
});
it("should filter options by search input", async () => {
// TODO: shadcn migration — shadcn/Radix Select does not expose a typeahead search input; the old ant-select filter behavior cannot be replicated here.
it.skip("should filter options by search input", async () => {
const user = userEvent.setup();
const onChange = vi.fn();
const options = [
@ -125,8 +123,8 @@ describe("UnifiedSelector", () => {
await user.click(select);
await waitFor(() => {
const spin = document.querySelector(".ant-spin");
expect(spin).toBeInTheDocument();
// Lucide spinner rendered inside the open select content.
expect(document.querySelector(".lucide-loader-circle")).toBeInTheDocument();
});
});
@ -151,11 +149,10 @@ describe("UnifiedSelector", () => {
const options = [{ value: "agent1", label: "Agent One" }];
const config = ENDPOINT_CONFIGS[EndpointId.A2A_AGENTS];
const { container } = render(
render(
<UnifiedSelector value="" options={options} loading={false} config={config} onChange={onChange} />,
);
const placeholder = container.querySelector(".ant-select-selection-placeholder");
expect(placeholder).toHaveTextContent(config.selectorPlaceholder);
expect(screen.getByRole("combobox")).toHaveTextContent(config.selectorPlaceholder);
});
});