import { beforeEach, describe, expect, it, vi } from "vitest" ;
import type { OpenClawConfig } from "../config/config.js" ;
const { getMemorySearchManagerMock } = vi.hoisted(() => ({
getMemorySearchManagerMock: vi.fn(),
}));
const { resolveActiveMemoryBackendConfigMock } = vi.hoisted(() => ({
resolveActiveMemoryBackendConfigMock: vi.fn(),
}));
vi.mock("../plugins/memory-runtime.js" , () => ({
getActiveMemorySearchManager: getMemorySearchManagerMock,
resolveActiveMemoryBackendConfig: resolveActiveMemoryBackendConfigMock,
}));
import { startGatewayMemoryBackend } from "./server-startup-memory.js" ;
function createQmdConfig(agents: OpenClawConfig["agents" ]): OpenClawConfig {
return {
agents,
memory: { backend: "qmd" , qmd: {} },
} as OpenClawConfig;
}
function createGatewayLogMock() {
return { info: vi.fn(), warn: vi.fn() };
}
describe("startGatewayMemoryBackend" , () => {
beforeEach(() => {
getMemorySearchManagerMock.mockClear();
resolveActiveMemoryBackendConfigMock.mockReset();
resolveActiveMemoryBackendConfigMock.mockImplementation(({ cfg }: { cfg: OpenClawConfig }) => ({
backend: cfg.memory?.backend === "qmd" ? "qmd" : "builtin" ,
qmd: cfg.memory?.backend === "qmd" ? {} : undefined,
}));
});
it("skips initialization when memory backend is not qmd" , async () => {
const cfg = {
agents: { list: [{ id: "main" , default : true }] },
memory: { backend: "builtin" },
} as OpenClawConfig;
const log = { info: vi.fn(), warn: vi.fn() };
await startGatewayMemoryBackend({ cfg, log });
expect(getMemorySearchManagerMock).not.toHaveBeenCalled();
expect(log.info).not.toHaveBeenCalled();
expect(log.warn).not.toHaveBeenCalled();
});
it("initializes qmd backend for each configured agent" , async () => {
const cfg = createQmdConfig({ list: [{ id: "ops" , default : true }, { id: "main" }] });
const log = createGatewayLogMock();
getMemorySearchManagerMock.mockResolvedValue({ manager: { search: vi.fn() } });
await startGatewayMemoryBackend({ cfg, log });
expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(2 );
expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(1 , { cfg, agentId: "ops" });
expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(2 , { cfg, agentId: "main" });
expect(log.info).toHaveBeenCalledTimes(1 );
expect(log.info).toHaveBeenCalledWith(
'qmd memory startup initialization armed for 2 agents: "ops", "main"' ,
);
expect(log.warn).not.toHaveBeenCalled();
});
it("logs a warning when qmd manager init fails and continues with other agents" , async () => {
const cfg = createQmdConfig({ list: [{ id: "main" , default : true }, { id: "ops" }] });
const log = createGatewayLogMock();
getMemorySearchManagerMock
.mockResolvedValueOnce({ manager: null , error: "qmd missing" })
.mockResolvedValueOnce({ manager: { search: vi.fn() } });
await startGatewayMemoryBackend({ cfg, log });
expect(log.warn).toHaveBeenCalledWith(
'qmd memory startup initialization failed for agent "main": qmd missing' ,
);
expect(log.info).toHaveBeenCalledWith(
'qmd memory startup initialization armed for 1 agent: "ops"' ,
);
});
it("skips agents with memory search disabled" , async () => {
const cfg = createQmdConfig({
defaults: { memorySearch: { enabled: true } },
list: [
{ id: "main" , default : true },
{ id: "ops" , memorySearch: { enabled: false } },
],
});
const log = createGatewayLogMock();
getMemorySearchManagerMock.mockResolvedValue({ manager: { search: vi.fn() } });
await startGatewayMemoryBackend({ cfg, log });
expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(1 );
expect(getMemorySearchManagerMock).toHaveBeenCalledWith({ cfg, agentId: "main" });
expect(log.info).toHaveBeenCalledWith(
'qmd memory startup initialization armed for 1 agent: "main"' ,
);
expect(log.warn).not.toHaveBeenCalled();
});
});
Messung V0.5 in Prozent C=97 H=98 G=97
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland