Files
OmniRoute/tests/unit/copilot-discovery-token.test.ts
Bob.Hou ebdbd2c67d feat(models): live account catalog for Claude, Codex, Copilot, AGY (#12866)
Validado numa worktree combinada com as 16 PRs desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-file-size e check-changelog-integrity OK, complexity 2788/3218 e cognitive 1261/1437, ESLint 0 erros nos 152 arquivos alterados, 771 testes unitários focados, 49 de integração e a suíte vitest:ui completa (2149) verdes.

O ponto que sustenta a PR é o `models.dev` virar overlay de preço em vez de fonte de catálogo. Um catálogo estático que sobrevive à conta já ter listado ids mais novos é o tipo de defeito que só aparece quando o modelo novo é justamente o que se quer usar.

Nota de integração: `activeSyncedCatalog.ts` colidiu com o #12934 (união dos `customModels` do picker no catálogo de despacho). Como você extraiu o bloco original para `loadConnectionCatalog`, os dois se compõem: a união dos irmãos agy/antigravity primeiro, o `unionCustomModels` por cima. Revalidei com `custom-models-live-catalog-12597`, `live-model-catalog-reconciliation-8926`, `sync-models-degraded-cached-catalog-9683`, `models-dev-catalog-read-gate`, `discovery-class`, `reactive-model-sync` e `l1-oauth-autosync-default` juntos — 48/48 — mais typecheck:core limpo.

Sobre o `autoSync` padrão em Claude/Codex/Copilot com scheduler de 6h: passei isso pelo dono antes de mergear e a decisão foi manter como está.
2026-09-07 09:02:59 -03:00

43 lines
1.5 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import { resolveCopilotDiscoveryToken } from "../../src/lib/providerModels/copilotDiscoveryToken.ts";
test("test 8: raw accessToken wins over exchanged copilotToken", () => {
assert.equal(
resolveCopilotDiscoveryToken({
accessToken: "gho_raw",
copilotToken: "tid_exchanged",
}),
"gho_raw",
);
assert.equal(
resolveCopilotDiscoveryToken({ accessToken: "", copilotToken: "tid_exchanged" }),
"tid_exchanged",
);
assert.equal(resolveCopilotDiscoveryToken({ accessToken: " ", copilotToken: " " }), null);
});
test("test 8: github and ghe discovery both prefer raw accessToken via helper", () => {
const source = fs.readFileSync(
path.join(process.cwd(), "src/app/api/providers/[id]/models/route.ts"),
"utf8",
);
const helperSrc = fs.readFileSync(
path.join(process.cwd(), "src/lib/providerModels/copilotDiscoveryToken.ts"),
"utf8",
);
assert.doesNotMatch(helperSrc, /src\/app\/api/);
const calls = source.match(/resolveCopilotDiscoveryToken\(\s*\{[\s\S]*?\}\s*\)/g) ?? [];
assert.equal(calls.length, 2, "github and ghe branches must both call the helper");
for (const call of calls) {
assert.match(call, /accessToken/);
assert.match(call, /copilotToken:\s*psd\.copilotToken/);
}
assert.doesNotMatch(
source,
/toNonEmptyString\(psd\.copilotToken\)\s*\|\|\s*toNonEmptyString\(accessToken\)/,
);
});