1
11import { describe, expect, it } from "vitest";
12import {
13 WEBHOOK_EVENT_CATALOG,
14 WEBHOOK_EVENT_NAMES,
15 catalogSelfTestFailures,
16 isWebhookEvent,
17 validateWebhookEvents,
18 webhookEventCatalogEntry
19} from "./catalog.js";
20
21describe("webhook event catalog", () => {
22 it("has exactly the 13 events from docs §3 (in order)", () => {
23 expect(WEBHOOK_EVENT_NAMES).toEqual([
24 "page.created",
25 "page.updated",
26 "page.deleted",
27 "page.shared",
28 "database.created",
29 "database.updated",
30 "record.created",
31 "record.updated",
32 "comment.created",
33 "form.submitted",
34 "automation.executed",
35 "file.uploaded",
36 "api_key.created"
37 ]);
38 });
39
40 it("every entry has a non-empty description + firedBy (build-gate documentation)", () => {
41 for (const e of WEBHOOK_EVENT_CATALOG) {
42 expect(e.description.length, e.name).toBeGreaterThan(0);
43 expect(e.firedBy.length, e.name).toBeGreaterThan(0);
44 }
45 });
46
47 it("every example validates against its own payloadSchema", () => {
48 expect(catalogSelfTestFailures()).toEqual([]);
49 });
50
51 it("lookup + membership", () => {
52 expect(webhookEventCatalogEntry("page.created")?.name).toBe("page.created");
53 expect(webhookEventCatalogEntry("not.an.event")).toBeNull();
54 expect(isWebhookEvent("record.updated")).toBe(true);
55 expect(isWebhookEvent("*")).toBe(true);
56 expect(isWebhookEvent("user.login")).toBe(false);
57 });
58
59 it("validateWebhookEvents flags unknowns and allows the wildcard", () => {
60 expect(validateWebhookEvents(["page.created", "record.updated"])).toEqual({ valid: true, unknown: [] });
61 expect(validateWebhookEvents(["*", "page.created"])).toEqual({ valid: true, unknown: [] });
62 expect(validateWebhookEvents(["page.created", "bogus.event"])).toEqual({
63 valid: false,
64 unknown: ["bogus.event"]
65 });
66 expect(validateWebhookEvents([])).toEqual({ valid: true, unknown: [] });
67 });
68});
69