import { describe, it, expect, vi } from "vitest"; import { EventHandlerRegistry } from "../event-handler-registry.js"; describe("EventHandlerRegistry", () => { it("should register handlers for collections", () => { const registry = new EventHandlerRegistry(); registry.register({ collection: "space.atbb.post", onCreate: vi.fn(), }); expect(registry.getCollections()).toEqual(["space.atbb.post"]); }); it("should support fluent interface", () => { const registry = new EventHandlerRegistry() .register({ collection: "space.atbb.post", onCreate: vi.fn() }) .register({ collection: "space.atbb.forum.forum", onCreate: vi.fn() }); expect(registry.getCollections()).toEqual(["space.atbb.post", "space.atbb.forum.forum"]); }); it("should apply handlers to Jetstream instance", () => { const onCreate = vi.fn(); const onUpdate = vi.fn(); const onDelete = vi.fn(); const mockJetstream = { onCreate: vi.fn(), onUpdate: vi.fn(), onDelete: vi.fn(), }; const registry = new EventHandlerRegistry().register({ collection: "space.atbb.post", onCreate, onUpdate, onDelete, }); registry.applyTo(mockJetstream as any); expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", onCreate); expect(mockJetstream.onUpdate).toHaveBeenCalledWith("space.atbb.post", onUpdate); expect(mockJetstream.onDelete).toHaveBeenCalledWith("space.atbb.post", onDelete); }); it("should only register provided handlers", () => { const onCreate = vi.fn(); const mockJetstream = { onCreate: vi.fn(), onUpdate: vi.fn(), onDelete: vi.fn(), }; const registry = new EventHandlerRegistry().register({ collection: "space.atbb.post", onCreate, // Only onCreate provided }); registry.applyTo(mockJetstream as any); expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", onCreate); expect(mockJetstream.onUpdate).not.toHaveBeenCalled(); expect(mockJetstream.onDelete).not.toHaveBeenCalled(); }); it("should clear all registrations", () => { const registry = new EventHandlerRegistry().register({ collection: "space.atbb.post", onCreate: vi.fn(), }); expect(registry.getCollections()).toHaveLength(1); registry.clear(); expect(registry.getCollections()).toHaveLength(0); }); it("should handle multiple collections with partial handlers", () => { const mockJetstream = { onCreate: vi.fn(), onUpdate: vi.fn(), onDelete: vi.fn(), }; const postCreate = vi.fn(); const forumUpdate = vi.fn(); const categoryDelete = vi.fn(); const registry = new EventHandlerRegistry() .register({ collection: "space.atbb.post", onCreate: postCreate, }) .register({ collection: "space.atbb.forum.forum", onUpdate: forumUpdate, }) .register({ collection: "space.atbb.forum.category", onDelete: categoryDelete, }); registry.applyTo(mockJetstream as any); // Verify only the registered handlers were called expect(mockJetstream.onCreate).toHaveBeenCalledTimes(1); expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", postCreate); expect(mockJetstream.onUpdate).toHaveBeenCalledTimes(1); expect(mockJetstream.onUpdate).toHaveBeenCalledWith("space.atbb.forum.forum", forumUpdate); expect(mockJetstream.onDelete).toHaveBeenCalledTimes(1); expect(mockJetstream.onDelete).toHaveBeenCalledWith("space.atbb.forum.category", categoryDelete); }); it("should preserve registration order", () => { const registry = new EventHandlerRegistry() .register({ collection: "space.atbb.post", onCreate: vi.fn() }) .register({ collection: "space.atbb.forum.forum", onCreate: vi.fn() }) .register({ collection: "space.atbb.membership", onCreate: vi.fn() }); expect(registry.getCollections()).toEqual([ "space.atbb.post", "space.atbb.forum.forum", "space.atbb.membership", ]); }); });