multipass/test/webhook-server.test.ts
2026-03-13 22:20:46 +00:00

66 lines
1.8 KiB
TypeScript

import { afterEach, describe, expect, it } from "vitest";
import { startWebhookServer } from "../src/providers/webhook-server.js";
const cleanups: Array<() => Promise<void>> = [];
afterEach(async () => {
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
});
describe("webhook server", () => {
it("serves the configured POST path", async () => {
const server = await startWebhookServer({
async handle(request) {
const payload = (await request.json()) as { ok: boolean };
return Response.json({ echoed: payload.ok });
},
host: "127.0.0.1",
path: "/slack/events",
port: 0,
});
cleanups.push(() => server.close());
const response = await fetch(server.endpointUrl, {
body: JSON.stringify({ ok: true }),
headers: { "content-type": "application/json" },
method: "POST",
});
expect(response.status).toBe(200);
await expect(response.json()).resolves.toEqual({ echoed: true });
});
it("rejects non-matching paths", async () => {
const server = await startWebhookServer({
handle: async () => new Response("ok"),
host: "127.0.0.1",
path: "/slack/events",
port: 0,
});
cleanups.push(() => server.close());
const response = await fetch(server.endpointUrl.replace("/slack/events", "/wrong"), {
method: "POST",
});
expect(response.status).toBe(404);
});
it("returns 500 when the handler throws", async () => {
const server = await startWebhookServer({
async handle() {
throw new Error("boom");
},
host: "127.0.0.1",
path: "/slack/events",
port: 0,
});
cleanups.push(() => server.close());
const response = await fetch(server.endpointUrl, { method: "POST" });
expect(response.status).toBe(500);
await expect(response.text()).resolves.toContain("boom");
});
});