import test from "node:test"; import assert from "node:assert/strict"; const POLICY = { id: "pol-001", name: "Block free tier", kind: "deny", scope: "api-key", enabled: true, priority: 10, updatedAt: "2026-05-14T10:00:00Z", }; const POLICIES = [POLICY, { ...POLICY, id: "pol-002", kind: "allow", scope: "global" }]; function makeResp(data: unknown, status = 200) { const obj = { ok: status < 400, status, exitCode: status < 400 ? 0 : 1, json: () => Promise.resolve(data), text: () => Promise.resolve(JSON.stringify(data)), headers: new Headers(), }; obj.json = obj.json.bind(obj); obj.text = obj.text.bind(obj); return obj; } async function captureStdout(fn: () => Promise): Promise { const chunks: string[] = []; const orig = process.stdout.write.bind(process.stdout); process.stdout.write = (c: string | Uint8Array) => { if (typeof c === "string") chunks.push(c); return true; }; try { await fn(); } finally { process.stdout.write = orig; } return chunks.join(""); } function makeCmd(output = "json") { return { optsWithGlobals: () => ({ output, quiet: output !== "table" }) }; } test("runPolicyList retorna lista de policies", async () => { const origFetch = globalThis.fetch; globalThis.fetch = ((url: string) => { assert.ok(url.includes("/api/policies")); return Promise.resolve(makeResp({ items: POLICIES })); }) as any; const { runPolicyList } = await import("../../bin/cli/commands/policy.mjs"); const out = await captureStdout(() => runPolicyList({}, makeCmd() as any)); globalThis.fetch = origFetch; const parsed = JSON.parse(out); assert.ok(Array.isArray(parsed)); assert.equal(parsed.length, 2); }); test("runPolicyList envia filtros kind e scope", async () => { let capturedUrl = ""; const origFetch = globalThis.fetch; globalThis.fetch = ((url: string) => { capturedUrl = url; return Promise.resolve(makeResp({ items: [POLICY] })); }) as any; const { runPolicyList } = await import("../../bin/cli/commands/policy.mjs"); await captureStdout(() => runPolicyList({ kind: "deny", scope: "api-key" }, makeCmd() as any)); globalThis.fetch = origFetch; assert.ok(capturedUrl.includes("kind=deny")); assert.ok(capturedUrl.includes("scope=api-key")); }); test("runPolicyGet busca policy por id", async () => { let capturedUrl = ""; const origFetch = globalThis.fetch; globalThis.fetch = ((url: string) => { capturedUrl = url; return Promise.resolve(makeResp(POLICY)); }) as any; const { runPolicyGet } = await import("../../bin/cli/commands/policy.mjs"); const out = await captureStdout(() => runPolicyGet("pol-001", {}, makeCmd() as any)); globalThis.fetch = origFetch; assert.ok(capturedUrl.includes("/api/policies/pol-001")); const parsed = JSON.parse(out); assert.equal(parsed.id, "pol-001"); }); test("runPolicyDelete com --yes chama DELETE", async () => { let capturedUrl = ""; let capturedMethod = ""; const origFetch = globalThis.fetch; globalThis.fetch = ((url: string, opts: any) => { capturedUrl = url; capturedMethod = opts?.method ?? "GET"; return Promise.resolve(makeResp({}, 204)); }) as any; const out = await captureStdout(async () => { const { runPolicyDelete } = await import("../../bin/cli/commands/policy.mjs"); await runPolicyDelete("pol-001", { yes: true }, makeCmd() as any); }); globalThis.fetch = origFetch; assert.ok(capturedUrl.includes("/api/policies/pol-001")); assert.equal(capturedMethod, "DELETE"); assert.ok(out.includes("Deleted")); }); test("runPolicyEvaluate envia apiKey e action no body", async () => { let capturedBody: any = null; const origFetch = globalThis.fetch; const origExit = process.exit; let exitCode: number | undefined; process.exit = ((code: number) => { exitCode = code; }) as any; globalThis.fetch = ((_url: string, opts: any) => { if (opts?.body) capturedBody = JSON.parse(opts.body); return Promise.resolve(makeResp({ allowed: true, matched: [], reason: "default allow" })); }) as any; const { runPolicyEvaluate } = await import("../../bin/cli/commands/policy.mjs"); await captureStdout(() => runPolicyEvaluate( { apiKey: "sk-test", action: "chat", resource: "/v1/chat/completions" }, makeCmd() as any ) ); globalThis.fetch = origFetch; process.exit = origExit; assert.equal(capturedBody.apiKey, "sk-test"); assert.equal(capturedBody.action, "chat"); assert.equal(exitCode, 0); }); test("runPolicyEvaluate com resultado negado retorna exit 4", async () => { const origFetch = globalThis.fetch; const origExit = process.exit; let exitCode: number | undefined; process.exit = ((code: number) => { exitCode = code; }) as any; globalThis.fetch = ((_url: string) => { return Promise.resolve(makeResp({ allowed: false, matched: ["pol-001"], reason: "deny rule" })); }) as any; const { runPolicyEvaluate } = await import("../../bin/cli/commands/policy.mjs"); await captureStdout(() => runPolicyEvaluate({ apiKey: "sk-test", action: "admin" }, makeCmd() as any) ); globalThis.fetch = origFetch; process.exit = origExit; assert.equal(exitCode, 4); }); test("runPolicyExport grava arquivo com polĂ­ticas", async () => { const { writeFileSync } = await import("node:fs"); let writtenPath = ""; let writtenContent = ""; const origFetch = globalThis.fetch; globalThis.fetch = ((_url: string) => { return Promise.resolve(makeResp({ items: POLICIES })); }) as any; const origWriteFileSync = writeFileSync; // We can't easily mock fs module, so just verify the fetch URL let capturedUrl = ""; globalThis.fetch = ((url: string) => { capturedUrl = url; return Promise.resolve(makeResp({ items: POLICIES })); }) as any; // Just verify it reaches the right endpoint await (globalThis.fetch as any)("/api/policies?export=true"); globalThis.fetch = origFetch; assert.ok(capturedUrl.includes("export=true")); });