import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawPluginApi } from "./api.js"; import plugin from "./index.js"; function createApi(params?: { pluginConfig?: OpenClawPluginApi["pluginConfig"]; registerHttpRoute?: OpenClawPluginApi["registerHttpRoute"]; logger?: OpenClawPluginApi["logger"]; }): OpenClawPluginApi { return createTestPluginApi({ id: "webhooks", name: "Webhooks", source: "test", pluginConfig: params?.pluginConfig ?? {}, runtime: { tasks: { managedFlows: { bindSession: vi.fn(({ sessionKey }: { sessionKey: string }) => ({ sessionKey })), }, }, } as unknown as OpenClawPluginApi["runtime"], registerHttpRoute: params?.registerHttpRoute ?? vi.fn(), logger: params?.logger ?? ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(), } as OpenClawPluginApi["logger"]), }); } function requireFirstRouteRegistration(mock: ReturnType) { const [call] = mock.mock.calls; if (!call) { throw new Error("expected webhook route registration"); } return call[0] as Parameters[0]; } describe("webhooks plugin registration", () => { it("registers SecretRef-backed routes synchronously", () => { const registerHttpRoute = vi.fn(); const result = plugin.register( createApi({ pluginConfig: { routes: { zapier: { sessionKey: "agent:main:main", secret: { source: "env", provider: "default", id: "OPENCLAW_WEBHOOK_SECRET", }, }, }, }, registerHttpRoute, }), ); expect(result).toBeUndefined(); expect(registerHttpRoute).toHaveBeenCalledTimes(1); const route = requireFirstRouteRegistration(registerHttpRoute); expect(route.path).toBe("/plugins/webhooks/zapier"); expect(route.auth).toBe("plugin"); expect(route.match).toBe("exact"); expect(route.replaceExisting).toBe(true); expect(route.handler).toBeTypeOf("function"); }); });