Files
prowler/ui/app/(prowler)/lighthouse/_lib/model-loading.test.ts

127 lines
3.6 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import type {
LighthouseV2Configuration,
LighthouseV2ProviderType,
LighthouseV2SupportedModel,
} from "@/app/(prowler)/lighthouse/_types";
import { loadLighthouseV2ConnectedModels } from "./model-loading";
describe("loadLighthouseV2ConnectedModels", () => {
it("loads models only for connected configurations and initializes the rest as empty", async () => {
// Given
const openAIModel = model("gpt-5.5");
const loadModels = vi.fn(async (providerType: LighthouseV2ProviderType) => {
if (providerType === "openai-compatible") {
return { error: "Connection failed", status: 400 };
}
return { data: [openAIModel] };
});
// When
const result = await loadLighthouseV2ConnectedModels(
[
configuration("openai", true),
configuration("bedrock", false),
configuration("openai-compatible", false),
],
loadModels,
);
// Then
expect(loadModels).toHaveBeenCalledTimes(1);
expect(loadModels).toHaveBeenCalledWith("openai");
expect(result.modelsByProvider).toEqual({
openai: [openAIModel],
bedrock: [],
"openai-compatible": [],
});
expect(result.failedModelProviders).toEqual([]);
});
it("reports model-loading failures only for connected configurations", async () => {
// Given
const loadModels = vi.fn(async (providerType: LighthouseV2ProviderType) => {
if (providerType === "bedrock") {
return { error: "Bedrock models unavailable", status: 503 };
}
throw new Error(`Disconnected provider should not load: ${providerType}`);
});
// When
const result = await loadLighthouseV2ConnectedModels(
[
configuration("openai", false),
configuration("bedrock", true),
configuration("openai-compatible", false),
],
loadModels,
);
// Then
expect(loadModels).toHaveBeenCalledTimes(1);
expect(loadModels).toHaveBeenCalledWith("bedrock");
expect(result.modelsByProvider).toEqual({
openai: [],
bedrock: [],
"openai-compatible": [],
});
expect(result.failedModelProviders).toEqual(["bedrock"]);
});
it("dedupes provider types and treats null connection state as disconnected", async () => {
// Given
const openAIModel = model("gpt-5.5");
const loadModels = vi.fn(async () => ({ data: [openAIModel] }));
// When
const result = await loadLighthouseV2ConnectedModels(
[
configuration("openai", true),
{ ...configuration("openai", true), id: "config-openai-2" },
{ ...configuration("bedrock", false), connected: null },
],
loadModels,
);
// Then
expect(loadModels).toHaveBeenCalledTimes(1);
expect(loadModels).toHaveBeenCalledWith("openai");
expect(result.modelsByProvider.openai).toEqual([openAIModel]);
expect(result.modelsByProvider.bedrock).toEqual([]);
});
});
function configuration(
providerType: LighthouseV2ProviderType,
connected: boolean,
): LighthouseV2Configuration {
return {
id: `config-${providerType}`,
providerType,
baseUrl:
providerType === "openai-compatible" ? "https://example.com" : null,
defaultModel: null,
businessContext: "Production account",
connected,
connectionLastCheckedAt: null,
insertedAt: "2026-06-24T09:00:00Z",
updatedAt: "2026-06-24T10:00:00Z",
};
}
function model(id: string): LighthouseV2SupportedModel {
return {
id,
name: id,
maxInputTokens: null,
maxOutputTokens: null,
supportsFunctionCalling: true,
supportsVision: false,
supportsReasoning: true,
};
}