Files
OmniRoute/tests/unit/chatcore-request-setup.test.ts
Diego Rodrigues de Sa e Souza 73092146e8 refactor(chatCore): extract resolveChatCoreRequestSetup (first setup-phase slice) (#4392)
Segundo incremento da decomposição do chatCore.ts (5127 LOC). Extrai a primeira
fatia PURA da fase de request-setup do handleChatCore: a metadata de roteamento de
modelo (apiFormat + targetFormat via structural-narrowing sem 'as any', + o
requestedModel com fallback) — para um leaf testável em chatCore/requestSetup.ts.

- resolveChatCoreRequestSetup(modelInfo, body, model): ChatCoreRequestSetup — puro,
  byte-idêntico ao bloco inline. Tipo ChatCoreRequestSetup é a semente do futuro
  ChatCoreContext (as fases maiores — setup/dispatch/streaming — virão depois).
- chatCore.ts: bloco inline (~21 ln) vira 5 linhas.
- 5 testes de caracterização (narrowing + fallback do requestedModel).

185/185 chatcore tests (caracterização do handleChatCore preservada), typecheck 0,
complexity OK 1896 (mudança neutra), file-size encolhe.

Timing: feito como leaf PURO seguro porque a v3.8.30 está finalizando — o
ChatCoreContext mutável (carrega body + 20 inputs no hot-path) cabe melhor em v3.8.31.

Follow-up: atribuir requestSetup.ts a um batch de mutação no nightly (como os demais
chatCore leaves); 5 testes cobrem as branches por ora.
2026-06-20 16:56:23 -03:00

41 lines
2.1 KiB
TypeScript

// tests/unit/chatcore-request-setup.test.ts
// Characterization of resolveChatCoreRequestSetup — the first extracted pure slice of
// chatCore's request-setup phase (god-file decomposition). Locks the structural-narrowing
// of apiFormat/targetFormat and the requestedModel fallback.
import { test } from "node:test";
import assert from "node:assert/strict";
import { resolveChatCoreRequestSetup } from "../../open-sse/handlers/chatCore/requestSetup.ts";
test("reads apiFormat / targetFormat only when present as strings", () => {
const r = resolveChatCoreRequestSetup(
{ apiFormat: "responses", targetFormat: "openai" },
{ model: "gpt-4o" },
"resolved-model"
);
assert.equal(r.apiFormat, "responses");
assert.equal(r.customModelTargetFormat, "openai");
});
test("apiFormat / targetFormat absent or non-string → undefined", () => {
assert.equal(resolveChatCoreRequestSetup({}, {}, "m").apiFormat, undefined);
assert.equal(resolveChatCoreRequestSetup({ apiFormat: 123 }, {}, "m").apiFormat, undefined);
assert.equal(resolveChatCoreRequestSetup({ targetFormat: null }, {}, "m").customModelTargetFormat, undefined);
});
test("modelInfo that is not an object → both markers undefined", () => {
const r = resolveChatCoreRequestSetup(null, { model: "x" }, "m");
assert.equal(r.apiFormat, undefined);
assert.equal(r.customModelTargetFormat, undefined);
});
test("requestedModel uses the client body.model when it is a non-blank string", () => {
assert.equal(resolveChatCoreRequestSetup({}, { model: "claude-3" }, "fallback").requestedModel, "claude-3");
});
test("requestedModel falls back to the resolved model id when body.model is blank/absent/non-string", () => {
assert.equal(resolveChatCoreRequestSetup({}, { model: " " }, "fallback").requestedModel, "fallback");
assert.equal(resolveChatCoreRequestSetup({}, {}, "fallback").requestedModel, "fallback");
assert.equal(resolveChatCoreRequestSetup({}, { model: 42 }, "fallback").requestedModel, "fallback");
assert.equal(resolveChatCoreRequestSetup({}, null, "fallback").requestedModel, "fallback");
});