import pkg/chronos import pkg/questionable import pkg/questionable/results import pkg/asynctest/chronos/unittest import std/sequtils import ../../../codexcrawler/components/chainmetrics import ../../../codexcrawler/services/marketplace/market import ../../../codexcrawler/types import ../../../codexcrawler/state import ../mocks/mockstate import ../mocks/mockmetrics import ../mocks/mockmarketplace import ../helpers suite "ChainMetrics": var state: MockState metrics: MockMetrics marketplace: MockMarketplaceService chain: ChainMetrics setup: state = createMockState() metrics = createMockMetrics() marketplace = createMockMarketplaceService() metrics.slotFill = -1 chain = ChainMetrics.new(state, metrics, marketplace) (await chain.start()).tryGet() teardown: (await chain.stop()).tryGet() state.checkAllUnsubscribed() proc onStep() {.async.} = (await state.steppers[0]()).tryGet() test "start should start stepper for 10 minutes": check: state.delays.len == 1 state.delays[0] == 10.minutes test "onStep is not activated when config.marketplaceEnable is false": # Recreate chainMetrics, reset mockstate: (await chain.stop()).tryGet() state.steppers = @[] # disable marketplace: state.config.marketplaceEnable = false (await chain.start()).tryGet() check: state.steppers.len == 0 test "step should not call setSlotFill when getRecentSlotFillEvents fails": let testValue = -123 metrics.slotFill = testValue marketplace.recentSlotFillEventsReturn = seq[SlotFilled].failure("testfailure") await onStep() check: metrics.slotFill == testValue test "step should setSlotFill to zero when getRecentSlotFillEvents returns empty seq": metrics.slotFill = -123 marketplace.recentSlotFillEventsReturn = success(newSeq[SlotFilled]()) await onStep() check: metrics.slotFill == 0 test "step should setSlotFill to the length of seq returned from getRecentSlotFillEvents": let fills = @[SlotFilled(), SlotFilled(), SlotFilled(), SlotFilled()] marketplace.recentSlotFillEventsReturn = success(fills) await onStep() check: metrics.slotFill == fills.len