mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 22:23:10 +00:00
154 lines
3.3 KiB
Nim
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
|