Skip to content

Commit ea08064

Browse files
committed
Test that processEventBatch correctly wires eventOrigin through to handlers
1 parent 6888b4a commit ea08064

File tree

2 files changed

+170
-35
lines changed

2 files changed

+170
-35
lines changed

scenarios/test_codegen/src/EventHandlers.res

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,13 @@ Handlers.Gravatar.TestEvent.handler(async _ => {
141141
()
142142
})
143143

144-
// Test eventOrigin accessibility
144+
// Test eventOrigin accessibility - exposed for testing
145+
let lastEmptyEventOrigin: ref<option<Internal.eventOrigin>> = ref(None)
146+
145147
Handlers.Gravatar.EmptyEvent.handler(async ({context}) => {
146148
// This handler tests that eventOrigin is accessible in the context
147149
// It will be Historical during sync and Live during live indexing
148-
let _origin = context.eventOrigin
150+
lastEmptyEventOrigin := Some(context.eventOrigin)
149151
// Log it so we can verify it's working
150152
switch context.eventOrigin {
151153
| Historical => context.log.debug("Processing historical event")

scenarios/test_codegen/test/EventOriginDetection_test.res

Lines changed: 166 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)