Files
lemonspace_app/tests/lib/ai-models.test.ts

45 lines
1.4 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
DEFAULT_MODEL_ID,
IMAGE_MODELS,
getAvailableImageModels,
getModel,
} from "@/lib/ai-models";
import { IMAGE_MODELS as OPENROUTER_MODELS } from "@/convex/openrouter";
describe("ai image models registry", () => {
it("contains all 9 PRD models in stable order", () => {
expect(IMAGE_MODELS.map((model) => model.id)).toEqual([
"google/gemini-2.5-flash-image",
"black-forest-labs/flux.2-klein-4b",
"bytedance-seed/seedream-4.5",
"google/gemini-3.1-flash-image-preview",
"openai/gpt-5-image-mini",
"sourceful/riverflow-v2-fast",
"sourceful/riverflow-v2-pro",
"google/gemini-3-pro-image-preview",
"openai/gpt-5-image",
]);
expect(DEFAULT_MODEL_ID).toBe("google/gemini-2.5-flash-image");
});
it("filters by subscription tier", () => {
expect(getAvailableImageModels("free").every((model) => model.minTier === "free")).toBe(
true,
);
});
it("resolves model lookup", () => {
expect(getModel(DEFAULT_MODEL_ID)?.creditCost).toBeGreaterThan(0);
});
it("keeps frontend and backend image model ids and credit costs in sync", () => {
expect(Object.keys(OPENROUTER_MODELS)).toEqual(IMAGE_MODELS.map((model) => model.id));
for (const model of IMAGE_MODELS) {
expect(OPENROUTER_MODELS[model.id]?.creditCost).toBe(model.creditCost);
}
});
});