Files
OmniRoute/tests/unit/sync-models-freeFilterEmpty.test.ts
Dizzle 8ecdd88c15 fix(pool): diagnose empty pools, align catalog filter, and surface drop reasons (#12795)
Um pool `auto/*` vazio que não diz por que está vazio é a pior forma de falha: o operador vê ausência e não sabe se é config, cota ou catálogo. Registrar qual estágio removeu quantos, e carregar `dropReason` em cada entrada de `quotaHealth.providers`, transforma silêncio em diagnóstico.

Os três defeitos achados de carona valem tanto quanto a feature — em especial a cota livre recorrente sem teto sendo tratada como desconhecida em vez de segura, que é justamente o caso que mais aparece.

Revalidei após reconstruir sobre o tip: **15/15**, typecheck:core limpo, `check-api-typecheck` OK (289).

**Uma mudança minha no `catalogPaidFilter.ts`.** Mantive a sua extração — ela é mais limpa que o predicado inline — mas troquei o corpo para usar `isFreeForProvider` por id. O módulo OR-eava `providerHasFreeModels(resolved) || providerHasFreeModels(canonical)` num único `freeProvider` e depois testava `isFreeModel` em cada um. Com isso, um id cujo próprio provider não documenta tier livre passa a ler como grátis sempre que o alias irmão documenta — que é exatamente o buraco que o #12744 fechou e já está no tip. Por id preserva a garantia; nenhuma outra linha do módulo mudou.

**Dívida registrada:** o `virtualFactory.ts` foi de 1187 para 1219 somando esta onda e cruzou o teto de 1200 pela primeira vez. Congelado com os candidatos a extração nomeados na justificativa.
2026-09-10 09:25:59 -03:00

31 lines
1.4 KiB
TypeScript

/**
* When the free-only import filter matches nothing, the sync must surface an
* empty model list — not silently fall back to the stale synced snapshot.
* Exercises the real prod helper, not a local copy of the ternary.
*/
import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { resolveEffectiveAvailableModels } from "../../src/shared/utils/modelListResolution.ts";
import { selectModelsForImport } from "../../src/shared/utils/freeModels.ts";
describe("sync-models freeFilterEmpty stale cut (prod code)", () => {
it("freeFilterEmpty true → [] even with a stale synced snapshot", () => {
assert.deepEqual(resolveEffectiveAvailableModels(true, [], [{ id: "old" }]), []);
});
it("freeFilterEmpty false → discovered, else synced (legacy paths intact)", () => {
assert.deepEqual(resolveEffectiveAvailableModels(false, [{ id: "new" }], [{ id: "old" }]), [
{ id: "new" },
]);
assert.deepEqual(resolveEffectiveAvailableModels(false, [], [{ id: "old" }]), [{ id: "old" }]);
});
it("end-to-end: selectModelsForImport empty → resolveEffective [] (no stale fallback)", () => {
const { models, freeFilterEmpty } = selectModelsForImport(
"some-provider-without-free-tier",
[{ id: "x/y" }],
true
);
assert.equal(freeFilterEmpty, true);
assert.deepEqual(resolveEffectiveAvailableModels(freeFilterEmpty, models, [{ id: "old" }]), []);
});
});