import { describe, expect, test } from "bun:test"; import type { ProviderListItem } from "../src/app/types"; import { getModelBehaviorOptions, nextModelBehaviorValue, previousModelBehaviorValue, } from "../src/app/lib/model-behavior"; type ProviderModel = ProviderListItem["models"][string]; const model: ProviderModel = { id: "test-model", providerID: "openai", api: { id: "test-model", url: "https://example.com", npm: "@ai-sdk/openai-compatible", }, name: "Test model", capabilities: { temperature: true, reasoning: true, attachment: false, toolcall: true, input: { text: true, audio: false, image: false, video: false, pdf: false, }, output: { text: true, audio: false, image: false, video: false, pdf: false, }, interleaved: false, }, cost: { input: 0, output: 0, cache: { read: 0, write: 0, }, }, limit: { context: 1, output: 1, }, status: "active", options: {}, headers: {}, release_date: "2026-01-01", variants: { none: {}, low: {}, medium: {}, high: {}, xhigh: {}, max: {}, }, }; describe("model behavior options", () => { test("uses only the raw effort values reported by the model", () => { const options = getModelBehaviorOptions("openai", model); expect(options.map(({ value, label }) => ({ value, label }))).toEqual([ { value: "none", label: "None" }, { value: "low", label: "Low" }, { value: "medium", label: "Medium" }, { value: "high", label: "High" }, { value: "xhigh", label: "Xhigh" }, { value: "max", label: "Max" }, ]); }); test("cycles explicit effort values and wraps", () => { const options = getModelBehaviorOptions("openai", model); expect(nextModelBehaviorValue(options, "low")).toBe("medium"); expect(nextModelBehaviorValue(options, "max")).toBe("none"); expect(nextModelBehaviorValue(options, null)).toBe("none"); }); test("does not cycle models with fewer than two effort values", () => { expect(nextModelBehaviorValue([], null)).toBeNull(); expect(nextModelBehaviorValue([{ value: "high" }], "high")).toBeNull(); }); test("cycles explicit effort values backward and wraps", () => { const options = getModelBehaviorOptions("openai", model); expect(previousModelBehaviorValue(options, "medium")).toBe("low"); expect(previousModelBehaviorValue(options, "none")).toBe("max"); expect(previousModelBehaviorValue(options, null)).toBe("max"); }); test("does not cycle backward with fewer than two effort values", () => { expect(previousModelBehaviorValue([], null)).toBeNull(); expect(previousModelBehaviorValue([{ value: "high" }], "high")).toBeNull(); }); });