import { MemoryStore } from "../src/memory-store";
import fs from "fs/promises";
import path from "path";
import os from "os";
describe("MemoryStore", () => {
let memoryStore: MemoryStore;
let testDir: string;
beforeEach(async () => {
// Create a temporary directory for testing
testDir = path.join(os.tmpdir(), `rag-context-test-${Date.now()}`);
memoryStore = new MemoryStore(testDir);
await memoryStore.initialize();
});
afterEach(async () => {
// Clean up
memoryStore.close();
await fs.rm(testDir, { recursive: true, force: true });
});
test("should store and retrieve memory by key", async () => {
const memory = await memoryStore.set("test-key", "test content", {
tag: "test",
});
expect(memory.key).toBe("test-key");
expect(memory.content).toBe("test content");
expect(memory.metadata).toEqual({ tag: "test" });
const retrieved = await memoryStore.get("test-key");
expect(retrieved).not.toBeNull();
expect(retrieved?.content).toBe("test content");
});
test("should return null for non-existent key", async () => {
const result = await memoryStore.get("non-existent");
expect(result).toBeNull();
});
test("should update existing memory", async () => {
await memoryStore.set("update-key", "original content");
await memoryStore.set("update-key", "updated content");
const retrieved = await memoryStore.get("update-key");
expect(retrieved?.content).toBe("updated content");
});
test("should delete memory", async () => {
await memoryStore.set("delete-key", "content to delete");
const deleted = await memoryStore.delete("delete-key");
expect(deleted).toBe(true);
const retrieved = await memoryStore.get("delete-key");
expect(retrieved).toBeNull();
});
test("should list memories", async () => {
await memoryStore.set("key1", "content1");
await memoryStore.set("key2", "content2");
await memoryStore.set("key3", "content3");
const list = await memoryStore.list(2);
expect(list).toHaveLength(2);
expect(list[0].key).toBe("key3"); // Most recent first
});
test("should search memories", async () => {
await memoryStore.set("search1", "The quick brown fox");
await memoryStore.set("search2", "jumps over the lazy dog");
await memoryStore.set("search3", "The fox is clever");
const results = await memoryStore.search("fox");
expect(results).toHaveLength(2);
expect(results.map((r) => r.key)).toContain("search1");
expect(results.map((r) => r.key)).toContain("search3");
});
});