Compare commits

...

1 Commits

Author SHA1 Message Date
Xiangzhe
4e214dab99 test(mcp): declara a precondição de env dos testes de principal do CCR/MCP
`resolveCcrPrincipal` dá precedência a `resolveMcpCallerApiKeyId()`, que no
transporte stdio cai em `OMNIROUTE_API_KEY`/`ROUTER_API_KEY`. Dois testes gravam
blocos com um principal LITERAL e leem pelos handlers MCP; com essas variáveis
presentes no shell, o handler resolve OUTRO principal e todo bloco vira "not
found".

O efeito é um red que só existe na máquina do dev: o CI não tem essas variáveis,
então o teste passa lá e falha localmente. Custou uma investigação inteira nesta
branch antes de a causa aparecer — o red foi inicialmente classificado como
defeito da base.

A precondição já existia, só não estava escrita. Agora está, no mesmo idioma de
api-key-lifecycle.test.ts, cli-remote-mode.test.ts e do irmão
ccr-mcp-principal-5649.test.ts (que aprendeu isso no #7883): salvar, deletar no
topo, restaurar no `after`.

Nenhum código de produção mudou — não havia defeito de produção. Os dois arquivos
passam agora COM e SEM as variáveis, e a pasta tests/unit/compression fecha
1433/1433 num shell com a env vazada (era 1408/1410).
2026-08-18 16:20:26 -03:00
2 changed files with 35 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
import { describe, it, beforeEach } from "node:test";
import { describe, it, beforeEach, after } from "node:test";
import assert from "node:assert/strict";
import { mkdtempSync } from "node:fs";
import { tmpdir } from "node:os";
@@ -6,6 +6,24 @@ import { join } from "node:path";
process.env.DATA_DIR = mkdtempSync(join(tmpdir(), "omniroute-ccr-mcp-"));
// `resolveCcrPrincipal` dá precedência a `resolveMcpCallerApiKeyId()`, que cai em
// `OMNIROUTE_API_KEY`/`ROUTER_API_KEY` no transporte stdio. Estes testes gravam blocos
// com um principal LITERAL ("tenant-a") e leem pelos handlers MCP: com a env presente no
// shell, o handler resolve um principal diferente e todo bloco vira "not found" — red
// fantasma que não reproduz no CI, onde a env não existe. A precondição era implícita;
// aqui ela passa a ser declarada. Mesmo idioma de api-key-lifecycle e cli-remote-mode.
const ORIGINAL_OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY;
const ORIGINAL_ROUTER_API_KEY = process.env.ROUTER_API_KEY;
delete process.env.OMNIROUTE_API_KEY;
delete process.env.ROUTER_API_KEY;
after(() => {
if (ORIGINAL_OMNIROUTE_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY;
else process.env.OMNIROUTE_API_KEY = ORIGINAL_OMNIROUTE_API_KEY;
if (ORIGINAL_ROUTER_API_KEY === undefined) delete process.env.ROUTER_API_KEY;
else process.env.ROUTER_API_KEY = ORIGINAL_ROUTER_API_KEY;
});
const ccr = await import("../../../open-sse/services/compression/engines/ccr/index.ts");
const tools = await import("../../../open-sse/mcp-server/tools/compressionTools.ts");
const schemas = await import("../../../open-sse/mcp-server/schemas/tools.ts");

View File

@@ -18,6 +18,22 @@ import assert from "node:assert/strict";
// call. If `extra` is dropped, the caller resolves to "anonymous", the store key
// misses, and retrieval errors out.
// A precondição deste teste é que NÃO exista um principal de API key resolvível: ele
// prova que o `extra` chega ao handler comparando o principal derivado de `clientId`. Com
// `OMNIROUTE_API_KEY` no shell, `resolveMcpCallerApiKeyId()` resolve primeiro e mascara
// exatamente o que o teste mede — red fantasma local que não reproduz no CI.
const ORIGINAL_OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY;
const ORIGINAL_ROUTER_API_KEY = process.env.ROUTER_API_KEY;
delete process.env.OMNIROUTE_API_KEY;
delete process.env.ROUTER_API_KEY;
test.after(() => {
if (ORIGINAL_OMNIROUTE_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY;
else process.env.OMNIROUTE_API_KEY = ORIGINAL_OMNIROUTE_API_KEY;
if (ORIGINAL_ROUTER_API_KEY === undefined) delete process.env.ROUTER_API_KEY;
else process.env.ROUTER_API_KEY = ORIGINAL_ROUTER_API_KEY;
});
const { createMcpServer } = await import("../../open-sse/mcp-server/server.ts");
const { storeBlock, resetCcrStore } = await import(
"../../open-sse/services/compression/engines/ccr/index.ts"