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
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});