惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
B
Blog
Stack Overflow Blog
Stack Overflow Blog
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
D
DataBreaches.Net
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
罗磊的独立博客
L
LangChain Blog
V
Visual Studio Blog
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
test: tighten dreaming controller assertions · openclaw/o...
steipete · 2026-05-11 · via Recent Commits to openclaw:main

@@ -56,6 +56,30 @@ function getConfigPatchRawPayload(request: ReturnType<typeof vi.fn>): Record<str

5656

return JSON.parse(String(requestPayload.raw)) as Record<string, unknown>;

5757

}

585859+

function getRequestPayload(

60+

request: ReturnType<typeof vi.fn>,

61+

method: string,

62+

): Record<string, unknown> {

63+

const call = request.mock.calls.find((entry) => entry[0] === method);

64+

if (!call) {

65+

throw new Error(`Expected ${method} request`);

66+

}

67+

const payload = call[1];

68+

if (

69+

payload === undefined ||

70+

payload === null ||

71+

typeof payload !== "object" ||

72+

Array.isArray(payload)

73+

) {

74+

throw new Error(`Expected ${method} payload object`);

75+

}

76+

return payload as Record<string, unknown>;

77+

}

78+79+

function hasRequestMethodCall(request: ReturnType<typeof vi.fn>, method: string): boolean {

80+

return request.mock.calls.some((entry) => entry[0] === method);

81+

}

82+5983

describe("dreaming controller", () => {

6084

it("loads and normalizes dreaming status from doctor.memory.status", async () => {

6185

const { state, request } = createState();

@@ -163,35 +187,26 @@ describe("dreaming controller", () => {

163187

await loadDreamingStatus(state);

164188165189

expect(request).toHaveBeenCalledWith("doctor.memory.status", {});

166-

expect(state.dreamingStatus).toEqual(

167-

expect.objectContaining({

168-

enabled: true,

169-

shortTermCount: 8,

170-

groundedSignalCount: 5,

171-

totalSignalCount: 20,

172-

phaseSignalCount: 11,

173-

promotedToday: 2,

174-

shortTermEntries: [

175-

expect.objectContaining({

176-

snippet: "Emma prefers shorter, lower-pressure check-ins.",

177-

totalSignalCount: 3,

178-

groundedCount: 1,

179-

phaseHitCount: 3,

180-

}),

181-

],

182-

promotedEntries: [

183-

expect.objectContaining({

184-

snippet: "Use the Happy Together calendar for flights.",

185-

}),

186-

],

187-

phases: expect.objectContaining({

188-

deep: expect.objectContaining({

189-

minScore: 0.8,

190-

nextRunAtMs: 23456,

191-

}),

192-

}),

193-

}),

190+

const status = state.dreamingStatus;

191+

expect(status?.enabled).toBe(true);

192+

expect(status?.shortTermCount).toBe(8);

193+

expect(status?.groundedSignalCount).toBe(5);

194+

expect(status?.totalSignalCount).toBe(20);

195+

expect(status?.phaseSignalCount).toBe(11);

196+

expect(status?.promotedToday).toBe(2);

197+

expect(status?.shortTermEntries).toHaveLength(1);

198+

expect(status?.shortTermEntries[0]?.snippet).toBe(

199+

"Emma prefers shorter, lower-pressure check-ins.",

200+

);

201+

expect(status?.shortTermEntries[0]?.totalSignalCount).toBe(3);

202+

expect(status?.shortTermEntries[0]?.groundedCount).toBe(1);

203+

expect(status?.shortTermEntries[0]?.phaseHitCount).toBe(3);

204+

expect(status?.promotedEntries).toHaveLength(1);

205+

expect(status?.promotedEntries[0]?.snippet).toBe(

206+

"Use the Happy Together calendar for flights.",

194207

);

208+

expect(status?.phases?.deep?.minScore).toBe(0.8);

209+

expect(status?.phases?.deep?.nextRunAtMs).toBe(23456);

195210

expect(state.dreamingStatusLoading).toBe(false);

196211

expect(state.dreamingStatusError).toBeNull();

197212

});

@@ -219,11 +234,7 @@ describe("dreaming controller", () => {

219234220235

await loadDreamingStatus(state);

221236222-

expect(state.dreamingStatus).toEqual(

223-

expect.objectContaining({

224-

enabled: true,

225-

}),

226-

);

237+

expect(state.dreamingStatus?.enabled).toBe(true);

227238

expect(state.dreamingStatus?.phases).toBeUndefined();

228239

expect(state.dreamingStatusError).toBeNull();

229240

});

@@ -289,19 +300,12 @@ describe("dreaming controller", () => {

289300

await loadWikiImportInsights(state);

290301291302

expect(request).toHaveBeenCalledWith("wiki.importInsights", {});

292-

expect(state.wikiImportInsights).toEqual(

293-

expect.objectContaining({

294-

totalItems: 2,

295-

totalClusters: 1,

296-

clusters: [

297-

expect.objectContaining({

298-

key: "topic/travel",

299-

itemCount: 2,

300-

withheldCount: 1,

301-

}),

302-

],

303-

}),

304-

);

303+

expect(state.wikiImportInsights?.totalItems).toBe(2);

304+

expect(state.wikiImportInsights?.totalClusters).toBe(1);

305+

expect(state.wikiImportInsights?.clusters).toHaveLength(1);

306+

expect(state.wikiImportInsights?.clusters[0]?.key).toBe("topic/travel");

307+

expect(state.wikiImportInsights?.clusters[0]?.itemCount).toBe(2);

308+

expect(state.wikiImportInsights?.clusters[0]?.withheldCount).toBe(1);

305309

expect(state.wikiImportInsightsError).toBeNull();

306310

expect(state.wikiImportInsightsLoading).toBe(false);

307311

});

@@ -330,12 +334,8 @@ describe("dreaming controller", () => {

330334

await loadWikiImportInsights(state);

331335332336

expect(request).toHaveBeenCalledWith("wiki.importInsights", {});

333-

expect(state.wikiImportInsights).toEqual(

334-

expect.objectContaining({

335-

totalItems: 1,

336-

totalClusters: 1,

337-

}),

338-

);

337+

expect(state.wikiImportInsights?.totalItems).toBe(1);

338+

expect(state.wikiImportInsights?.totalClusters).toBe(1);

339339

expect(state.wikiImportInsightsError).toBeNull();

340340

expect(state.wikiImportInsightsLoading).toBe(false);

341341

});

@@ -454,24 +454,16 @@ describe("dreaming controller", () => {

454454

await loadWikiMemoryPalace(state);

455455456456

expect(request).toHaveBeenCalledWith("wiki.palace", {});

457-

expect(state.wikiMemoryPalace).toEqual(

458-

expect.objectContaining({

459-

totalItems: 2,

460-

totalClaims: 3,

461-

clusters: [

462-

expect.objectContaining({

463-

key: "synthesis",

464-

label: "Syntheses",

465-

items: [

466-

expect.objectContaining({

467-

title: "Travel system",

468-

claims: ["prefers direct receipts"],

469-

}),

470-

],

471-

}),

472-

],

473-

}),

474-

);

457+

expect(state.wikiMemoryPalace?.totalItems).toBe(2);

458+

expect(state.wikiMemoryPalace?.totalClaims).toBe(3);

459+

expect(state.wikiMemoryPalace?.clusters).toHaveLength(1);

460+

expect(state.wikiMemoryPalace?.clusters[0]?.key).toBe("synthesis");

461+

expect(state.wikiMemoryPalace?.clusters[0]?.label).toBe("Syntheses");

462+

expect(state.wikiMemoryPalace?.clusters[0]?.items).toHaveLength(1);

463+

expect(state.wikiMemoryPalace?.clusters[0]?.items[0]?.title).toBe("Travel system");

464+

expect(state.wikiMemoryPalace?.clusters[0]?.items[0]?.claims).toEqual([

465+

"prefers direct receipts",

466+

]);

475467

expect(state.wikiMemoryPalaceError).toBeNull();

476468

expect(state.wikiMemoryPalaceLoading).toBe(false);

477469

});

@@ -501,12 +493,8 @@ describe("dreaming controller", () => {

501493

await loadWikiMemoryPalace(state);

502494503495

expect(request).toHaveBeenCalledWith("wiki.palace", {});

504-

expect(state.wikiMemoryPalace).toEqual(

505-

expect.objectContaining({

506-

totalItems: 1,

507-

totalClaims: 2,

508-

}),

509-

);

496+

expect(state.wikiMemoryPalace?.totalItems).toBe(1);

497+

expect(state.wikiMemoryPalace?.totalClaims).toBe(2);

510498

expect(state.wikiMemoryPalaceError).toBeNull();

511499

expect(state.wikiMemoryPalaceLoading).toBe(false);

512500

});

@@ -599,13 +587,9 @@ describe("dreaming controller", () => {

599587

const ok = await updateDreamingEnabled(state, false);

600588601589

expect(ok).toBe(true);

602-

expect(request).toHaveBeenCalledWith(

603-

"config.patch",

604-

expect.objectContaining({

605-

baseHash: "hash-1",

606-

sessionKey: "main",

607-

}),

608-

);

590+

const patchPayload = getRequestPayload(request, "config.patch");

591+

expect(patchPayload.baseHash).toBe("hash-1");

592+

expect(patchPayload.sessionKey).toBe("main");

609593

expect(getConfigPatchRawPayload(request)).toEqual({

610594

plugins: {

611595

entries: {

@@ -692,7 +676,7 @@ describe("dreaming controller", () => {

692676

expect(request).toHaveBeenCalledWith("config.schema.lookup", {

693677

path: "plugins.entries.memory-lancedb.config",

694678

});

695-

expect(request).not.toHaveBeenCalledWith("config.patch", expect.anything());

679+

expect(hasRequestMethodCall(request, "config.patch")).toBe(false);

696680

expect(state.dreamingStatusError).toContain("memory-lancedb");

697681

expect(state.dreamingStatusError).toContain("does not support dreaming settings");

698682

});