






















@@ -34,6 +34,45 @@ function createQmdManagerMock() {
3434};
3535}
363637+async function startMemoryBackendForTest(cfg: OpenClawConfig) {
38+const log = createGatewayLogMock();
39+await startGatewayMemoryBackend({ cfg, log });
40+return log;
41+}
42+43+async function startQmdBackendWithManager(cfg: OpenClawConfig) {
44+getMemorySearchManagerMock.mockResolvedValue({ manager: createQmdManagerMock() });
45+return await startMemoryBackendForTest(cfg);
46+}
47+48+function expectNoMemoryBackendStartup(log: ReturnType<typeof createGatewayLogMock>) {
49+expect(getMemorySearchManagerMock).not.toHaveBeenCalled();
50+expect(log.info).not.toHaveBeenCalled();
51+expect(log.warn).not.toHaveBeenCalled();
52+}
53+54+function expectQmdManagerRequests(cfg: OpenClawConfig, agentIds: string[]) {
55+expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(agentIds.length);
56+for (const [index, agentId] of agentIds.entries()) {
57+expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(index + 1, {
58+ cfg,
59+ agentId,
60+purpose: "cli",
61+});
62+}
63+}
64+65+function expectBootSyncCompleted(
66+log: ReturnType<typeof createGatewayLogMock>,
67+count: number,
68+agents: string,
69+) {
70+const noun = count === 1 ? "agent" : "agents";
71+expect(log.info).toHaveBeenCalledWith(
72+`qmd memory startup boot sync completed for ${count} ${noun}: ${agents}`,
73+);
74+}
75+3776describe("startGatewayMemoryBackend", () => {
3877beforeEach(() => {
3978getMemorySearchManagerMock.mockClear();
@@ -44,27 +83,21 @@ describe("startGatewayMemoryBackend", () => {
4483agents: { list: [{ id: "main", default: true }] },
4584memory: { backend: "builtin" },
4685} as OpenClawConfig;
47-const log = { info: vi.fn(), warn: vi.fn() };
488649-await startGatewayMemoryBackend({ cfg, log });
87+const log = await startMemoryBackendForTest(cfg);
508851-expect(getMemorySearchManagerMock).not.toHaveBeenCalled();
52-expect(log.info).not.toHaveBeenCalled();
53-expect(log.warn).not.toHaveBeenCalled();
89+expectNoMemoryBackendStartup(log);
5490});
55915692it("keeps qmd managers lazy when startup refresh is not opted in", async () => {
5793const cfg = {
5894agents: { list: [{ id: "main", default: true }] },
5995memory: { backend: "qmd", qmd: {} },
6096} as OpenClawConfig;
61-const log = createGatewayLogMock();
629763-await startGatewayMemoryBackend({ cfg, log });
98+const log = await startMemoryBackendForTest(cfg);
649965-expect(getMemorySearchManagerMock).not.toHaveBeenCalled();
66-expect(log.info).not.toHaveBeenCalled();
67-expect(log.warn).not.toHaveBeenCalled();
100+expectNoMemoryBackendStartup(log);
68101});
6910270103it("runs qmd boot sync for the default and explicitly configured agents", async () => {
@@ -75,25 +108,11 @@ describe("startGatewayMemoryBackend", () => {
75108{ id: "lazy" },
76109],
77110});
78-const log = createGatewayLogMock();
79-getMemorySearchManagerMock.mockResolvedValue({ manager: createQmdManagerMock() });
8011181-await startGatewayMemoryBackend({ cfg, log });
112+const log = await startQmdBackendWithManager(cfg);
8211383-expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(2);
84-expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(1, {
85- cfg,
86-agentId: "ops",
87-purpose: "cli",
88-});
89-expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(2, {
90- cfg,
91-agentId: "main",
92-purpose: "cli",
93-});
94-expect(log.info).toHaveBeenCalledWith(
95-'qmd memory startup boot sync completed for 2 agents: "ops", "main"',
96-);
114+expectQmdManagerRequests(cfg, ["ops", "main"]);
115+expectBootSyncCompleted(log, 2, '"ops", "main"');
97116expect(log.info).toHaveBeenCalledWith(
98117'qmd memory startup initialization deferred for 1 agent: "lazy"',
99118);
@@ -105,25 +124,11 @@ describe("startGatewayMemoryBackend", () => {
105124defaults: { memorySearch: { enabled: true } },
106125list: [{ id: "ops", default: true }, { id: "main" }],
107126});
108-const log = createGatewayLogMock();
109-getMemorySearchManagerMock.mockResolvedValue({ manager: createQmdManagerMock() });
110127111-await startGatewayMemoryBackend({ cfg, log });
128+const log = await startQmdBackendWithManager(cfg);
112129113-expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(2);
114-expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(1, {
115- cfg,
116-agentId: "ops",
117-purpose: "cli",
118-});
119-expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(2, {
120- cfg,
121-agentId: "main",
122-purpose: "cli",
123-});
124-expect(log.info).toHaveBeenCalledWith(
125-'qmd memory startup boot sync completed for 2 agents: "ops", "main"',
126-);
130+expectQmdManagerRequests(cfg, ["ops", "main"]);
131+expectBootSyncCompleted(log, 2, '"ops", "main"');
127132expect(log.info.mock.calls.some(([message]) => String(message).includes("deferred"))).toBe(
128133false,
129134);
@@ -146,9 +151,7 @@ describe("startGatewayMemoryBackend", () => {
146151expect(log.warn).toHaveBeenCalledWith(
147152'qmd memory startup initialization failed for agent "main": qmd missing',
148153);
149-expect(log.info).toHaveBeenCalledWith(
150-'qmd memory startup boot sync completed for 1 agent: "ops"',
151-);
154+expectBootSyncCompleted(log, 1, '"ops"');
152155});
153156154157it("skips agents with memory search disabled", async () => {
@@ -159,20 +162,11 @@ describe("startGatewayMemoryBackend", () => {
159162{ id: "ops", memorySearch: { enabled: false } },
160163],
161164});
162-const log = createGatewayLogMock();
163-getMemorySearchManagerMock.mockResolvedValue({ manager: createQmdManagerMock() });
164165165-await startGatewayMemoryBackend({ cfg, log });
166+const log = await startQmdBackendWithManager(cfg);
166167167-expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(1);
168-expect(getMemorySearchManagerMock).toHaveBeenCalledWith({
169- cfg,
170-agentId: "main",
171-purpose: "cli",
172-});
173-expect(log.info).toHaveBeenCalledWith(
174-'qmd memory startup boot sync completed for 1 agent: "main"',
175-);
168+expectQmdManagerRequests(cfg, ["main"]);
169+expectBootSyncCompleted(log, 1, '"main"');
176170expect(log.warn).not.toHaveBeenCalled();
177171});
178172@@ -186,12 +180,9 @@ describe("startGatewayMemoryBackend", () => {
186180},
187181},
188182} as OpenClawConfig;
189-const log = createGatewayLogMock();
190183191-await startGatewayMemoryBackend({ cfg, log });
184+const log = await startMemoryBackendForTest(cfg);
192185193-expect(getMemorySearchManagerMock).not.toHaveBeenCalled();
194-expect(log.info).not.toHaveBeenCalled();
195-expect(log.warn).not.toHaveBeenCalled();
186+expectNoMemoryBackendStartup(log);
196187});
197188});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。