@@ -174,53 +174,186 @@ describe("EventOrigin Detection Logic", () => {
174174  })
175175
176176  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 } 
177+     // These tests actually invoke EventProcessing.processEventBatch and verify 
178+     // that it correctly passes eventOrigin to handlers based on chainFetchers state 
180179
180+     Async .it ("should pass Historical when chains have not reached end block" , async  () =>  {
181+       EventHandlers .lastEmptyEventOrigin  :=  None 
182+ 
183+       // Setup: chain has NOT reached its end block (500 < 1000) 
181184      let  chainFetcher  =  {
182185        "committedProgressBlockNumber" : 500 ,
183-         "fetchState" : {
184-           "endBlock" : Some (1000 ),
185-         },
186+         "fetchState" : {"endBlock" : Some (1000 )},
186187      }-> Utils .magic 
188+       let  chainFetchers  =  ChainMap .fromArrayUnsafe ([(ChainMap .Chain .makeUnsafe (~chainId = 54321 ), chainFetcher )])
189+ 
190+       let  config  =  RegisterHandlers .registerAllHandlers ()
191+       let  inMemoryStore  =  InMemoryStore .make ()
192+       let  loadManager  =  LoadManager .make ()
193+ 
194+       // Create an EmptyEvent that will trigger our handler 
195+       let  emptyEventLog : Types .eventLog <Types .Gravatar .EmptyEvent .eventArgs > =  {
196+         params : (),
197+         chainId : 54321 ,
198+         srcAddress : "0xabc0000000000000000000000000000000000000" -> Address .Evm .fromStringOrThrow ,
199+         logIndex : 1 ,
200+         transaction : MockEvents .tx1 ,
201+         block : MockEvents .block1 ,
202+       }
187203
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 
204+       let  item  =  Internal .Event ({
205+         timestamp : emptyEventLog .block .timestamp ,
206+         chain : MockConfig .chain1337 ,
207+         blockNumber : emptyEventLog .block .number ,
208+         logIndex : emptyEventLog .logIndex ,
209+         eventConfig : (Types .Gravatar .EmptyEvent .register () :> Internal .eventConfig ),
210+         event : emptyEventLog -> Internal .fromGenericEvent ,
211+       })
212+ 
213+       // Actually call processEventBatch - the real code path 
214+       let  _  =  (await  EventProcessing .processEventBatch (
215+         ~items = [item ],
216+         ~progressedChains = [{
217+           chainId : 54321 ,
218+           batchSize : 1 ,
219+           progressBlockNumber : 500 ,
220+           isProgressAtHead : false ,
221+           totalEventsProcessed : 1 ,
222+         }],
223+         ~inMemoryStore ,
224+         ~isInReorgThreshold = false ,
225+         ~loadManager ,
226+         ~config ,
227+         ~chainFetchers ,
228+       ))-> Belt .Result .getExn 
229+ 
230+       // Assert on the eventOrigin that processEventBatch passed to the handler 
231+       switch  EventHandlers .lastEmptyEventOrigin .contents  {
232+       | Some (Historical ) =>  Assert .ok (true )
233+       | Some (Live ) =>  Assert .fail ("Expected Historical but processEventBatch passed Live" )
234+       | None  =>  Assert .fail ("Handler was not called - processEventBatch didn't execute handler" )
199235      }
200-       Assert .equal (actualOrigin , expectedOrigin )
201236    })
202237
203-     it ("should be Live when all chains have reached end block" , () =>  {
238+     Async .it ("should pass Live when all chains have reached end block" , async  () =>  {
239+       EventHandlers .lastEmptyEventOrigin  :=  None 
240+ 
241+       // Setup: chain HAS reached its end block (1000 >= 1000) 
204242      let  chainFetcher  =  {
205243        "committedProgressBlockNumber" : 1000 ,
206-         "fetchState" : {
207-           "endBlock" : Some (1000 ),
208-         },
244+         "fetchState" : {"endBlock" : Some (1000 )},
209245      }-> Utils .magic 
246+       let  chainFetchers  =  ChainMap .fromArrayUnsafe ([(ChainMap .Chain .makeUnsafe (~chainId = 54321 ), chainFetcher )])
247+ 
248+       let  config  =  RegisterHandlers .registerAllHandlers ()
249+       let  inMemoryStore  =  InMemoryStore .make ()
250+       let  loadManager  =  LoadManager .make ()
251+ 
252+       let  emptyEventLog : Types .eventLog <Types .Gravatar .EmptyEvent .eventArgs > =  {
253+         params : (),
254+         chainId : 54321 ,
255+         srcAddress : "0xabc0000000000000000000000000000000000000" -> Address .Evm .fromStringOrThrow ,
256+         logIndex : 1 ,
257+         transaction : MockEvents .tx1 ,
258+         block : MockEvents .block1 ,
259+       }
210260
211-       let  chainFetchers  =  ChainMap .fromArrayUnsafe ([(ChainMap .Chain .makeUnsafe (~chainId = 1 ), chainFetcher )])
212-       let  allProcessed  =  EventProcessing .allChainsEventsProcessedToEndblock (chainFetchers )
261+       let  item  =  Internal .Event ({
262+         timestamp : emptyEventLog .block .timestamp ,
263+         chain : MockConfig .chain1337 ,
264+         blockNumber : emptyEventLog .block .number ,
265+         logIndex : emptyEventLog .logIndex ,
266+         eventConfig : (Types .Gravatar .EmptyEvent .register () :> Internal .eventConfig ),
267+         event : emptyEventLog -> Internal .fromGenericEvent ,
268+       })
269+ 
270+       // Actually call processEventBatch 
271+       let  _  =  (await  EventProcessing .processEventBatch (
272+         ~items = [item ],
273+         ~progressedChains = [{
274+           chainId : 54321 ,
275+           batchSize : 1 ,
276+           progressBlockNumber : 1000 ,
277+           isProgressAtHead : true ,
278+           totalEventsProcessed : 1 ,
279+         }],
280+         ~inMemoryStore ,
281+         ~isInReorgThreshold = false ,
282+         ~loadManager ,
283+         ~config ,
284+         ~chainFetchers ,
285+       ))-> Belt .Result .getExn 
286+ 
287+       // Assert on what processEventBatch actually passed to the handler 
288+       switch  EventHandlers .lastEmptyEventOrigin .contents  {
289+       | Some (Live ) =>  Assert .ok (true )
290+       | Some (Historical ) =>  Assert .fail ("Expected Live but processEventBatch passed Historical" )
291+       | None  =>  Assert .fail ("Handler was not called" )
292+       }
293+     })
294+ 
295+     Async .it ("should pass Historical in multi-chain when not all reached end" , async  () =>  {
296+       EventHandlers .lastEmptyEventOrigin  :=  None 
297+ 
298+       // Setup: chain 1 reached end, chain 2 has not 
299+       let  chainFetcher1  =  {
300+         "committedProgressBlockNumber" : 1000 ,
301+         "fetchState" : {"endBlock" : Some (1000 )},
302+       }-> Utils .magic 
303+       let  chainFetcher2  =  {
304+         "committedProgressBlockNumber" : 1500 ,
305+         "fetchState" : {"endBlock" : Some (2000 )},
306+       }-> Utils .magic 
307+       let  chainFetchers  =  ChainMap .fromArrayUnsafe ([
308+         (ChainMap .Chain .makeUnsafe (~chainId = 1 ), chainFetcher1 ),
309+         (ChainMap .Chain .makeUnsafe (~chainId = 2 ), chainFetcher2 ),
310+       ])
311+ 
312+       let  config  =  RegisterHandlers .registerAllHandlers ()
313+       let  inMemoryStore  =  InMemoryStore .make ()
314+       let  loadManager  =  LoadManager .make ()
315+ 
316+       let  emptyEventLog : Types .eventLog <Types .Gravatar .EmptyEvent .eventArgs > =  {
317+         params : (),
318+         chainId : 54321 ,
319+         srcAddress : "0xabc0000000000000000000000000000000000000" -> Address .Evm .fromStringOrThrow ,
320+         logIndex : 1 ,
321+         transaction : MockEvents .tx1 ,
322+         block : MockEvents .block1 ,
323+       }
213324
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 
325+       let  item  =  Internal .Event ({
326+         timestamp : emptyEventLog .block .timestamp ,
327+         chain : MockConfig .chain1337 ,
328+         blockNumber : emptyEventLog .block .number ,
329+         logIndex : emptyEventLog .logIndex ,
330+         eventConfig : (Types .Gravatar .EmptyEvent .register () :> Internal .eventConfig ),
331+         event : emptyEventLog -> Internal .fromGenericEvent ,
332+       })
333+ 
334+       // Call the real processEventBatch with multi-chain scenario 
335+       let  _  =  (await  EventProcessing .processEventBatch (
336+         ~items = [item ],
337+         ~progressedChains = [{
338+           chainId : 54321 ,
339+           batchSize : 1 ,
340+           progressBlockNumber : 1000 ,
341+           isProgressAtHead : false ,
342+           totalEventsProcessed : 1 ,
343+         }],
344+         ~inMemoryStore ,
345+         ~isInReorgThreshold = false ,
346+         ~loadManager ,
347+         ~config ,
348+         ~chainFetchers ,
349+       ))-> Belt .Result .getExn 
350+ 
351+       // Verify processEventBatch correctly determined Historical 
352+       switch  EventHandlers .lastEmptyEventOrigin .contents  {
353+       | Some (Historical ) =>  Assert .ok (true )
354+       | Some (Live ) =>  Assert .fail ("Expected Historical but got Live" )
355+       | None  =>  Assert .fail ("Handler was not called" )
222356      }
223-       Assert .equal (actualOrigin , expectedOrigin )
224357    })
225358  })
226359})
0 commit comments