Files
moltbot/extensions/webhooks/index.test.ts
2026-05-12 00:21:40 +01:00

75 lines
2.2 KiB
TypeScript

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<typeof vi.fn>) {
const [call] = mock.mock.calls;
if (!call) {
throw new Error("expected webhook route registration");
}
return call[0] as Parameters<OpenClawPluginApi["registerHttpRoute"]>[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");
});
});