import test from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; // DefaultExecutor transitively touches the DB layer (provider/key rotation // lookups) at import/call time. Point DATA_DIR at an isolated temp dir // BEFORE importing it so these tests never read/write the operator's real // ~/.omniroute database (see CLAUDE.md "Database Handles in Tests"). const TEST_DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-client-identity-")); process.env.DATA_DIR = TEST_DATA_DIR; const { CLIENT_IDENTITY_PROFILES, CLIENT_IDENTITY_PROFILE_OPTIONS, getClientIdentityProfileHeaders, isClientIdentityProfileId, } = await import("../../src/shared/constants/clientIdentityProfiles.ts"); const { isForbiddenCustomHeaderName } = await import("../../src/shared/constants/upstreamHeaders.ts"); const { DefaultExecutor } = await import("../../open-sse/executors/default.ts"); const core = await import("../../src/lib/db/core.ts"); test.after(async () => { core.resetDbInstance(); fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); test("getClientIdentityProfileHeaders: default profile adds no headers", () => { assert.deepEqual(getClientIdentityProfileHeaders("default"), {}); assert.deepEqual(getClientIdentityProfileHeaders(undefined), {}); assert.deepEqual(getClientIdentityProfileHeaders(null), {}); }); test("getClientIdentityProfileHeaders: unknown profile id falls back to no headers", () => { assert.deepEqual(getClientIdentityProfileHeaders("not-a-real-profile"), {}); }); test("getClientIdentityProfileHeaders: known CLI profiles expose their preset headers", () => { const claudeCli = getClientIdentityProfileHeaders("claude-cli"); assert.equal(claudeCli["User-Agent"], "claude-cli/2.1.195 (external, cli)"); assert.equal(claudeCli["X-App"], "cli"); const codexCli = getClientIdentityProfileHeaders("codex-cli"); assert.equal(codexCli["User-Agent"], "codex_cli_rs/0.136.0"); assert.equal(codexCli.originator, "codex_cli_rs"); const geminiCli = getClientIdentityProfileHeaders("gemini-cli"); assert.equal(geminiCli["User-Agent"], "GeminiCLI/0.1.0 (linux; x64)"); }); test("getClientIdentityProfileHeaders: returns a fresh mutable copy (catalog stays frozen)", () => { const headers = getClientIdentityProfileHeaders("claude-cli"); headers["User-Agent"] = "tampered"; assert.equal( CLIENT_IDENTITY_PROFILES["claude-cli"].headers["User-Agent"], "claude-cli/2.1.195 (external, cli)" ); }); test("isClientIdentityProfileId / CLIENT_IDENTITY_PROFILE_OPTIONS stay in sync with the catalog", () => { for (const id of Object.keys(CLIENT_IDENTITY_PROFILES)) { assert.equal(isClientIdentityProfileId(id), true); } assert.equal(isClientIdentityProfileId("bogus"), false); const optionValues = CLIENT_IDENTITY_PROFILE_OPTIONS.map((o) => o.value); assert.deepEqual(optionValues, Object.keys(CLIENT_IDENTITY_PROFILES)); assert.equal(CLIENT_IDENTITY_PROFILE_OPTIONS[0].value, "default"); }); test("a selected profile's headers land in providerSpecificData.customHeaders", () => { // This is exactly what the compatible-provider modal does when an operator // picks a profile from the