deskpaw-memory/test/store.test.js
2026-09-22 23:33:47 +08:00

52 lines
3.0 KiB
JavaScript

import assert from "node:assert/strict";
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import test from "node:test";
import { MemoryStore } from "../src/store.js";
test("task transition recommends consolidation for an unrelated completed task", () => {
const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-"));
const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles"));
try {
store.completeTask({ task_id: "one", objective: "打开微信并发送日报", status: "completed", result: "已发送", context_epoch: "e1" });
const related = store.assessTransition({ objective: "继续发送刚才的日报" });
const unrelated = store.assessTransition({ objective: "分析项目中的 TypeScript 架构" });
assert.notEqual(related.relationship, "new");
assert.equal(unrelated.relationship, "new");
assert.equal(unrelated.recommended_action, "consolidate");
} finally {
store.close();
rmSync(directory, { recursive: true, force: true });
}
});
test("schedule context creates and projects a stable bundle", () => {
const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-"));
const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles"));
try {
const context = store.prepareContext({ task_id: "run-1", objective: "每天发送 AI 简报", schedule_id: "daily-ai", schedule_name: "AI 简报" });
assert.equal(context.schedule_bundle.documents.some((document) => document.name === "requirements.md"), true);
store.completeTask({ task_id: "run-1", objective: "每天发送 AI 简报", status: "completed", result: "今日已发送 5 条", schedule_id: "daily-ai", schedule_name: "AI 简报", context_epoch: context.context_epoch });
assert.match(readFileSync(join(directory, "bundles", "schedule", "daily-ai", "runs", "run-1", "summary.md"), "utf8"), /今日已发送/);
} finally {
store.close();
rmSync(directory, { recursive: true, force: true });
}
});
test("bundle document updates use optimistic revisions", () => {
const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-"));
const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles"));
try {
store.prepareContext({ task_id: "run-1", objective: "每天发送 AI 简报", schedule_id: "daily-ai", schedule_name: "AI 简报" });
const bundle = store.bundle("schedule", "daily-ai");
const updated = store.updateBundleDocument({ scope: "schedule", object_id: "daily-ai", name: "preferences.md", body: "多放开源项目。", expected_revision: bundle.revision });
assert.equal(updated.revision, bundle.revision + 1);
assert.throws(() => store.updateBundleDocument({ scope: "schedule", object_id: "daily-ai", name: "preferences.md", body: "旧版本覆盖", expected_revision: bundle.revision }), /revision conflict/);
} finally {
store.close();
rmSync(directory, { recursive: true, force: true });
}
});