mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-26 17:12:27 +03:00
* feat(homolog): scaffolding da suíte de homologação E2E (deps + npm run homolog) * feat(homolog): L0 avaliador de paridade de deploy (TDD) * feat(homolog): L1a ciclo de vida de API key efêmera (login admin -> create -> revoke) * feat(homolog): L1b suite httpYac de API (models, chat, auth de management, health) * feat(homolog): L1c checker SSE de streaming real (TDD no parser) * feat(homolog): L2 smoke de providers reais via promptfoo gerado do catálogo * feat(homolog): L4a Playwright homolog config + login storageState * feat(homolog): L4b smoke de todas as rotas do dashboard (descoberta via fs) * feat(homolog): L4c fluxo criar/revogar API key pela UI * fix(homolog): resiliencia real-environment — stream:false no smoke promptfoo, retry de socket keep-alive, key efemera com sufixo unico * feat(homolog): L5 orquestrador npm run homolog + relatorio CTRF unificado * docs(homolog): guia de operacao da suite + fragment de changelog + allowlist env-doc-sync * fix(homolog): paraleliza o sweep de rotas do dashboard (fullyParallel + 8 workers) * fix(homolog): isola outputs crus em homolog-report/raw para nao quebrar o ctrf merge * fix(homolog): outputDir absoluto do reporter CTRF da UI (path relativo escapava do worktree) * chore(quality): allowlist the 5 homolog-suite devDependencies (ctrf-io trio, httpyac, promptfoo) after registry verification * chore(quality): register the homolog Playwright suite as a test-discovery collector (run.mjs -> tests/homolog/ui)
29 lines
1.3 KiB
TypeScript
29 lines
1.3 KiB
TypeScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { parseSseChunk, summarizeStream } from "../../scripts/homolog/lib/sseCheck.mjs";
|
|
|
|
test("parseSseChunk separa eventos data: e detecta [DONE]", () => {
|
|
const events = parseSseChunk('data: {"choices":[{"delta":{"content":"O"}}]}\n\ndata: [DONE]\n\n');
|
|
assert.equal(events.length, 2);
|
|
assert.equal(events[1], "[DONE]");
|
|
});
|
|
|
|
test("parseSseChunk acha data: mesmo precedido de comment-lines SSE no mesmo bloco", () => {
|
|
// Formato real da VPS (v3.8.47): trailers de telemetria como comments (`: x-omniroute-*`)
|
|
// no MESMO bloco do data: [DONE] — o parser não pode olhar só o início do bloco.
|
|
const chunk =
|
|
'data: {"choices":[{"delta":{"content":"OK"}}]}\n\n' +
|
|
": x-omniroute-cache-hit=false\n: x-omniroute-latency-ms=67\ndata: [DONE]\n\n";
|
|
const events = parseSseChunk(chunk);
|
|
assert.deepEqual(events, ['{"choices":[{"delta":{"content":"OK"}}]}', "[DONE]"]);
|
|
});
|
|
|
|
test("summarizeStream exige >=1 delta de conteúdo e terminador [DONE]", () => {
|
|
const good = summarizeStream(['{"choices":[{"delta":{"content":"OK"}}]}', "[DONE]"]);
|
|
assert.equal(good.ok, true);
|
|
const noDone = summarizeStream(['{"choices":[{"delta":{"content":"OK"}}]}']);
|
|
assert.equal(noDone.ok, false);
|
|
const noContent = summarizeStream(["[DONE]"]);
|
|
assert.equal(noContent.ok, false);
|
|
});
|