WIP! A BB-style forum, on the ATmosphere! We're still working... we'll be back soon when we have something to show off!
node typescript hono htmx atproto
at root/atb-56-theme-caching-layer 132 lines 4.1 kB view raw
1import { describe, it, expect, vi } from "vitest"; 2import { EventHandlerRegistry } from "../event-handler-registry.js"; 3 4describe("EventHandlerRegistry", () => { 5 it("should register handlers for collections", () => { 6 const registry = new EventHandlerRegistry(); 7 8 registry.register({ 9 collection: "space.atbb.post", 10 onCreate: vi.fn(), 11 }); 12 13 expect(registry.getCollections()).toEqual(["space.atbb.post"]); 14 }); 15 16 it("should support fluent interface", () => { 17 const registry = new EventHandlerRegistry() 18 .register({ collection: "space.atbb.post", onCreate: vi.fn() }) 19 .register({ collection: "space.atbb.forum.forum", onCreate: vi.fn() }); 20 21 expect(registry.getCollections()).toEqual(["space.atbb.post", "space.atbb.forum.forum"]); 22 }); 23 24 it("should apply handlers to Jetstream instance", () => { 25 const onCreate = vi.fn(); 26 const onUpdate = vi.fn(); 27 const onDelete = vi.fn(); 28 29 const mockJetstream = { 30 onCreate: vi.fn(), 31 onUpdate: vi.fn(), 32 onDelete: vi.fn(), 33 }; 34 35 const registry = new EventHandlerRegistry().register({ 36 collection: "space.atbb.post", 37 onCreate, 38 onUpdate, 39 onDelete, 40 }); 41 42 registry.applyTo(mockJetstream as any); 43 44 expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", onCreate); 45 expect(mockJetstream.onUpdate).toHaveBeenCalledWith("space.atbb.post", onUpdate); 46 expect(mockJetstream.onDelete).toHaveBeenCalledWith("space.atbb.post", onDelete); 47 }); 48 49 it("should only register provided handlers", () => { 50 const onCreate = vi.fn(); 51 const mockJetstream = { 52 onCreate: vi.fn(), 53 onUpdate: vi.fn(), 54 onDelete: vi.fn(), 55 }; 56 57 const registry = new EventHandlerRegistry().register({ 58 collection: "space.atbb.post", 59 onCreate, // Only onCreate provided 60 }); 61 62 registry.applyTo(mockJetstream as any); 63 64 expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", onCreate); 65 expect(mockJetstream.onUpdate).not.toHaveBeenCalled(); 66 expect(mockJetstream.onDelete).not.toHaveBeenCalled(); 67 }); 68 69 it("should clear all registrations", () => { 70 const registry = new EventHandlerRegistry().register({ 71 collection: "space.atbb.post", 72 onCreate: vi.fn(), 73 }); 74 75 expect(registry.getCollections()).toHaveLength(1); 76 77 registry.clear(); 78 79 expect(registry.getCollections()).toHaveLength(0); 80 }); 81 82 it("should handle multiple collections with partial handlers", () => { 83 const mockJetstream = { 84 onCreate: vi.fn(), 85 onUpdate: vi.fn(), 86 onDelete: vi.fn(), 87 }; 88 89 const postCreate = vi.fn(); 90 const forumUpdate = vi.fn(); 91 const categoryDelete = vi.fn(); 92 93 const registry = new EventHandlerRegistry() 94 .register({ 95 collection: "space.atbb.post", 96 onCreate: postCreate, 97 }) 98 .register({ 99 collection: "space.atbb.forum.forum", 100 onUpdate: forumUpdate, 101 }) 102 .register({ 103 collection: "space.atbb.forum.category", 104 onDelete: categoryDelete, 105 }); 106 107 registry.applyTo(mockJetstream as any); 108 109 // Verify only the registered handlers were called 110 expect(mockJetstream.onCreate).toHaveBeenCalledTimes(1); 111 expect(mockJetstream.onCreate).toHaveBeenCalledWith("space.atbb.post", postCreate); 112 113 expect(mockJetstream.onUpdate).toHaveBeenCalledTimes(1); 114 expect(mockJetstream.onUpdate).toHaveBeenCalledWith("space.atbb.forum.forum", forumUpdate); 115 116 expect(mockJetstream.onDelete).toHaveBeenCalledTimes(1); 117 expect(mockJetstream.onDelete).toHaveBeenCalledWith("space.atbb.forum.category", categoryDelete); 118 }); 119 120 it("should preserve registration order", () => { 121 const registry = new EventHandlerRegistry() 122 .register({ collection: "space.atbb.post", onCreate: vi.fn() }) 123 .register({ collection: "space.atbb.forum.forum", onCreate: vi.fn() }) 124 .register({ collection: "space.atbb.membership", onCreate: vi.fn() }); 125 126 expect(registry.getCollections()).toEqual([ 127 "space.atbb.post", 128 "space.atbb.forum.forum", 129 "space.atbb.membership", 130 ]); 131 }); 132});