import { beforeEach, describe, expect, it, vi } from "vitest"; import { DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS, DEFAULT_APPROVAL_TIMEOUT_MS, } from "./bash-tools.exec-runtime.js"; vi.mock("./tools/gateway.js", () => ({ callGatewayTool: vi.fn(), })); describe("requestExecApprovalDecision", () => { beforeEach(async () => { const { callGatewayTool } = await import("./tools/gateway.js"); vi.mocked(callGatewayTool).mockReset(); }); it("returns string decisions", async () => { const { requestExecApprovalDecision } = await import("./bash-tools.exec-approval-request.js"); const { callGatewayTool } = await import("./tools/gateway.js"); vi.mocked(callGatewayTool).mockResolvedValue({ decision: "allow-once" }); const result = await requestExecApprovalDecision({ id: "approval-id", command: "echo hi", cwd: "/tmp", host: "gateway", security: "allowlist", ask: "always", agentId: "main", resolvedPath: "/usr/bin/echo", sessionKey: "session", }); expect(result).toBe("allow-once"); expect(callGatewayTool).toHaveBeenCalledWith( "exec.approval.request", { timeoutMs: DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS }, { id: "approval-id", command: "echo hi", cwd: "/tmp", host: "gateway", security: "allowlist", ask: "always", agentId: "main", resolvedPath: "/usr/bin/echo", sessionKey: "session", timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS, }, ); }); it("returns null for missing or non-string decisions", async () => { const { requestExecApprovalDecision } = await import("./bash-tools.exec-approval-request.js"); const { callGatewayTool } = await import("./tools/gateway.js"); vi.mocked(callGatewayTool).mockResolvedValueOnce({}); await expect( requestExecApprovalDecision({ id: "approval-id", command: "echo hi", cwd: "/tmp", host: "node", security: "allowlist", ask: "on-miss", }), ).resolves.toBeNull(); vi.mocked(callGatewayTool).mockResolvedValueOnce({ decision: 123 }); await expect( requestExecApprovalDecision({ id: "approval-id-2", command: "echo hi", cwd: "/tmp", host: "node", security: "allowlist", ask: "on-miss", }), ).resolves.toBeNull(); }); });