import { describe, expect, it, vi } from "vitest"; import { ExecApprovalManager } from "../exec-approval-manager.js"; import { createExecApprovalHandlers } from "./exec-approval.js"; const noop = () => {}; describe("exec approval handlers", () => { it("broadcasts request + resolve", async () => { const manager = new ExecApprovalManager(); const handlers = createExecApprovalHandlers(manager); const broadcasts: Array<{ event: string; payload: unknown }> = []; const respond = vi.fn(); const context = { broadcast: (event: string, payload: unknown) => { broadcasts.push({ event, payload }); }, }; const requestPromise = handlers["exec.approval.request"]({ params: { command: "echo ok", cwd: "/tmp", host: "node", timeoutMs: 2000, }, respond, context: context as unknown as Parameters< (typeof handlers)["exec.approval.request"] >[0]["context"], client: null, req: { id: "req-1", type: "req", method: "exec.approval.request" }, isWebchatConnect: noop, }); const requested = broadcasts.find((entry) => entry.event === "exec.approval.requested"); expect(requested).toBeTruthy(); const id = (requested?.payload as { id?: string })?.id ?? ""; expect(id).not.toBe(""); const resolveRespond = vi.fn(); await handlers["exec.approval.resolve"]({ params: { id, decision: "allow-once" }, respond: resolveRespond, context: context as unknown as Parameters< (typeof handlers)["exec.approval.resolve"] >[0]["context"], client: { connect: { client: { id: "cli", displayName: "CLI" } } }, req: { id: "req-2", type: "req", method: "exec.approval.resolve" }, isWebchatConnect: noop, }); await requestPromise; expect(resolveRespond).toHaveBeenCalledWith(true, { ok: true }, undefined); expect(respond).toHaveBeenCalledWith( true, expect.objectContaining({ id, decision: "allow-once" }), undefined, ); expect(broadcasts.some((entry) => entry.event === "exec.approval.resolved")).toBe(true); }); });