Skip to content

Commit

Permalink
Tests for skipping unnecessary writes
Browse files Browse the repository at this point in the history
  • Loading branch information
tbekas committed Aug 28, 2024
1 parent 04fa15c commit 9bcef1a
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
95 changes: 95 additions & 0 deletions tests/datastore/testdefaultimpl.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import std/options
import std/sequtils
import std/tables

import pkg/asynctest
import pkg/chronos
import pkg/questionable
import pkg/questionable/results

import pkg/datastore
import pkg/datastore/defaultimpl

type
MockDatastore* = ref object of Datastore
values: TableRef[Key, seq[byte]]
lock: AsyncLock
calls: seq[MethodCall]

Method = enum
Put, Get, Delete, Has

MethodCall = object
key: Key
case kind: Method
of Put:
data: seq[byte]
of Get, Delete, Has:
discard

method put*(self: MockDatastore, key: Key, data: seq[byte]): Future[?!void] {.async.} =
self.calls.add(MethodCall(kind: Put, key: key, data: data))
self.values[key] = data
success()

method get*(self: MockDatastore, key: Key): Future[?!seq[byte]] {.async.} =
self.calls.add(MethodCall(kind: Get, key: key))
if key notin self.values:
failure(newException(DatastoreKeyNotFound, "Key doesn't exist"))
else:
success(self.values[key])

method has*(self: MockDatastore, key: Key): Future[?!bool] {.async.} =
self.calls.add(MethodCall(kind: Has, key: key))
success(key in self.values)

method delete*(self: MockDatastore, key: Key): Future[?!void] {.async.} =
self.calls.add(MethodCall(kind: Delete, key: key))
self.values.del(key)
success()

method modifyGet*(self: MockDatastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.async.} =
await defaultModifyGetImpl(self, self.lock, key, fn)

method modify*(self: MockDatastore, key: Key, fn: Modify): Future[?!void] {.async.} =
await defaultModifyImpl(self, self.lock, key, fn)

proc new*(
T: type MockDatastore): T =
T(
values: newTable[Key, seq[byte]](),
lock: newAsyncLock(),
calls: newSeq[MethodCall]()
)

suite "Test defaultimpl":
var
ds: MockDatastore
key: Key

setup:
ds = MockDatastore.new()
key = Key.init("/a/b").tryGet()

test "should put a value that is different than current value":

(await ds.put(key, @[byte 1, 2, 3])).tryGet()

proc modifyFn(maybeCurr: ?seq[byte]): Future[?seq[byte]] {.async.} =
some(@[byte 3, 2, 1])

(await ds.modify(key, modifyFn)).tryGet()

check:
ds.calls.filterIt(it.kind == Put).len == 2

test "should not attempt to put value that is equal to current value":
(await ds.put(key, @[byte 1, 2, 3])).tryGet()

proc modifyFn(maybeCurr: ?seq[byte]): Future[?seq[byte]] {.async.} =
some(@[byte 1, 2, 3])

(await ds.modify(key, modifyFn)).tryGet()

check:
ds.calls.filterIt(it.kind == Put).len == 1
3 changes: 2 additions & 1 deletion tests/testall.nim
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import
./datastore/testsql,
./datastore/testleveldb,
./datastore/testtieredds,
./datastore/testmountedds
./datastore/testmountedds,
./datastore/testdefaultimpl

{.warning[UnusedImport]: off.}

0 comments on commit 9bcef1a

Please sign in to comment.