Files
diegosouzapw--omniroute/tests/unit/feature-flags-settings.test.ts
2026-07-13 13:39:12 +08:00

447 lines
18 KiB
TypeScript

import { describe, it, before, beforeEach, after } from "node:test";
import assert from "node:assert/strict";
import os from "node:os";
import path from "node:path";
import fs from "node:fs";
// Set DATA_DIR to temp dir before any imports that touch DB
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-test-flags-"));
process.env.DATA_DIR = tmpDir;
const core = await import("../../src/lib/db/core.ts");
const { FEATURE_FLAG_DEFINITIONS } =
await import("../../src/shared/constants/featureFlagDefinitions.ts");
const {
getFeatureFlagOverrides,
getFeatureFlagOverride,
setFeatureFlagOverride,
removeFeatureFlagOverride,
clearAllFeatureFlagOverrides,
} = await import("../../src/lib/db/featureFlags.ts");
const {
resolveFeatureFlag,
isFeatureFlagEnabled,
resolveAllFeatureFlags,
isRequireApiKeyEnabled,
isCcCompatibleProviderEnabled,
isModelCatalogNamesEnabled,
isArenaEloSyncEnabled,
isControlPlaneProxyDirectFallbackEnabled,
} = await import("../../src/shared/utils/featureFlags.ts");
const EXPECTED_FEATURE_FLAG_COUNT = 41;
// ──────────────────────────────────────────────────────
// Test group 1 — Flag definitions registry
// ──────────────────────────────────────────────────────
describe("featureFlagDefinitions", () => {
it("has exactly 41 flag definitions", () => {
assert.strictEqual(FEATURE_FLAG_DEFINITIONS.length, EXPECTED_FEATURE_FLAG_COUNT);
});
it("has unique keys for all flags", () => {
const keys = FEATURE_FLAG_DEFINITIONS.map((d) => d.key);
assert.strictEqual(new Set(keys).size, EXPECTED_FEATURE_FLAG_COUNT);
});
it("has valid categories for all flags", () => {
const valid = new Set(["security", "network", "policies", "runtime", "cli", "health"]);
for (const d of FEATURE_FLAG_DEFINITIONS) {
assert.ok(valid.has(d.category), `Invalid category "${d.category}" for ${d.key}`);
}
});
it("has valid types (boolean or enum) for all flags", () => {
for (const d of FEATURE_FLAG_DEFINITIONS) {
assert.ok(d.type === "boolean" || d.type === "enum", `Invalid type for ${d.key}`);
}
});
it("has enumValues for all enum-type flags", () => {
const enumFlags = FEATURE_FLAG_DEFINITIONS.filter((d) => d.type === "enum");
assert.ok(enumFlags.length > 0, "Should have at least one enum flag");
for (const d of enumFlags) {
assert.ok(
Array.isArray(d.enumValues) && d.enumValues.length > 0,
`Missing enumValues for ${d.key}`
);
}
});
it("does not have enumValues for boolean-type flags", () => {
const boolFlags = FEATURE_FLAG_DEFINITIONS.filter((d) => d.type === "boolean");
for (const d of boolFlags) {
assert.ok(
!d.enumValues || d.enumValues.length === 0,
`Boolean flag ${d.key} should not have enumValues`
);
}
});
it("has warningLevel only with valid values when present", () => {
const valid = new Set(["info", "caution", "danger"]);
for (const d of FEATURE_FLAG_DEFINITIONS) {
if (d.warningLevel !== undefined) {
assert.ok(
valid.has(d.warningLevel),
`Invalid warningLevel "${d.warningLevel}" for ${d.key}`
);
}
}
});
it("defines model catalog names as a runtime boolean flag enabled by default", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "MODEL_CATALOG_INCLUDE_NAMES");
assert.ok(def, "MODEL_CATALOG_INCLUDE_NAMES should exist");
assert.strictEqual(def.category, "runtime");
assert.strictEqual(def.type, "boolean");
assert.strictEqual(def.defaultValue, "true");
assert.strictEqual(def.requiresRestart, false);
});
it("defines models catalog prefix mode as a runtime enum flag defaulting to dual", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "MODELS_CATALOG_PREFIX_MODE");
assert.ok(def, "MODELS_CATALOG_PREFIX_MODE should exist");
assert.strictEqual(def.category, "runtime");
assert.strictEqual(def.type, "enum");
assert.deepStrictEqual(def.enumValues, ["dual", "alias", "canonical"]);
assert.strictEqual(def.defaultValue, "dual");
assert.strictEqual(def.requiresRestart, false);
});
it("defines Arena ELO sync as a runtime boolean flag enabled by default", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "ARENA_ELO_SYNC_ENABLED");
assert.ok(def, "ARENA_ELO_SYNC_ENABLED should exist");
assert.strictEqual(def.category, "runtime");
assert.strictEqual(def.type, "boolean");
assert.strictEqual(def.defaultValue, "true");
assert.strictEqual(def.requiresRestart, false);
});
it("defines emergency fallback as a runtime boolean flag enabled by default", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "OMNIROUTE_EMERGENCY_FALLBACK");
assert.ok(def, "OMNIROUTE_EMERGENCY_FALLBACK should exist");
assert.strictEqual(def.category, "runtime");
assert.strictEqual(def.type, "boolean");
assert.strictEqual(def.defaultValue, "true");
assert.strictEqual(def.requiresRestart, false);
});
it("defines stream recovery as runtime boolean flags disabled by default", () => {
const early = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "STREAM_RECOVERY_ENABLED");
const midstream = FEATURE_FLAG_DEFINITIONS.find(
(d) => d.key === "STREAM_RECOVERY_MIDSTREAM_ENABLED"
);
assert.ok(early, "STREAM_RECOVERY_ENABLED should exist");
assert.strictEqual(early.category, "runtime");
assert.strictEqual(early.type, "boolean");
assert.strictEqual(early.defaultValue, "false");
assert.strictEqual(early.requiresRestart, false);
assert.strictEqual(early.warningLevel, "caution");
assert.ok(midstream, "STREAM_RECOVERY_MIDSTREAM_ENABLED should exist");
assert.strictEqual(midstream.category, "runtime");
assert.strictEqual(midstream.type, "boolean");
assert.strictEqual(midstream.defaultValue, "false");
assert.strictEqual(midstream.requiresRestart, false);
assert.strictEqual(midstream.warningLevel, "danger");
});
it("defines control-plane proxy direct fallback as a network boolean flag disabled by default", () => {
const def = FEATURE_FLAG_DEFINITIONS.find(
(d) => d.key === "OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK"
);
assert.ok(def, "OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK should exist");
assert.strictEqual(def.category, "network");
assert.strictEqual(def.type, "boolean");
assert.strictEqual(def.defaultValue, "false");
assert.strictEqual(def.requiresRestart, false);
assert.strictEqual(def.warningLevel, "danger");
});
it("defines CLI profile auto-sync flags as CLI booleans disabled by default", () => {
for (const key of [
"OMNIROUTE_AUTO_SYNC_CODEX_PROFILES",
"OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES",
]) {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === key);
assert.ok(def, `${key} should exist`);
assert.strictEqual(def.category, "cli");
assert.strictEqual(def.type, "boolean");
assert.strictEqual(def.defaultValue, "false");
assert.strictEqual(def.requiresRestart, false);
assert.strictEqual(def.warningLevel, "caution");
}
});
});
// ──────────────────────────────────────────────────────
// Test group 2 — DB module
// ──────────────────────────────────────────────────────
describe("featureFlags DB module", () => {
function resetDb() {
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
fs.mkdirSync(tmpDir, { recursive: true });
}
beforeEach(() => {
resetDb();
});
after(() => {
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
});
it("getFeatureFlagOverrides returns empty object when no overrides", () => {
const overrides = getFeatureFlagOverrides();
assert.deepStrictEqual(overrides, {});
});
it("setFeatureFlagOverride stores value in key_value table", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
const overrides = getFeatureFlagOverrides();
assert.strictEqual(overrides["REQUIRE_API_KEY"], "true");
});
it("getFeatureFlagOverride returns the stored value", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
assert.strictEqual(getFeatureFlagOverride("REQUIRE_API_KEY"), "true");
});
it("getFeatureFlagOverride returns undefined for unset flag", () => {
assert.strictEqual(getFeatureFlagOverride("REQUIRE_API_KEY"), undefined);
});
it("removeFeatureFlagOverride deletes the override", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
removeFeatureFlagOverride("REQUIRE_API_KEY");
assert.strictEqual(getFeatureFlagOverride("REQUIRE_API_KEY"), undefined);
});
it("clearAllFeatureFlagOverrides removes all overrides", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
setFeatureFlagOverride("INPUT_SANITIZER_ENABLED", "true");
clearAllFeatureFlagOverrides();
assert.deepStrictEqual(getFeatureFlagOverrides(), {});
});
it("setFeatureFlagOverride overwrites existing value", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
setFeatureFlagOverride("REQUIRE_API_KEY", "false");
assert.strictEqual(getFeatureFlagOverride("REQUIRE_API_KEY"), "false");
});
});
// ──────────────────────────────────────────────────────
// Test group 3 — Resolver
// ──────────────────────────────────────────────────────
describe("resolveFeatureFlag", () => {
function resetDb() {
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
fs.mkdirSync(tmpDir, { recursive: true });
}
beforeEach(() => {
resetDb();
delete process.env["REQUIRE_API_KEY"];
});
after(() => {
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
delete process.env["REQUIRE_API_KEY"];
});
it("returns DB override when set", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
assert.strictEqual(resolveFeatureFlag("REQUIRE_API_KEY"), "true");
});
it("falls back to ENV when no DB override", () => {
process.env["REQUIRE_API_KEY"] = "true";
assert.strictEqual(resolveFeatureFlag("REQUIRE_API_KEY"), "true");
delete process.env["REQUIRE_API_KEY"];
});
it("falls back to default when neither DB nor ENV", () => {
assert.strictEqual(resolveFeatureFlag("REQUIRE_API_KEY"), "false");
});
it("DB takes priority over ENV", () => {
process.env["REQUIRE_API_KEY"] = "env-value";
setFeatureFlagOverride("REQUIRE_API_KEY", "db-value");
assert.strictEqual(resolveFeatureFlag("REQUIRE_API_KEY"), "db-value");
delete process.env["REQUIRE_API_KEY"];
});
describe("isFeatureFlagEnabled", () => {
it("returns true for 'true'", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
assert.ok(isFeatureFlagEnabled("REQUIRE_API_KEY"));
});
it("returns true for '1'", () => {
setFeatureFlagOverride("SKILLS_SANDBOX_NETWORK_ENABLED", "1");
assert.ok(isFeatureFlagEnabled("SKILLS_SANDBOX_NETWORK_ENABLED"));
});
it("returns true for 'yes'", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "yes");
assert.ok(isFeatureFlagEnabled("REQUIRE_API_KEY"));
});
it("returns false for 'false'", () => {
assert.ok(!isFeatureFlagEnabled("REQUIRE_API_KEY"));
});
it("returns false for '0'", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "0");
assert.ok(!isFeatureFlagEnabled("REQUIRE_API_KEY"));
});
it("returns false for empty string via ENV (falls to default)", () => {
process.env["REQUIRE_API_KEY"] = "";
assert.ok(!isFeatureFlagEnabled("REQUIRE_API_KEY"));
delete process.env["REQUIRE_API_KEY"];
});
});
describe("resolveAllFeatureFlags", () => {
it("returns all 41 flags", () => {
const all = resolveAllFeatureFlags();
assert.strictEqual(all.length, EXPECTED_FEATURE_FLAG_COUNT);
});
it("marks DB-overridden flags with source 'db'", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
const all = resolveAllFeatureFlags();
const flag = all.find((f) => f.key === "REQUIRE_API_KEY");
assert.strictEqual(flag?.source, "db");
});
it("marks ENV-set flags with source 'env'", () => {
process.env["REQUIRE_API_KEY"] = "true";
const all = resolveAllFeatureFlags();
const flag = all.find((f) => f.key === "REQUIRE_API_KEY");
assert.strictEqual(flag?.source, "env");
delete process.env["REQUIRE_API_KEY"];
});
it("marks default flags with source 'default'", () => {
const all = resolveAllFeatureFlags();
const flag = all.find((f) => f.key === "REQUIRE_API_KEY");
assert.strictEqual(flag?.source, "default");
});
});
describe("backward compatibility", () => {
it("isRequireApiKeyEnabled uses the resolved REQUIRE_API_KEY flag", () => {
setFeatureFlagOverride("REQUIRE_API_KEY", "true");
assert.strictEqual(isRequireApiKeyEnabled(), true);
});
it("isRequireApiKeyEnabled fails closed when the flag store cannot be read", () => {
const originalError = console.error;
console.error = () => {};
try {
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
fs.mkdirSync(tmpDir, { recursive: true });
const blockerPath = path.join(tmpDir, "storage.sqlite");
fs.mkdirSync(blockerPath, { recursive: true });
assert.strictEqual(isRequireApiKeyEnabled(), true);
} finally {
console.error = originalError;
core.resetDbInstance();
fs.rmSync(tmpDir, { recursive: true, force: true });
fs.mkdirSync(tmpDir, { recursive: true });
}
});
it("isCcCompatibleProviderEnabled still works", () => {
const result = isCcCompatibleProviderEnabled();
assert.strictEqual(typeof result, "boolean");
});
it("isModelCatalogNamesEnabled defaults on and follows overrides", () => {
assert.strictEqual(isModelCatalogNamesEnabled(), true);
try {
setFeatureFlagOverride("MODEL_CATALOG_INCLUDE_NAMES", "false");
assert.strictEqual(isModelCatalogNamesEnabled(), false);
} finally {
removeFeatureFlagOverride("MODEL_CATALOG_INCLUDE_NAMES");
}
});
it("isArenaEloSyncEnabled defaults on and follows DB overrides", () => {
assert.strictEqual(isArenaEloSyncEnabled(), true);
try {
setFeatureFlagOverride("ARENA_ELO_SYNC_ENABLED", "false");
assert.strictEqual(isArenaEloSyncEnabled(), false);
} finally {
removeFeatureFlagOverride("ARENA_ELO_SYNC_ENABLED");
}
});
it("isControlPlaneProxyDirectFallbackEnabled defaults off and follows DB overrides", () => {
assert.strictEqual(isControlPlaneProxyDirectFallbackEnabled(), false);
try {
setFeatureFlagOverride("OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK", "true");
assert.strictEqual(isControlPlaneProxyDirectFallbackEnabled(), true);
} finally {
removeFeatureFlagOverride("OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK");
}
});
});
});
// ──────────────────────────────────────────────────────
// Test group 4 — Schema / validation logic (pure)
// ──────────────────────────────────────────────────────
describe("featureFlagUpdateSchema validation", () => {
it("rejects unknown flag keys", () => {
const knownKeys = new Set(FEATURE_FLAG_DEFINITIONS.map((d) => d.key));
assert.ok(!knownKeys.has("UNKNOWN_FLAG_XYZ"), "UNKNOWN_FLAG_XYZ should not be a known key");
});
it("validates that INJECTION_GUARD_MODE has known enum values", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "INJECTION_GUARD_MODE");
assert.ok(def, "INJECTION_GUARD_MODE should exist");
assert.deepStrictEqual(def.enumValues, ["off", "warn", "block", "redact"]);
});
it("validates that TOOL_POLICY_MODE has known enum values", () => {
const def = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === "TOOL_POLICY_MODE");
assert.ok(def, "TOOL_POLICY_MODE should exist");
assert.deepStrictEqual(def.enumValues, ["disabled", "warn", "block"]);
});
it("setFeatureFlagOverride throws for unknown keys", () => {
assert.throws(
() => setFeatureFlagOverride("UNKNOWN_FLAG_XYZ", "true"),
/Unknown feature flag key/
);
});
it("setFeatureFlagOverride throws for invalid enum value", () => {
assert.throws(
() => setFeatureFlagOverride("INJECTION_GUARD_MODE", "invalid_mode"),
/Invalid value/
);
});
});
describe("settings schema public surface", () => {
it("uses databaseSettingsSchema as the canonical database settings export", async () => {
const settingsSchemas = await import("../../src/shared/validation/settingsSchemas.ts");
assert.equal("DatabaseSettingsSchema" in settingsSchemas, false);
assert.equal("featureFlagUpdateSchema" in settingsSchemas, false);
assert.equal(typeof settingsSchemas.databaseSettingsSchema.safeParse, "function");
});
});