test(memory-core): share workspace test helper

This commit is contained in:
Vincent Koc
2026-04-06 05:21:45 +01:00
parent cd2f6746f9
commit b0f11f4eef
4 changed files with 45 additions and 47 deletions

View File

@@ -1,27 +1,17 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { afterEach, describe, expect, it } from "vitest";
import { describe, expect, it } from "vitest";
import { writeDailyDreamingPhaseBlock, writeDeepDreamingReport } from "./dreaming-markdown.js";
import { createMemoryCoreTestHarness } from "./test-helpers.js";
const tempDirs: string[] = [];
async function createTempWorkspace(): Promise<string> {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-dreaming-markdown-"));
tempDirs.push(workspaceDir);
return workspaceDir;
}
afterEach(async () => {
await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
});
const { createTempWorkspace } = createMemoryCoreTestHarness();
describe("dreaming markdown storage", () => {
const nowMs = Date.parse("2026-04-05T10:00:00Z");
const timezone = "UTC";
it("writes inline light dreaming output into the daily memory file", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const result = await writeDailyDreamingPhaseBlock({
workspaceDir,
@@ -42,7 +32,7 @@ describe("dreaming markdown storage", () => {
});
it("keeps multiple inline phases in the shared daily memory file", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
await writeDailyDreamingPhaseBlock({
workspaceDir,
@@ -76,7 +66,7 @@ describe("dreaming markdown storage", () => {
});
it("keeps daily phase output separate from lowercase dreams.md diaries", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const lowercasePath = path.join(workspaceDir, "dreams.md");
await fs.writeFile(lowercasePath, "# Scratch\n\n", "utf-8");
@@ -100,7 +90,7 @@ describe("dreaming markdown storage", () => {
});
it("still writes deep reports to the per-phase report directory", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-markdown-");
const reportPath = await writeDeepDreamingReport({
workspaceDir,

View File

@@ -1,26 +1,16 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import type { OpenClawConfig, OpenClawPluginApi } from "openclaw/plugin-sdk/memory-core";
import { afterEach, describe, expect, it, vi } from "vitest";
import { describe, expect, it, vi } from "vitest";
import { registerMemoryDreamingPhases } from "./dreaming-phases.js";
import {
rankShortTermPromotionCandidates,
recordShortTermRecalls,
resolveShortTermPhaseSignalStorePath,
} from "./short-term-promotion.js";
import { createMemoryCoreTestHarness } from "./test-helpers.js";
const tempDirs: string[] = [];
async function createTempWorkspace(): Promise<string> {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-dreaming-phases-"));
tempDirs.push(workspaceDir);
return workspaceDir;
}
afterEach(async () => {
await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
});
const { createTempWorkspace } = createMemoryCoreTestHarness();
function createHarness(config: OpenClawConfig, workspaceDir?: string) {
let beforeAgentReply:
@@ -67,7 +57,7 @@ function createHarness(config: OpenClawConfig, workspaceDir?: string) {
describe("memory-core dreaming phases", () => {
it("checkpoints daily ingestion and skips unchanged daily files", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
const dailyPath = path.join(workspaceDir, "memory", "2026-04-05.md");
await fs.writeFile(
@@ -124,7 +114,7 @@ describe("memory-core dreaming phases", () => {
});
it("ingests recent daily memory files even before recall traffic exists", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
await fs.writeFile(
path.join(workspaceDir, "memory", "2026-04-05.md"),
@@ -188,7 +178,7 @@ describe("memory-core dreaming phases", () => {
});
it("keeps section context when chunking durable daily notes", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
await fs.writeFile(
path.join(workspaceDir, "memory", "2026-04-05.md"),
@@ -248,7 +238,7 @@ describe("memory-core dreaming phases", () => {
});
it("drops generic day headings but keeps meaningful section labels", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
await fs.writeFile(
path.join(workspaceDir, "memory", "2026-04-05.md"),
@@ -315,7 +305,7 @@ describe("memory-core dreaming phases", () => {
});
it("splits noisy daily notes into a few coherent chunks instead of one line per item", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
await fs.writeFile(
path.join(workspaceDir, "memory", "2026-04-05.md"),
@@ -389,7 +379,7 @@ describe("memory-core dreaming phases", () => {
});
it("records light/rem signals that reinforce deep promotion ranking", async () => {
const workspaceDir = await createTempWorkspace();
const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
const nowMs = Date.parse("2026-04-05T10:00:00.000Z");
await recordShortTermRecalls({
workspaceDir,

View File

@@ -1,25 +1,20 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { readMemoryHostEvents } from "openclaw/plugin-sdk/memory-host-events";
import { afterEach, describe, expect, it } from "vitest";
import { describe, expect, it } from "vitest";
import { writeDailyDreamingPhaseBlock } from "./dreaming-markdown.js";
import {
applyShortTermPromotions,
rankShortTermPromotionCandidates,
recordShortTermRecalls,
} from "./short-term-promotion.js";
import { createMemoryCoreTestHarness } from "./test-helpers.js";
const tempDirs: string[] = [];
afterEach(async () => {
await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
});
const { createTempWorkspace } = createMemoryCoreTestHarness();
describe("memory host event journal integration", () => {
it("records recall and promotion events from short-term promotion flows", async () => {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "memory-core-events-"));
tempDirs.push(workspaceDir);
const workspaceDir = await createTempWorkspace("memory-core-events-");
await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
await fs.writeFile(
path.join(workspaceDir, "memory", "2026-04-05.md"),
@@ -79,8 +74,7 @@ describe("memory host event journal integration", () => {
});
it("records dreaming completion events when phase artifacts are written", async () => {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "memory-core-dream-events-"));
tempDirs.push(workspaceDir);
const workspaceDir = await createTempWorkspace("memory-core-dream-events-");
const written = await writeDailyDreamingPhaseBlock({
workspaceDir,

View File

@@ -0,0 +1,24 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { afterEach } from "vitest";
export function createMemoryCoreTestHarness() {
const tempDirs: string[] = [];
afterEach(async () => {
await Promise.all(
tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })),
);
});
async function createTempWorkspace(prefix: string): Promise<string> {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
tempDirs.push(workspaceDir);
return workspaceDir;
}
return {
createTempWorkspace,
};
}