Files
OmniRoute/tests/unit/server-owned-tool-loop-flag.test.ts
Dizzle 997cd4d509 fix(sse): stop retry wave on rate-limited 429 and drain 429 once (#13657)
The opencode executor classifies rate-limited 429 bodies (`classify429`, with real tests) and, when a whole account wave is exhausted, returns the last real upstream 429 — status, body, `Retry-After` and quota headers intact — so the provider error rules (monthly-quota cooldown) keep working.

Maintainer rework before merge (kept the idea, no default behavior change):
- The original stopped the cross-account wave at the first classified 429 and replaced the response with a synthetic one that dropped the body and headers; stopping early is now opt-in behind `OPENCODE_RATE_LIMITED_429_EARLY_STOP` (default off), the rate-limited account is still cooled down, the body is read as a bounded 8 KiB prefix from a clone and the original is never consumed, and the unused `status` input is gone.

Validated first on the combined board of all 38 PRs of this batch (10 merged as-is, 28 after the maintainer rework) on top of release/v3.8.51 c0f92ec: typecheck:core, check:open-sse-typecheck and check:dashboard-typecheck clean; ESLint clean on every changed file; file-size (rebaselined for the combined growth), complexity, cognitive-complexity, changelog-integrity, docs-counts, docs-sync, migration-numbering and i18n new-key gates green; 735 focused node:test cases with the only batch-caused failure (a flag-count assertion) fixed. Then re-validated alone on the fresh release tip right before this merge: ESLint on the changed files, typecheck:core, check:open-sse-typecheck, the file-size/complexity/changelog gates and this PR's own tests.

Thanks @maxmad64bis!
2026-09-15 22:01:56 -03:00

141 lines
5.2 KiB
TypeScript

import { describe, it, before, after, beforeEach } from "node:test";
import assert from "node:assert/strict";
import os from "node:os";
import path from "node:path";
import fs from "node:fs";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-test-flag-loop-"));
process.env.DATA_DIR = tmpDir;
const { FEATURE_FLAG_DEFINITIONS } =
await import("../../src/shared/constants/featureFlagDefinitions.ts");
const { setFeatureFlagOverride, clearAllFeatureFlagOverrides } =
await import("../../src/lib/db/featureFlags.ts");
const { isServerOwnedToolLoopEnabled } = await import("../../src/shared/utils/featureFlags.ts");
describe("SERVER_OWNED_TOOL_LOOP_ENABLED flag definition", () => {
it("exists in FEATURE_FLAG_DEFINITIONS", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "SERVER_OWNED_TOOL_LOOP_ENABLED");
assert.ok(def, "SERVER_OWNED_TOOL_LOOP_ENABLED should exist");
assert.equal(def.category, "runtime");
assert.equal(def.defaultValue, "false");
assert.equal(def.requiresRestart, false);
assert.equal(def.descriptionI18nKey, "featureFlagServerOwnedToolLoopDescription");
});
});
describe("isServerOwnedToolLoopEnabled wrapper", () => {
beforeEach(() => {
clearAllFeatureFlagOverrides();
});
it("returns false when no override is set (default)", () => {
assert.equal(isServerOwnedToolLoopEnabled(), false);
});
it("returns true when DB override is set to true", () => {
setFeatureFlagOverride("SERVER_OWNED_TOOL_LOOP_ENABLED", "true");
assert.equal(isServerOwnedToolLoopEnabled(), true);
});
it("returns false and logs when injected reader throws", () => {
const logs: unknown[] = [];
const origError = console.error;
console.error = (...args: unknown[]) => {
logs.push(args);
};
try {
const throwingReader = () => {
throw new Error("flag read failed");
};
const result = isServerOwnedToolLoopEnabled(throwingReader);
assert.equal(result, false);
assert.ok(logs.length >= 1, "console.error should be called at least once");
assert.ok(
logs.some((args) =>
String(args).includes("Failed to resolve SERVER_OWNED_TOOL_LOOP_ENABLED")
),
"error log should mention the flag key"
);
} finally {
console.error = origError;
}
});
});
describe("feature-flags-settings count update", () => {
it("flag count matches updated expected value", () => {
assert.equal(FEATURE_FLAG_DEFINITIONS.length, 69);
});
});
describe("i18n key parity for SERVER_OWNED_TOOL_LOOP_ENABLED", () => {
let enMessages: Record<string, unknown>;
let ptBrMessages: Record<string, unknown>;
before(async () => {
const enRaw = fs.readFileSync(
path.resolve(__dirname, "../../src/i18n/messages/en.json"),
"utf8"
);
enMessages = JSON.parse(enRaw);
const ptBrRaw = fs.readFileSync(
path.resolve(__dirname, "../../src/i18n/messages/pt-BR.json"),
"utf8"
);
ptBrMessages = JSON.parse(ptBrRaw);
});
it("en.json has nested featureFlags.definitions.SERVER_OWNED_TOOL_LOOP_ENABLED.label", () => {
const defs = enMessages.featureFlags as Record<string, unknown> | undefined;
assert.ok(defs, "en.json should have featureFlags section");
const definitions = (defs as Record<string, unknown>).definitions as
Record<string, unknown> | undefined;
assert.ok(definitions, "en.json featureFlags should have definitions");
const flagDef = definitions.SERVER_OWNED_TOOL_LOOP_ENABLED as
Record<string, unknown> | undefined;
assert.ok(flagDef, "definitions should contain SERVER_OWNED_TOOL_LOOP_ENABLED");
assert.equal(flagDef.label, "Server-Owned Tool Loop");
assert.equal(
flagDef.description,
"Continue non-streaming server-owned tool calls until the model returns a client-usable response."
);
});
it("pt-BR.json has nested featureFlags.definitions.SERVER_OWNED_TOOL_LOOP_ENABLED.label", () => {
const defs = ptBrMessages.featureFlags as Record<string, unknown> | undefined;
assert.ok(defs, "pt-BR.json should have featureFlags section");
const definitions = (defs as Record<string, unknown>).definitions as
Record<string, unknown> | undefined;
assert.ok(definitions, "pt-BR.json featureFlags should have definitions");
const flagDef = definitions.SERVER_OWNED_TOOL_LOOP_ENABLED as
Record<string, unknown> | undefined;
assert.ok(flagDef, "definitions should contain SERVER_OWNED_TOOL_LOOP_ENABLED");
assert.equal(flagDef.label, "Server-Owned Tool Loop");
assert.equal(typeof flagDef.description, "string");
assert.ok(
((flagDef.description as string) || "").length > 0,
"description should be non-empty"
);
});
it("en.json does NOT have stale top-level featureFlagServerOwnedToolLoopDescription", () => {
assert.equal(
(enMessages as Record<string, unknown>).featureFlagServerOwnedToolLoopDescription,
undefined,
"top-level key should be removed"
);
});
});
after(() => {
try {
fs.rmSync(tmpDir, { recursive: true, force: true });
} catch {
// ignore
}
});