@x5e/gink
Version:
an eventually consistent database
205 lines • 8.48 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const test_utils_1 = require("./test_utils");
const implementation_1 = require("../implementation");
const utils_1 = require("../implementation/utils");
const implementation_2 = require("../implementation");
it("add and has basic data", async function () {
// set up the objects
for (const store of [
new implementation_1.IndexedDbStore("ks-test1", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
// add a value
await ks.add("key1");
// check that the result exists in the database
(0, utils_1.ensure)(await ks.has("key1"));
const myKey = new Uint8Array(3);
myKey[0] = 94;
myKey[2] = 255;
await ks.add(myKey);
(0, utils_1.ensure)(await ks.has(myKey));
}
});
it("delete, and size work as intended", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test2", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.add("key1");
(0, utils_1.ensure)(await ks.has("key1"));
(0, utils_1.ensure)((await ks.size()) === 1);
await ks.delete("key1");
(0, utils_1.ensure)(!(await ks.has("key1")));
(0, utils_1.ensure)((await ks.size()) === 0);
await ks.add("key1");
await ks.add("key2");
(0, utils_1.ensure)((await ks.size()) === 2);
await ks.delete("key2");
(0, utils_1.ensure)(!(await ks.has("key2")));
}
});
it("entries works as intended", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test3", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.update(["key1", "key2", "key3"]);
const buffer = [];
for await (const [key, val] of ks.entries()) {
await ks.delete(key);
buffer.push(key);
}
(0, utils_1.ensure)((0, utils_1.matches)(buffer, ["key1", "key2", "key3"]));
}
});
it("add multiple keys within a bundler", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test4", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
// make multiple changes in a change set
const bundler = await instance.startBundle();
await ks.add("key1", { bundler });
await ks.add("key2", { bundler });
await bundler.commit("My first bundle!");
// verify the result
(0, utils_1.ensure)(await ks.has("key1"));
(0, utils_1.ensure)(await ks.has("key2"));
(0, utils_1.ensure)(!(await ks.has("key3")));
}
});
it("KeySet.toJson", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test6", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.add("key1");
await ks.update(["key2", "key3"]);
const asJSON = await ks.toJson();
(0, utils_1.ensure)(asJSON === `["key1","key2","key3"]`, asJSON);
}
});
it("KeySet.asOf", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test7", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
const time0 = Date.now() * 1000;
await (0, test_utils_1.sleep)(10);
await ks.add("key1");
await (0, test_utils_1.sleep)(10);
const time1 = Date.now() * 1000;
await (0, test_utils_1.sleep)(10);
await ks.add("key2");
await (0, test_utils_1.sleep)(10);
const time2 = Date.now() * 1000;
// testing asOf for has
(0, utils_1.ensure)(await ks.has("key1", time1));
(0, utils_1.ensure)(await ks.has("key1", -1));
(0, utils_1.ensure)(await ks.has("key1", time2));
(0, utils_1.ensure)(!(await ks.has("key2", time1)));
// testing asOf for toJson
(0, utils_1.ensure)((await ks.toJson(false, time1)) === `["key1"]`);
(0, utils_1.ensure)((await ks.toJson(false, time2)) === `["key1","key2"]`);
// testing asOf for size
(0, utils_1.ensure)((await ks.size(time0)) === 0);
(0, utils_1.ensure)((await ks.size(time1)) === 1);
(0, utils_1.ensure)((await ks.size(time2)) === 2);
// testing asOf toSet
const values = await ks.toSet(time0);
const values1 = await ks.toSet(time1);
(0, utils_1.ensure)(!values.size);
(0, utils_1.ensure)(!values.has("key2"));
(0, utils_1.ensure)(values1.size === 1);
(0, utils_1.ensure)(values1.has("key1"));
}
});
it("KeySet.clear", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test8", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.update(["key1", "key2"]);
const clearMuid = await ks.clear();
await ks.update(["key3", "key4"]);
const asSet = await ks.toSet();
(0, utils_1.ensure)(asSet.has("key4") && !asSet.has("key1"), "did not clear");
const asSetBeforeClear = await ks.toSet(clearMuid.timestamp);
if (asSetBeforeClear.has("key4") || !asSetBeforeClear.has("key1")) {
console.log(asSetBeforeClear);
throw new Error("busted");
}
}
});
it("KeySet.clear(purge)", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test9", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.add("key1");
await (0, test_utils_1.sleep)(10);
const middle = Date.now() * 1000;
await (0, test_utils_1.sleep)(10);
await ks.add("key2");
(0, utils_1.ensure)(await ks.has("key2"));
await ks.clear(true);
const found = await instance.store.getKeyedEntries(ks.address, middle);
(0, utils_1.ensure)(!found.size);
}
});
it("KeySet.reset", async function () {
for (const store of [
new implementation_1.IndexedDbStore("ks-test10", true),
new implementation_1.MemoryStore(true),
]) {
const instance = new implementation_1.Database({ store });
await instance.ready;
const ks = await implementation_2.KeySet.create(instance);
await ks.add("key1");
const afterOne = (0, utils_1.generateTimestamp)();
await ks.add("key2");
(0, utils_1.ensure)(await ks.has("key2"));
await ks.reset(afterOne);
(0, utils_1.ensure)(!(await ks.has("key2")));
(0, utils_1.ensure)(await ks.has("key1"));
await ks.reset();
(0, utils_1.ensure)(!(await ks.has("key1")));
(0, utils_1.ensure)((await ks.size()) === 0);
await ks.add("key3");
const after3 = (0, utils_1.generateTimestamp)();
await ks.add("key4");
(0, utils_1.ensure)((await ks.size()) === 2);
await ks.delete("key3");
(0, utils_1.ensure)((await ks.size()) === 1);
await ks.reset(after3);
(0, utils_1.ensure)((await ks.size()) === 1);
(0, utils_1.ensure)(await ks.has("key3"));
(0, utils_1.ensure)(!(await ks.has("key4")));
}
});
//# sourceMappingURL=KeySet.test.js.map