import { describe, expect, it } from "vitest"; import { DomainEventName, WEBHOOK_EVENTS, createDomainEvent, generateId } from "./events.js"; describe("generateId", () => { it("produces prefixed ids", () => { const id = generateId("evt"); expect(id.startsWith("evt_")).toBe(true); // 32 hex chars (uuid without dashes). expect(id.slice(4)).toMatch(/^[0-9a-f]{32}$/); }); it("ids are unique", () => { const ids = new Set(Array.from({ length: 1000 }, () => generateId("x"))); expect(ids.size).toBe(1000); }); }); describe("createDomainEvent", () => { it("builds a valid envelope", () => { const event = createDomainEvent( DomainEventName.PAGE_CREATED, { pageId: "pg_1" }, { workspaceId: "wsp_1", actorId: "usr_1", }, ); expect(event).toMatchObject({ id: expect.stringMatching(/^evt_[0-9a-f]{32}$/), name: "page.created", workspaceId: "wsp_1", actorId: "usr_1", payload: { pageId: "pg_1" }, }); expect(typeof event.ts).toBe("string"); expect(Number.isFinite(Date.parse(event.ts))).toBe(true); }); it("omits optional workspaceId/actorId when not provided", () => { const event = createDomainEvent(DomainEventName.USER_REGISTER, { userId: "u" }); expect(event.workspaceId).toBeUndefined(); expect(event.actorId).toBeUndefined(); }); it("allows ts override (replay)", () => { const event = createDomainEvent( DomainEventName.PAGE_UPDATED, {}, { ts: "2024-01-01T00:00:00.000Z" }, ); expect(event.ts).toBe("2024-01-01T00:00:00.000Z"); }); }); describe("DomainEventName catalog", () => { it("contains all expected events", () => { const expected = [ "page.created", "page.updated", "page.deleted", "page.shared", "database.created", "database.updated", "record.created", "record.updated", "comment.created", "form.submitted", "automation.executed", "file.uploaded", "api_key.created", "user.login", "user.logout", "user.register", "permission.changed", "workspace.created", ]; for (const name of expected) { expect(Object.values(DomainEventName)).toContain(name); } }); it("webhook catalog is a subset of the domain catalog", () => { const all = new Set(Object.values(DomainEventName)); for (const w of WEBHOOK_EVENTS) { expect(all.has(w)).toBe(true); } }); });