test(extensions): use scoped config runtime imports

This commit is contained in:
Peter Steinberger
2026-04-27 22:24:00 +01:00
parent 2216ce3018
commit d24b78e96d
3 changed files with 35 additions and 33 deletions

View File

@@ -85,6 +85,17 @@ const IGNORED_MEMORY_WATCH_DIR_NAMES = new Set([
]);
const log = createSubsystemLogger("memory");
const TEST_MEMORY_WATCH_FACTORY_KEY = Symbol.for("openclaw.test.memoryWatchFactory");
function resolveMemoryWatchFactory(): typeof chokidar.watch {
if (process.env.VITEST === "true" || process.env.NODE_ENV === "test") {
const override = (globalThis as Record<PropertyKey, unknown>)[TEST_MEMORY_WATCH_FACTORY_KEY];
if (typeof override === "function") {
return override as typeof chokidar.watch;
}
}
return chokidar.watch.bind(chokidar);
}
function shouldIgnoreMemoryWatchPath(
watchPath: string,
@@ -396,7 +407,7 @@ export abstract class MemoryManagerSyncOps {
// Skip missing/unreadable additional paths.
}
}
this.watcher = chokidar.watch(Array.from(watchPaths), {
this.watcher = resolveMemoryWatchFactory()(Array.from(watchPaths), {
ignoreInitial: true,
ignored: (watchPath, stats) =>
shouldIgnoreMemoryWatchPath(watchPath, stats, this.settings.multimodal),

View File

@@ -5,9 +5,7 @@ import type {
MemorySearchConfig,
OpenClawConfig,
} from "openclaw/plugin-sdk/memory-core-host-engine-foundation";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import type { MemoryIndexManager } from "./index.js";
import { registerBuiltInMemoryEmbeddingProviders } from "./provider-adapters.js";
import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest";
type WatchIgnoredFn = (watchPath: string, stats?: { isDirectory?: () => boolean }) => boolean;
@@ -31,7 +29,7 @@ const { createdWatchers, watchMock } = vi.hoisted(() => {
return watcher;
}
const watchers: Array<ReturnType<typeof createMockWatcher>> = [];
return {
const result = {
createdWatchers: watchers,
watchMock: vi.fn(() => {
const watcher = createMockWatcher();
@@ -39,6 +37,9 @@ const { createdWatchers, watchMock } = vi.hoisted(() => {
return watcher;
}),
};
(globalThis as Record<PropertyKey, unknown>)[Symbol.for("openclaw.test.memoryWatchFactory")] =
result.watchMock;
return result;
});
vi.mock("chokidar", () => ({
@@ -62,35 +63,32 @@ vi.mock("./embeddings.js", () => ({
}),
}));
type MemoryIndexModule = typeof import("./index.js");
type MemoryEmbeddingProvidersModule =
typeof import("openclaw/plugin-sdk/memory-core-host-engine-embeddings");
let getMemorySearchManager: MemoryIndexModule["getMemorySearchManager"];
let closeAllMemorySearchManagers: MemoryIndexModule["closeAllMemorySearchManagers"];
let clearRegistry: MemoryEmbeddingProvidersModule["clearMemoryEmbeddingProviders"];
let registerAdapter: MemoryEmbeddingProvidersModule["registerMemoryEmbeddingProvider"];
import {
clearMemoryEmbeddingProviders as clearRegistry,
registerMemoryEmbeddingProvider as registerAdapter,
} from "openclaw/plugin-sdk/memory-core-host-engine-embeddings";
import {
closeAllMemorySearchManagers,
getMemorySearchManager,
type MemoryIndexManager,
} from "./index.js";
import { registerBuiltInMemoryEmbeddingProviders } from "./provider-adapters.js";
describe("memory watcher config", () => {
let manager: MemoryIndexManager | null = null;
let workspaceDir = "";
let extraDir = "";
beforeAll(async () => {
vi.resetModules();
({ getMemorySearchManager, closeAllMemorySearchManagers } = await import("./index.js"));
({
clearMemoryEmbeddingProviders: clearRegistry,
registerMemoryEmbeddingProvider: registerAdapter,
} = await import("openclaw/plugin-sdk/memory-core-host-engine-embeddings"));
});
beforeEach(async () => {
vi.clearAllMocks();
clearRegistry();
registerBuiltInMemoryEmbeddingProviders({ registerMemoryEmbeddingProvider: registerAdapter });
});
afterAll(() => {
Reflect.deleteProperty(globalThis, Symbol.for("openclaw.test.memoryWatchFactory"));
});
afterEach(async () => {
vi.useRealTimers();
watchMock.mockClear();
@@ -108,10 +106,6 @@ describe("memory watcher config", () => {
}
});
afterAll(() => {
vi.resetModules();
});
async function setupWatcherWorkspace(seedFile: { name: string; contents: string }) {
workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-memory-watch-"));
extraDir = path.join(workspaceDir, "extra");
@@ -134,6 +128,7 @@ describe("memory watcher config", () => {
},
};
return {
memory: { backend: "builtin" },
agents: {
defaults,
list: [{ id: "main", default: true }],
@@ -147,6 +142,8 @@ describe("memory watcher config", () => {
if (!result.manager) {
throw new Error("manager missing");
}
expect(result.manager.status().backend).toBe("builtin");
expect(result.manager.status().sources).toContain("memory");
manager = result.manager as unknown as MemoryIndexManager;
}