Skip to content

Commit 6888b4a

Browse files
committed
Added unit test for event origin detection
1 parent df605a2 commit 6888b4a

File tree

1 file changed

+226
-0
lines changed

1 file changed

+226
-0
lines changed
Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
open RescriptMocha
2+
3+
describe("EventOrigin Detection Logic", () => {
4+
describe("allChainsEventsProcessedToEndblock", () => {
5+
it("should return true when all chains have reached their end block", () => {
6+
// Create mock chain fetchers that have all reached end block
7+
let chainFetcher1 = {
8+
"committedProgressBlockNumber": 1000,
9+
"fetchState": {
10+
"endBlock": Some(1000),
11+
},
12+
}->Utils.magic
13+
14+
let chainFetcher2 = {
15+
"committedProgressBlockNumber": 2000,
16+
"fetchState": {
17+
"endBlock": Some(2000),
18+
},
19+
}->Utils.magic
20+
21+
let chainFetchers =
22+
ChainMap.fromArrayUnsafe([
23+
(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1),
24+
(ChainMap.Chain.makeUnsafe(~chainId=2), chainFetcher2),
25+
])
26+
27+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
28+
Assert.equal(result, true)
29+
})
30+
31+
it("should return false when at least one chain has not reached end block", () => {
32+
// Chain 1 has reached end block, but chain 2 has not
33+
let chainFetcher1 = {
34+
"committedProgressBlockNumber": 1000,
35+
"fetchState": {
36+
"endBlock": Some(1000),
37+
},
38+
}->Utils.magic
39+
40+
let chainFetcher2 = {
41+
"committedProgressBlockNumber": 1500,
42+
"fetchState": {
43+
"endBlock": Some(2000), // Not yet reached
44+
},
45+
}->Utils.magic
46+
47+
let chainFetchers =
48+
ChainMap.fromArrayUnsafe([
49+
(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1),
50+
(ChainMap.Chain.makeUnsafe(~chainId=2), chainFetcher2),
51+
])
52+
53+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
54+
Assert.equal(result, false)
55+
})
56+
57+
it("should return false when a chain has no end block (live mode)", () => {
58+
// Chain with no end block set (continuous live indexing)
59+
let chainFetcher1 = {
60+
"committedProgressBlockNumber": 1000,
61+
"fetchState": {
62+
"endBlock": None, // Live mode, no end block
63+
},
64+
}->Utils.magic
65+
66+
let chainFetchers = ChainMap.fromArrayUnsafe([(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1)])
67+
68+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
69+
Assert.equal(result, false)
70+
})
71+
72+
it("should return false when committedProgressBlockNumber is below endBlock", () => {
73+
let chainFetcher1 = {
74+
"committedProgressBlockNumber": 500,
75+
"fetchState": {
76+
"endBlock": Some(1000),
77+
},
78+
}->Utils.magic
79+
80+
let chainFetchers = ChainMap.fromArrayUnsafe([(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1)])
81+
82+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
83+
Assert.equal(result, false)
84+
})
85+
86+
it("should return true when committedProgressBlockNumber exceeds endBlock", () => {
87+
// Progress can go beyond end block in some edge cases
88+
let chainFetcher1 = {
89+
"committedProgressBlockNumber": 1500,
90+
"fetchState": {
91+
"endBlock": Some(1000),
92+
},
93+
}->Utils.magic
94+
95+
let chainFetchers = ChainMap.fromArrayUnsafe([(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1)])
96+
97+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
98+
Assert.equal(result, true)
99+
})
100+
101+
it("should handle empty chainFetchers map (edge case)", () => {
102+
let chainFetchers = ChainMap.fromArrayUnsafe([])
103+
104+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
105+
// Array.every returns true for empty array
106+
Assert.equal(result, true)
107+
})
108+
109+
it("should return false in multi-chain scenario when only some chains reached end", () => {
110+
let chainFetcher1 = {
111+
"committedProgressBlockNumber": 1000,
112+
"fetchState": {
113+
"endBlock": Some(1000), // Reached
114+
},
115+
}->Utils.magic
116+
117+
let chainFetcher2 = {
118+
"committedProgressBlockNumber": 1999,
119+
"fetchState": {
120+
"endBlock": Some(2000), // Not reached (1 block away)
121+
},
122+
}->Utils.magic
123+
124+
let chainFetcher3 = {
125+
"committedProgressBlockNumber": 3000,
126+
"fetchState": {
127+
"endBlock": Some(3000), // Reached
128+
},
129+
}->Utils.magic
130+
131+
let chainFetchers =
132+
ChainMap.fromArrayUnsafe([
133+
(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1),
134+
(ChainMap.Chain.makeUnsafe(~chainId=2), chainFetcher2),
135+
(ChainMap.Chain.makeUnsafe(~chainId=3), chainFetcher3),
136+
])
137+
138+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
139+
Assert.equal(result, false)
140+
})
141+
142+
it("should return true only when ALL chains in multi-chain scenario reached end", () => {
143+
let chainFetcher1 = {
144+
"committedProgressBlockNumber": 1000,
145+
"fetchState": {
146+
"endBlock": Some(1000),
147+
},
148+
}->Utils.magic
149+
150+
let chainFetcher2 = {
151+
"committedProgressBlockNumber": 2000,
152+
"fetchState": {
153+
"endBlock": Some(2000),
154+
},
155+
}->Utils.magic
156+
157+
let chainFetcher3 = {
158+
"committedProgressBlockNumber": 3000,
159+
"fetchState": {
160+
"endBlock": Some(3000),
161+
},
162+
}->Utils.magic
163+
164+
let chainFetchers =
165+
ChainMap.fromArrayUnsafe([
166+
(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher1),
167+
(ChainMap.Chain.makeUnsafe(~chainId=2), chainFetcher2),
168+
(ChainMap.Chain.makeUnsafe(~chainId=3), chainFetcher3),
169+
])
170+
171+
let result = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
172+
Assert.equal(result, true)
173+
})
174+
})
175+
176+
describe("eventOrigin determination in processEventBatch", () => {
177+
it("should be Historical when chains have not reached end block", () => {
178+
// This test verifies the logic:
179+
// eventOrigin = if chainFetchers->allChainsEventsProcessedToEndblock { Live } else { Historical }
180+
181+
let chainFetcher = {
182+
"committedProgressBlockNumber": 500,
183+
"fetchState": {
184+
"endBlock": Some(1000),
185+
},
186+
}->Utils.magic
187+
188+
let chainFetchers = ChainMap.fromArrayUnsafe([(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher)])
189+
let allProcessed = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
190+
191+
// When not all chains processed to end block
192+
Assert.equal(allProcessed, false)
193+
// Then eventOrigin should be Historical
194+
let expectedOrigin: Internal.eventOrigin = Historical
195+
let actualOrigin: Internal.eventOrigin = if allProcessed {
196+
Live
197+
} else {
198+
Historical
199+
}
200+
Assert.equal(actualOrigin, expectedOrigin)
201+
})
202+
203+
it("should be Live when all chains have reached end block", () => {
204+
let chainFetcher = {
205+
"committedProgressBlockNumber": 1000,
206+
"fetchState": {
207+
"endBlock": Some(1000),
208+
},
209+
}->Utils.magic
210+
211+
let chainFetchers = ChainMap.fromArrayUnsafe([(ChainMap.Chain.makeUnsafe(~chainId=1), chainFetcher)])
212+
let allProcessed = EventProcessing.allChainsEventsProcessedToEndblock(chainFetchers)
213+
214+
// When all chains processed to end block
215+
Assert.equal(allProcessed, true)
216+
// Then eventOrigin should be Live
217+
let expectedOrigin: Internal.eventOrigin = Live
218+
let actualOrigin: Internal.eventOrigin = if allProcessed {
219+
Live
220+
} else {
221+
Historical
222+
}
223+
Assert.equal(actualOrigin, expectedOrigin)
224+
})
225+
})
226+
})

0 commit comments

Comments
 (0)