mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-17 20:21:13 +00:00
test(memory-core): share workspace test helper
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
24
extensions/memory-core/src/test-helpers.ts
Normal file
24
extensions/memory-core/src/test-helpers.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user