ar08's picture
Upload 1040 files
246d201 verified
import { describe, it, expect, vi } from "vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { ModelSelector } from "#/components/shared/modals/settings/model-selector";
import { I18nKey } from "#/i18n/declaration";
// Mock react-i18next
vi.mock("react-i18next", () => ({
useTranslation: () => ({
t: (key: string) => {
const translations: { [key: string]: string } = {
LLM$PROVIDER: "LLM Provider",
LLM$MODEL: "LLM Model",
LLM$SELECT_PROVIDER_PLACEHOLDER: "Select a provider",
LLM$SELECT_MODEL_PLACEHOLDER: "Select a model",
};
return translations[key] || key;
},
}),
}));
describe("ModelSelector", () => {
const models = {
openai: {
separator: "/",
models: ["gpt-4o", "gpt-4o-mini"],
},
azure: {
separator: "/",
models: ["ada", "gpt-35-turbo"],
},
vertex_ai: {
separator: "/",
models: ["chat-bison", "chat-bison-32k"],
},
cohere: {
separator: ".",
models: ["command-r-v1:0"],
},
};
it("should display the provider selector", async () => {
const user = userEvent.setup();
render(<ModelSelector models={models} />);
const selector = screen.getByLabelText("LLM Provider");
expect(selector).toBeInTheDocument();
await user.click(selector);
expect(screen.getByText("OpenAI")).toBeInTheDocument();
expect(screen.getByText("Azure")).toBeInTheDocument();
expect(screen.getByText("VertexAI")).toBeInTheDocument();
expect(screen.getByText("cohere")).toBeInTheDocument();
});
it("should disable the model selector if the provider is not selected", async () => {
const user = userEvent.setup();
render(<ModelSelector models={models} />);
const modelSelector = screen.getByLabelText("LLM Model");
expect(modelSelector).toBeDisabled();
const providerSelector = screen.getByLabelText("LLM Provider");
await user.click(providerSelector);
const vertexAI = screen.getByText("VertexAI");
await user.click(vertexAI);
expect(modelSelector).not.toBeDisabled();
});
it("should display the model selector", async () => {
const user = userEvent.setup();
render(<ModelSelector models={models} />);
const providerSelector = screen.getByLabelText("LLM Provider");
await user.click(providerSelector);
const azureProvider = screen.getByText("Azure");
await user.click(azureProvider);
const modelSelector = screen.getByLabelText("LLM Model");
await user.click(modelSelector);
expect(screen.getByText("ada")).toBeInTheDocument();
expect(screen.getByText("gpt-35-turbo")).toBeInTheDocument();
await user.click(providerSelector);
const vertexProvider = screen.getByText("VertexAI");
await user.click(vertexProvider);
await user.click(modelSelector);
// Test fails when expecting these values to be present.
// My hypothesis is that it has something to do with NextUI's
// list virtualization
// expect(screen.getByText("chat-bison")).toBeInTheDocument();
// expect(screen.getByText("chat-bison-32k")).toBeInTheDocument();
});
it("should call onModelChange when the model is changed", async () => {
const user = userEvent.setup();
render(<ModelSelector models={models} />);
const providerSelector = screen.getByLabelText("LLM Provider");
const modelSelector = screen.getByLabelText("LLM Model");
await user.click(providerSelector);
await user.click(screen.getByText("Azure"));
await user.click(modelSelector);
await user.click(screen.getByText("ada"));
await user.click(modelSelector);
await user.click(screen.getByText("gpt-35-turbo"));
await user.click(providerSelector);
await user.click(screen.getByText("cohere"));
await user.click(modelSelector);
// Test fails when expecting this values to be present.
// My hypothesis is that it has something to do with NextUI's
// list virtualization
// await user.click(screen.getByText("command-r-v1:0"));
});
it("should have a default value if passed", async () => {
render(<ModelSelector models={models} currentModel="azure/ada" />);
expect(screen.getByLabelText("LLM Provider")).toHaveValue("Azure");
expect(screen.getByLabelText("LLM Model")).toHaveValue("ada");
});
});