2025-03-24 14:16:12 +01:00

99 lines
2.1 KiB
Nim

import std/os
import pkg/chronos
import pkg/questionable/results
import pkg/asynctest/chronos/unittest
import pkg/datastore/typedds
import ../../../codexcrawler/components/requeststore
import ../../../codexcrawler/utils/datastoreutils
import ../../../codexcrawler/types
import ../../../codexcrawler/state
import ../mocks/mockstate
import ../helpers
suite "Requeststore":
let
dsPath = getTempDir() / "testds"
requeststoreName = "requeststore"
var
ds: TypedDatastore
state: MockState
store: RequestStore
setup:
ds = createTypedDatastore(dsPath).tryGet()
state = createMockState()
store = RequestStore.new(state, ds)
teardown:
(await ds.close()).tryGet()
state.checkAllUnsubscribed()
removeDir(dsPath)
test "requestEntry encoding":
let entry = RequestEntry(id: genRid())
let
bytes = entry.encode()
decoded = RequestEntry.decode(bytes).tryGet()
check:
entry.id == decoded.id
test "add stores a new requestId":
let rid = genRid()
(await store.add(rid)).tryGet()
let
key = Key.init(requeststoreName / $rid).tryGet()
stored = (await get[RequestEntry](ds, key)).tryGet()
check:
stored.id == rid
test "remove will remove an entry":
let rid = genRid()
(await store.add(rid)).tryGet()
(await store.remove(rid)).tryGet()
let
key = Key.init(requeststoreName / $rid).tryGet()
isStored = (await ds.has(key)).tryGet()
check:
isStored == false
test "iterateAll yields all entries":
let
rid1 = genRid()
rid2 = genRid()
rid3 = genRid()
(await store.add(rid1)).tryGet()
(await store.add(rid2)).tryGet()
(await store.add(rid3)).tryGet()
var entries = newSeq[RequestEntry]()
proc onEntry(entry: RequestEntry): Future[?!void] {.async: (raises: []), gcsafe.} =
entries.add(entry)
return success()
(await store.iterateAll(onEntry)).tryGet()
check:
entries.len == 3
let
ids = @[entries[0].id, entries[1].id, entries[2].id]
all = @[rid1, rid2, rid3]
for id in ids:
check:
id in all
for id in all:
check:
id in ids