199 lines
5.6 KiB
TypeScript
199 lines
5.6 KiB
TypeScript
import { assertEquals } from "@std/assert";
|
|
import { MemoryKvPrimitives } from "./memory_kv_primitives.ts";
|
|
import { allTests } from "./kv_primitives.test.ts";
|
|
|
|
import type { KV } from "../../plug-api/types/datastore.ts";
|
|
|
|
Deno.test("MemoryKvPrimitives loads from non-existent file without error", async () => {
|
|
const tempPath = await Deno.makeTempFile() + "_nonexistent";
|
|
// Disable throttling for tests
|
|
const store = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store.init();
|
|
|
|
// Should create an empty store
|
|
const result = await store.batchGet([["test"]]);
|
|
assertEquals(result, [undefined]);
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives passes all KvPrimitives tests", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
const store = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store.init();
|
|
await allTests(store);
|
|
await store.close();
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives persists and loads data", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
// Create and populate first instance
|
|
const store1 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store1.init();
|
|
await store1.batchSet([
|
|
{ key: ["test", "key1"], value: "value1" },
|
|
{ key: ["test", "key2"], value: "value2" },
|
|
]);
|
|
|
|
// Force persistence
|
|
await store1.close();
|
|
|
|
// Create second instance that loads from the same file
|
|
const store2 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store2.init();
|
|
|
|
// Check if data was loaded correctly
|
|
const results = await store2.batchGet([["test", "key1"], ["test", "key2"]]);
|
|
assertEquals(results, ["value1", "value2"]);
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives mutations trigger persistence", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
// Create and populate first instance
|
|
const store1 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store1.init();
|
|
await store1.batchSet([{ key: ["test", "key"], value: "value" }]);
|
|
|
|
// No need to wait for throttled persistence since we disabled it
|
|
|
|
// Create second instance without closing the first one
|
|
const store2 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store2.init();
|
|
|
|
// Check if data was persisted
|
|
const results = await store2.batchGet([["test", "key"]]);
|
|
assertEquals(results, ["value"]);
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives persists delete operations", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
// Create and populate store
|
|
const store1 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store1.init();
|
|
await store1.batchSet([
|
|
{ key: ["test", "key1"], value: "value1" },
|
|
{ key: ["test", "key2"], value: "value2" },
|
|
]);
|
|
|
|
// Delete one key
|
|
await store1.batchDelete([["test", "key1"]]);
|
|
|
|
// No need to wait for throttled persistence since we disabled it
|
|
|
|
// Create second instance
|
|
const store2 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store2.init();
|
|
|
|
// Check if delete was persisted
|
|
const results = await store2.batchGet([["test", "key1"], ["test", "key2"]]);
|
|
assertEquals(results, [undefined, "value2"]);
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives.fromFile creates and initializes store", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
// Create JSON file with initial data
|
|
const initialData = {
|
|
"test\0key": "value",
|
|
};
|
|
await Deno.writeTextFile(tempPath, JSON.stringify(initialData));
|
|
|
|
// Use factory method with throttling disabled
|
|
const store = await MemoryKvPrimitives.fromFile(tempPath, {
|
|
throttleMs: 0,
|
|
});
|
|
|
|
// Check if data was loaded
|
|
const result = await store.batchGet([["test", "key"]]);
|
|
assertEquals(result, ["value"]);
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|
|
|
|
Deno.test("MemoryKvPrimitives query works with persisted data", async () => {
|
|
const tempPath = await Deno.makeTempFile();
|
|
|
|
try {
|
|
// Create and populate store
|
|
const store1 = new MemoryKvPrimitives(tempPath, { throttleMs: 0 });
|
|
await store1.init();
|
|
await store1.batchSet([
|
|
{ key: ["test", "key1"], value: "value1" },
|
|
{ key: ["test", "key2"], value: "value2" },
|
|
{ key: ["other", "key"], value: "value3" },
|
|
]);
|
|
|
|
// Force persistence
|
|
await store1.close();
|
|
|
|
// Create second instance
|
|
const store2 = await MemoryKvPrimitives.fromFile(tempPath, {
|
|
throttleMs: 0,
|
|
});
|
|
|
|
// Test query with prefix
|
|
const results: KV[] = [];
|
|
for await (const item of store2.query({ prefix: ["test"] })) {
|
|
results.push(item);
|
|
}
|
|
|
|
assertEquals(results.length, 2);
|
|
assertEquals(results[0].key, ["test", "key1"]);
|
|
assertEquals(results[0].value, "value1");
|
|
assertEquals(results[1].key, ["test", "key2"]);
|
|
assertEquals(results[1].value, "value2");
|
|
} finally {
|
|
// Clean up
|
|
try {
|
|
await Deno.remove(tempPath);
|
|
} catch (_) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
});
|