1import { describe, expect, it } from "vitest";
2
3import { DomainEventName, WEBHOOK_EVENTS, createDomainEvent, generateId } from "./events.js";
4
5describe("generateId", () => {
6 it("produces prefixed ids", () => {
7 const id = generateId("evt");
8 expect(id.startsWith("evt_")).toBe(true);
9
10 expect(id.slice(4)).toMatch(/^[0-9a-f]{32}$/);
11 });
12
13 it("ids are unique", () => {
14 const ids = new Set(Array.from({ length: 1000 }, () => generateId("x")));
15 expect(ids.size).toBe(1000);
16 });
17});
18
19describe("createDomainEvent", () => {
20 it("builds a valid envelope", () => {
21 const event = createDomainEvent(
22 DomainEventName.PAGE_CREATED,
23 { pageId: "pg_1" },
24 {
25 workspaceId: "wsp_1",
26 actorId: "usr_1",
27 },
28 );
29 expect(event).toMatchObject({
30 id: expect.stringMatching(/^evt_[0-9a-f]{32}$/),
31 name: "page.created",
32 workspaceId: "wsp_1",
33 actorId: "usr_1",
34 payload: { pageId: "pg_1" },
35 });
36 expect(typeof event.ts).toBe("string");
37 expect(Number.isFinite(Date.parse(event.ts))).toBe(true);
38 });
39
40 it("omits optional workspaceId/actorId when not provided", () => {
41 const event = createDomainEvent(DomainEventName.USER_REGISTER, { userId: "u" });
42 expect(event.workspaceId).toBeUndefined();
43 expect(event.actorId).toBeUndefined();
44 });
45
46 it("allows ts override (replay)", () => {
47 const event = createDomainEvent(
48 DomainEventName.PAGE_UPDATED,
49 {},
50 { ts: "2024-01-01T00:00:00.000Z" },
51 );
52 expect(event.ts).toBe("2024-01-01T00:00:00.000Z");
53 });
54});
55
56describe("DomainEventName catalog", () => {
57 it("contains all expected events", () => {
58 const expected = [
59 "page.created",
60 "page.updated",
61 "page.deleted",
62 "page.shared",
63 "database.created",
64 "database.updated",
65 "record.created",
66 "record.updated",
67 "comment.created",
68 "form.submitted",
69 "automation.executed",
70 "file.uploaded",
71 "api_key.created",
72 "user.login",
73 "user.logout",
74 "user.register",
75 "permission.changed",
76 "workspace.created",
77 ];
78 for (const name of expected) {
79 expect(Object.values(DomainEventName)).toContain(name);
80 }
81 });
82
83 it("webhook catalog is a subset of the domain catalog", () => {
84 const all = new Set(Object.values(DomainEventName));
85 for (const w of WEBHOOK_EVENTS) {
86 expect(all.has(w)).toBe(true);
87 }
88 });
89});
90