From d00f2d9c0cc5f6cbc75c1e2fef03bfc9a36fe31c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 15 Jan 2026 22:28:20 +0000 Subject: [PATCH] test: cover model picker ordering and openrouter index --- ...uick-model-picker-grouped-by-model.test.ts | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/auto-reply/reply.triggers.trigger-handling.shows-quick-model-picker-grouped-by-model.test.ts b/src/auto-reply/reply.triggers.trigger-handling.shows-quick-model-picker-grouped-by-model.test.ts index 3a8569800..9fc8eca80 100644 --- a/src/auto-reply/reply.triggers.trigger-handling.shows-quick-model-picker-grouped-by-model.test.ts +++ b/src/auto-reply/reply.triggers.trigger-handling.shows-quick-model-picker-grouped-by-model.test.ts @@ -125,6 +125,93 @@ describe("trigger handling", () => { expect(normalized).not.toContain("image"); }); }); + it("orders provider/model pairs by provider preference", async () => { + await withTempHome(async (home) => { + const cfg = makeCfg(home); + const res = await getReplyFromConfig( + { + Body: "/model", + From: "telegram:111", + To: "telegram:111", + ChatType: "direct", + Provider: "telegram", + Surface: "telegram", + SessionKey: "telegram:slash:111", + }, + {}, + cfg, + ); + + const text = Array.isArray(res) ? res[0]?.text : res?.text; + const normalized = normalizeTestText(text ?? ""); + const anthropicIndex = normalized.indexOf("anthropic/claude-opus-4-5"); + const openrouterIndex = normalized.indexOf("openrouter/anthropic/claude-opus-4-5"); + const openaiIndex = normalized.indexOf("openai/gpt-4.1-mini"); + const codexIndex = normalized.indexOf("openai-codex/gpt-5.2"); + expect(anthropicIndex).toBeGreaterThanOrEqual(0); + expect(openrouterIndex).toBeGreaterThanOrEqual(0); + expect(openaiIndex).toBeGreaterThanOrEqual(0); + expect(codexIndex).toBeGreaterThanOrEqual(0); + expect(anthropicIndex).toBeLessThan(openrouterIndex); + expect(openaiIndex).toBeLessThan(codexIndex); + }); + }); + it("selects the exact provider/model pair for openrouter by index", async () => { + await withTempHome(async (home) => { + const cfg = makeCfg(home); + const sessionKey = "telegram:slash:111"; + const list = await getReplyFromConfig( + { + Body: "/model", + From: "telegram:111", + To: "telegram:111", + ChatType: "direct", + Provider: "telegram", + Surface: "telegram", + SessionKey: sessionKey, + }, + {}, + cfg, + ); + + const listText = Array.isArray(list) ? list[0]?.text : list?.text; + const lines = normalizeTestText(listText ?? "") + .split("\n") + .map((line) => line.trim()) + .filter(Boolean); + const targetLine = lines.find((line) => + line.includes("openrouter/anthropic/claude-opus-4-5"), + ); + expect(targetLine).toBeDefined(); + const match = targetLine?.match(/^(\d+)\)/); + expect(match?.[1]).toBeDefined(); + const index = Number.parseInt(match?.[1] ?? "", 10); + expect(Number.isFinite(index)).toBe(true); + + const res = await getReplyFromConfig( + { + Body: `/model ${index}`, + From: "telegram:111", + To: "telegram:111", + ChatType: "direct", + Provider: "telegram", + Surface: "telegram", + SessionKey: sessionKey, + }, + {}, + cfg, + ); + + const text = Array.isArray(res) ? res[0]?.text : res?.text; + expect(normalizeTestText(text ?? "")).toContain( + "Model set to openrouter/anthropic/claude-opus-4-5", + ); + + const store = loadSessionStore(cfg.session.store); + expect(store[sessionKey]?.providerOverride).toBe("openrouter"); + expect(store[sessionKey]?.modelOverride).toBe("anthropic/claude-opus-4-5"); + }); + }); it("rejects invalid /model <#> selections", async () => { await withTempHome(async (home) => { const cfg = makeCfg(home);