nim-datastore/tests/datastore/test_tiered_datastore.nim
2022-06-22 13:16:43 -05:00

154 lines
3.3 KiB
Nim

import std/options
import std/os
import pkg/stew/results
import pkg/unittest2
import ../../datastore/filesystem_datastore
import ../../datastore/sqlite_datastore
import ../../datastore/tiered_datastore
suite "TieredDatastore":
setup:
# assumes tests/test_all is run from project root, e.g. with `nimble test`
let
bytes = @[1.byte, 2.byte, 3.byte]
key = Key.init("a:b/c/d:e").get
root = "tests" / "test_data"
rootAbs = getCurrentDir() / root
discard bytes # suppresses "declared but not used" re: bytes
discard key # # suppresses "declared but not used" re: key
removeDir(rootAbs)
require(not dirExists(rootAbs))
var
ds1 = SQLiteDatastore.new(inMemory = true).get
ds2 = FileSystemDatastore.new(rootAbs).get
discard ds2 # suppresses "declared but not used" re: ds2
teardown:
ds1.close
removeDir(rootAbs)
require(not dirExists(rootAbs))
test "new":
check:
TieredDatastore.new().isErr
TieredDatastore.new([]).isErr
TieredDatastore.new(@[]).isErr
TieredDatastore.new(ds1, ds2).isOk
TieredDatastore.new([ds1, ds2]).isOk
TieredDatastore.new(@[ds1, ds2]).isOk
test "accessors":
let
stores = @[ds1, ds2]
check:
TieredDatastore.new(ds1, ds2).get.stores == stores
TieredDatastore.new([ds1, ds2]).get.stores == stores
TieredDatastore.new(@[ds1, ds2]).get.stores == stores
test "put":
let
ds = TieredDatastore.new(ds1, ds2).get
assert ds1.get(key).get.isNone
assert ds2.get(key).get.isNone
let
putRes = ds.put(key, bytes)
check:
putRes.isOk
ds1.get(key).get.get == bytes
ds2.get(key).get.get == bytes
test "delete":
let
ds = TieredDatastore.new(ds1, ds2).get
putRes = ds.put(key, bytes)
assert putRes.isOk
assert ds1.get(key).get.get == bytes
assert ds2.get(key).get.get == bytes
let
delRes = ds.delete(key)
check:
delRes.isOk
ds1.get(key).get.isNone
ds2.get(key).get.isNone
test "contains":
let
ds = TieredDatastore.new(ds1, ds2).get
assert not ds1.contains(key).get
assert not ds2.contains(key).get
let
putRes = ds.put(key, bytes)
assert putRes.isOk
let
containsRes = ds.contains(key)
check:
containsRes.isOk
containsRes.get
ds1.contains(key).get
ds2.contains(key).get
test "get":
var
ds = TieredDatastore.new(ds1, ds2).get
assert ds1.get(key).get.isNone
assert ds2.get(key).get.isNone
check: ds.get(key).get.isNone
let
putRes = ds.put(key, bytes)
assert putRes.isOk
var
getRes = ds.get(key)
check:
getRes.isOk
getRes.get.isSome
getRes.get.get == bytes
ds1.get(key).get.isSome
ds2.get(key).get.isSome
ds1.get(key).get.get == bytes
ds2.get(key).get.get == bytes
ds1.close
ds1 = SQLiteDatastore.new(inMemory = true).get
ds = TieredDatastore.new(ds1, ds2).get
assert ds1.get(key).get.isNone
assert ds2.get(key).get.isSome
assert ds2.get(key).get.get == bytes
getRes = ds.get(key)
check:
getRes.isOk
getRes.get.isSome
getRes.get.get == bytes
ds1.get(key).get.isSome
ds1.get(key).get.get == bytes
# test "query":
# check:
# true