| import { afterEach, describe, expect, it, vi } from "vitest"; |
|
|
| import type { OpenClawConfig } from "../config/config.js"; |
| import { createExecApprovalForwarder } from "./exec-approval-forwarder.js"; |
|
|
| const baseRequest = { |
| id: "req-1", |
| request: { |
| command: "echo hello", |
| agentId: "main", |
| sessionKey: "agent:main:main", |
| }, |
| createdAtMs: 1000, |
| expiresAtMs: 6000, |
| }; |
|
|
| afterEach(() => { |
| vi.useRealTimers(); |
| }); |
|
|
| describe("exec approval forwarder", () => { |
| it("forwards to session target and resolves", async () => { |
| vi.useFakeTimers(); |
| const deliver = vi.fn().mockResolvedValue([]); |
| const cfg = { |
| approvals: { exec: { enabled: true, mode: "session" } }, |
| } as OpenClawConfig; |
|
|
| const forwarder = createExecApprovalForwarder({ |
| getConfig: () => cfg, |
| deliver, |
| nowMs: () => 1000, |
| resolveSessionTarget: () => ({ channel: "slack", to: "U1" }), |
| }); |
|
|
| await forwarder.handleRequested(baseRequest); |
| expect(deliver).toHaveBeenCalledTimes(1); |
|
|
| await forwarder.handleResolved({ |
| id: baseRequest.id, |
| decision: "allow-once", |
| resolvedBy: "slack:U1", |
| ts: 2000, |
| }); |
| expect(deliver).toHaveBeenCalledTimes(2); |
|
|
| await vi.runAllTimersAsync(); |
| expect(deliver).toHaveBeenCalledTimes(2); |
| }); |
|
|
| it("forwards to explicit targets and expires", async () => { |
| vi.useFakeTimers(); |
| const deliver = vi.fn().mockResolvedValue([]); |
| const cfg = { |
| approvals: { |
| exec: { |
| enabled: true, |
| mode: "targets", |
| targets: [{ channel: "telegram", to: "123" }], |
| }, |
| }, |
| } as OpenClawConfig; |
|
|
| const forwarder = createExecApprovalForwarder({ |
| getConfig: () => cfg, |
| deliver, |
| nowMs: () => 1000, |
| resolveSessionTarget: () => null, |
| }); |
|
|
| await forwarder.handleRequested(baseRequest); |
| expect(deliver).toHaveBeenCalledTimes(1); |
|
|
| await vi.runAllTimersAsync(); |
| expect(deliver).toHaveBeenCalledTimes(2); |
| }); |
| }); |
|
|