import { describe, it, expect, vi, beforeEach } from "vitest";
import {
saveMemoryHandler,
readMemoryHandler,
listMemoriesHandler,
clearMemoryHandler,
} from "./memory.js";
import fs from "fs/promises";
vi.mock("fs/promises");
describe("Memory Tools", () => {
beforeEach(() => {
vi.clearAllMocks();
// Default mock for file existence/reading
(fs.access as any).mockResolvedValue(undefined);
(fs.readFile as any).mockResolvedValue("{}");
});
describe("saveMemoryHandler", () => {
it("should save memory", async () => {
await saveMemoryHandler({ key: "test", value: "data" });
expect(fs.writeFile).toHaveBeenCalled();
const writeCall = (fs.writeFile as any).mock.calls[0];
expect(writeCall[1]).toContain('"test"');
expect(writeCall[1]).toContain('"value": "data"');
});
});
describe("readMemoryHandler", () => {
it("should read memory", async () => {
(fs.readFile as any).mockResolvedValue(
JSON.stringify({ test: { value: "data" } }),
);
const result = await readMemoryHandler({ key: "test" });
expect(result.content[0].text).toContain('"value": "data"');
});
it("should handle missing key", async () => {
const result = await readMemoryHandler({ key: "missing" });
expect(result.content[0].text).toBe("Key not found.");
});
});
describe("listMemoriesHandler", () => {
it("should list memories", async () => {
(fs.readFile as any).mockResolvedValue(
JSON.stringify({ test: { value: "data", project: "p1" } }),
);
const result = await listMemoriesHandler({});
expect(result.content[0].text).toContain("**test**: data");
});
});
describe("clearMemoryHandler", () => {
it("should clear specific memory", async () => {
(fs.readFile as any).mockResolvedValue(
JSON.stringify({ test: { value: "data" } }),
);
await clearMemoryHandler({ key: "test" });
expect(fs.writeFile).toHaveBeenCalled();
const writeCall = (fs.writeFile as any).mock.calls[0];
expect(writeCall[1]).toBe("{}"); // Empty object after deletion
});
});
});