Files
OmniRoute/tests/unit/zai-web-stream-error-boundary.test.ts
Diego Rodrigues de Sa e Souza 855eda16d3 fix(zai): treat HTTP 200 stream errors as failures (#12454)
Validado em lote numa worktree combinada com os 14 PRs desta campanha de error-boundary sobre o tip de `release/v3.8.51`: `typecheck:core` limpo e **120/120** nos 23 arquivos de teste que os PRs trazem.

Um ponto que só apareceu no tree combinado: **#12465 e #12466 criam o mesmo arquivo novo** `open-sse/utils/streamReadiness.ts` (que não existe no tip) com desenhos divergentes de cancelamento — `cancelled` + `releaseLock` imediato num, `readInFlight`/`cancelRequested` com `cancelReader` fire-and-forget no outro. Adotei a versão do #12466, que difere e defere o release do lock para quando a leitura em voo termina, e validei a escolha rodando as suítes dos **dois** PRs contra ela: 21/21 no readiness compartilhado e 22/22 incluindo o boundary do Perplexity.
2026-09-03 20:58:22 -03:00

44 lines
1.7 KiB
TypeScript

import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import test from "node:test";
import { fileURLToPath } from "node:url";
const fixture = fileURLToPath(
new URL("../fixtures/zai-web-stream-error-boundary.fixture.ts", import.meta.url)
);
test("Z.ai stream error boundaries pass in a process-isolated fixture", () => {
const testRoot = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-zai-stream-boundary-"));
const childEnv: NodeJS.ProcessEnv = {
API_KEY_SECRET: "zai-stream-boundary-test-only-secret",
DATA_DIR: path.join(testRoot, "data"),
OMNIROUTE_PLUGINS_DIR: path.join(testRoot, "plugins"),
};
// The parent itself is a node:test process. Never forward its runner identity to the child;
// `node --test` owns the child context and creates a fresh value for its fixture process.
delete childEnv.NODE_TEST_CONTEXT;
try {
const result = spawnSync(process.execPath, ["--import", "tsx/esm", "--test", fixture], {
cwd: fileURLToPath(new URL("../..", import.meta.url)),
encoding: "utf8",
env: childEnv,
timeout: 60_000,
});
const diagnostics = [result.stdout, result.stderr].filter(Boolean).join("\n");
assert.equal(result.error, undefined, diagnostics);
assert.equal(result.signal, null, diagnostics);
assert.equal(result.status, 0, diagnostics);
assert.match(result.stdout, /tests 4\b/);
assert.match(result.stdout, /pass 4\b/);
assert.match(result.stdout, /fail 0\b/);
} finally {
fs.rmSync(testRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
}
});