import { describe, expect, it } from "vitest"; import { IMAGE_MODEL_OPTIONS, evolinkModelCapability, imageModelAfterHealth, imageModelFromJob, templateImageModel } from "@/lib/image-models"; import type { GenerationJob } from "@/lib/types"; function imageJob(overrides: Partial): GenerationJob { return { id: "job-1", ownerId: "owner-1", capability: "image.generate", provider: "evolink", reqKey: "", status: "succeeded", inputAssetIds: [], inputUrls: [], outputAssetIds: [], requestPayload: {}, createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", ...overrides }; } describe("EvoLink image model selection", () => { it("uses the configured model when health loads and preserves a selection made while loading", () => { expect(imageModelAfterHealth(IMAGE_MODEL_OPTIONS, "gpt-image-2.5-flare", "gpt-image-2", false)).toBe("gpt-image-2.5-flare"); expect(imageModelAfterHealth(IMAGE_MODEL_OPTIONS, "gpt-image-2.5-flare", "gpt-image-2.5-sunburst", true)).toBe("gpt-image-2.5-sunburst"); expect(imageModelAfterHealth([{ id: "custom-image" }], "custom-image", "gpt-image-2", false)).toBe("custom-image"); }); it("reads EvoLink defaults even when another image engine is primary", () => { const capability = evolinkModelCapability({ engine: "jimeng", reqKey: "jimeng-model", evolink: { reqKey: "gpt-image-2.5-flare", models: [{ id: "gpt-image-2.5-flare", label: "Image 2.5 Flare" }] } }); expect(capability?.reqKey).toBe("gpt-image-2.5-flare"); expect(imageModelAfterHealth(capability!.models!, capability?.reqKey, "gpt-image-2", false)).toBe("gpt-image-2.5-flare"); expect(evolinkModelCapability({ engine: "evolink", reqKey: "gpt-image-2.5-sunburst" })?.reqKey).toBe("gpt-image-2.5-sunburst"); }); it("uses the configured runtime default for older templates without a saved model", () => { expect(templateImageModel(undefined, "gpt-image-2.5-flare")).toBe("gpt-image-2.5-flare"); expect(templateImageModel("gpt-image-2.5-sunburst", "gpt-image-2.5-flare")).toBe("gpt-image-2.5-sunburst"); }); it("shows the persisted Go model before request fallbacks", () => { expect(imageModelFromJob(imageJob({ reqKey: "gpt-image-2.5-sunburst", requestPayload: { model: "gpt-image-2.5-flare", input: { model: "gpt-image-2" } } }))).toBe("gpt-image-2.5-sunburst"); expect(imageModelFromJob(imageJob({ requestPayload: { model: "gpt-image-2.5-flare" } }))).toBe("gpt-image-2.5-flare"); expect(imageModelFromJob(imageJob({ requestPayload: { input: { model: "gpt-image-2.5-flare" } } }))).toBe("gpt-image-2.5-flare"); expect(imageModelFromJob(imageJob({}))).toBe("gpt-image-2"); expect(imageModelFromJob(imageJob({ provider: "bailian", reqKey: "gpt-image-2.5-flare" }))).toBeUndefined(); }); });