2025-06-02 15:30:12 +02:00

95 lines
2.3 KiB
Nim

import pkg/chronos
import pkg/questionable/results
import pkg/asynctest/chronos/unittest
import ../../../codexcrawler/components/todolist
import ../../../codexcrawler/utils/asyncdataevent
import ../../../codexcrawler/types
import ../../../codexcrawler/state
import ../mocks/mockstate
import ../mocks/mockmetrics
import ../helpers
suite "TodoList":
var
nid: Nid
state: MockState
metrics: MockMetrics
todo: TodoList
setup:
nid = genNid()
state = createMockState()
metrics = createMockMetrics()
todo = TodoList.new(state, metrics)
(await todo.awake()).tryGet()
teardown:
(await todo.stop()).tryGet()
state.checkAllUnsubscribed()
proc fireNewNodesDiscoveredEvent(nids: seq[Nid]) {.async: (raises: []).} =
try:
(await state.events.newNodesDiscovered.fire(nids)).tryGet()
except CatchableError:
raiseAssert("CatchableError in fireNewNodesDiscoveredEvent")
proc fireNodesToRevisitEvent(nids: seq[Nid]) {.async: (raises: []).} =
try:
(await state.events.nodesToRevisit.fire(nids)).tryGet()
except CatchableError:
raiseAssert("CatchableError in fireNodesToRevisitEvent")
test "discovered nodes are added to todo list":
await fireNewNodesDiscoveredEvent(@[nid])
let item = (await todo.pop).tryGet()
check:
item == nid
test "revisit nodes are added to todo list":
await fireNodesToRevisitEvent(@[nid])
let item = (await todo.pop).tryGet()
check:
item == nid
test "newNodesDiscovered event updates todo metric":
await fireNewNodesDiscoveredEvent(@[nid])
check:
metrics.todo == 1
test "nodesToRevisit event updates todo metric":
await fireNodesToRevisitEvent(@[nid])
check:
metrics.todo == 1
test "does not store duplicates":
await fireNewNodesDiscoveredEvent(@[nid])
await fireNodesToRevisitEvent(@[nid])
check:
metrics.todo == 1
test "pop on empty todo list waits until item is added":
let popFuture = todo.pop()
check:
not popFuture.finished
await fireNewNodesDiscoveredEvent(@[nid])
check:
popFuture.finished
popFuture.value.tryGet() == nid
test "pop updates todo metric":
await fireNewNodesDiscoveredEvent(@[nid])
discard (await todo.pop()).tryGet()
check:
metrics.todo == 0