| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { autoOffered, defaultModel, modelLabel, modelOptions } from "./ask-model.ts"; |
| 5 | |
| 6 | const anthropic = { |
| 7 | id: "con_1", |
| 8 | provider: "anthropic" as const, |
| 9 | models: ["claude-haiku-5-5", "claude-opus-5-5", "claude-sonnet-5-5"], |
| 10 | config: {}, |
| 11 | }; |
| 12 | |
| 13 | test("Auto is the picker's first option and its default", () => { |
| 14 | assert.deepEqual( |
| 15 | modelOptions(anthropic).map((option) => option.value), |
| 16 | ["auto", "claude-haiku-5-5", "claude-opus-5-5", "claude-sonnet-5-5"], |
| 17 | ); |
| 18 | assert.equal(modelOptions(anthropic)[0]!.label, "Auto"); |
| 19 | // Nothing chosen yet, or another AI provider than Ask's: Auto. |
| 20 | assert.equal(defaultModel(anthropic, null), "auto"); |
| 21 | assert.equal(defaultModel(anthropic, { provider_id: "con_2", model: "gpt-5", auto: false }), "auto"); |
| 22 | // Ask's own AI provider on Auto, as every route that never picked is. |
| 23 | assert.equal(defaultModel(anthropic, { provider_id: "con_1", model: null, auto: true }), "auto"); |
| 24 | }); |
| 25 | |
| 26 | test("an explicit pick stays picked", () => { |
| 27 | assert.equal(defaultModel(anthropic, { provider_id: "con_1", model: "claude-opus-5-5", auto: false }), "claude-opus-5-5"); |
| 28 | // A pick the provider no longer lists falls back to Auto. |
| 29 | assert.equal(defaultModel(anthropic, { provider_id: "con_1", model: "claude-2", auto: false }), "auto"); |
| 30 | }); |
| 31 | |
| 32 | test("an AI provider that lists no models, or an Azure deployment, has no Auto", () => { |
| 33 | const endpoint = { id: "con_3", provider: "openai_endpoint" as const, models: [], config: { model: "qwen3-coder" } }; |
| 34 | assert.equal(autoOffered(endpoint), false); |
| 35 | assert.deepEqual(modelOptions(endpoint), []); |
| 36 | assert.equal(defaultModel(endpoint, null), "qwen3-coder"); |
| 37 | const azure = { id: "con_4", provider: "azure_openai" as const, models: ["gpt-5"], config: { model: "prod-gpt" } }; |
| 38 | assert.equal(autoOffered(azure), false); |
| 39 | assert.equal(defaultModel(azure, { provider_id: "con_4", model: "prod-gpt", auto: false }), "prod-gpt"); |
| 40 | }); |
| 41 | |
| 42 | test("the chosen model reads as Auto, or by its name", () => { |
| 43 | assert.equal(modelLabel({ model: null, auto: true }), "Auto"); |
| 44 | assert.equal(modelLabel({ model: "claude-sonnet-5-5", auto: false }), "claude-sonnet-5-5"); |
| 45 | assert.equal(modelLabel(null), ""); |
| 46 | }); |