From a7d37dc4bb21f960f2ab67af3112a74727dcdaee Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 9 May 2026 17:39:50 +0100 Subject: [PATCH] test: tighten compaction safeguard assertions --- .../pi-hooks/compaction-safeguard.test.ts | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/src/agents/pi-hooks/compaction-safeguard.test.ts b/src/agents/pi-hooks/compaction-safeguard.test.ts index fa1e0c65298..13db40fe5f4 100644 --- a/src/agents/pi-hooks/compaction-safeguard.test.ts +++ b/src/agents/pi-hooks/compaction-safeguard.test.ts @@ -1380,14 +1380,12 @@ describe("compaction-safeguard recent-turn preservation", () => { expect(result.cancel).not.toBe(true); const summaryCall = mockSummarizeInStages.mock.calls.at(-1)?.[0]; - expect(summaryCall?.headers).toMatchObject({ - "Copilot-Integration-Id": "vscode-chat", - "Editor-Plugin-Version": "copilot-chat/0.35.0", - "Openai-Organization": "github-copilot", - "User-Agent": "GitHubCopilotChat/0.26.7", - "X-Test": "1", - "x-initiator": "user", - }); + expect(summaryCall?.headers?.["Copilot-Integration-Id"]).toBe("vscode-chat"); + expect(summaryCall?.headers?.["Editor-Plugin-Version"]).toBe("copilot-chat/0.35.0"); + expect(summaryCall?.headers?.["Openai-Organization"]).toBe("github-copilot"); + expect(summaryCall?.headers?.["User-Agent"]).toBe("GitHubCopilotChat/0.26.7"); + expect(summaryCall?.headers?.["X-Test"]).toBe("1"); + expect(summaryCall?.headers?.["x-initiator"]).toBe("user"); }); it("does not retry summaries unless quality guard is explicitly enabled", async () => { @@ -1871,16 +1869,13 @@ describe("compaction-safeguard recent-turn preservation", () => { const compaction = expectCompactionResult(result); expect(getApiKeyAndHeadersMock).not.toHaveBeenCalled(); expect(mockSummarizeInStages).not.toHaveBeenCalled(); - expect(providerSummarize).toHaveBeenCalledWith( - expect.objectContaining({ - previousSummary: "previous provider summary", - customInstructions: expect.stringContaining("Keep milestone names."), - summarizationInstructions: { - identifierPolicy: "custom", - identifierInstructions: "Preserve ticket IDs exactly.", - }, - }), - ); + const providerInput = providerSummarize.mock.calls[0]?.[0]; + expect(providerInput?.previousSummary).toBe("previous provider summary"); + expect(providerInput?.customInstructions).toContain("Keep milestone names."); + expect(providerInput?.summarizationInstructions).toEqual({ + identifierPolicy: "custom", + identifierInstructions: "Preserve ticket IDs exactly.", + }); const providerMessages = providerSummarize.mock.calls[0]?.[0]?.messages ?? []; expect(JSON.stringify(providerMessages)).not.toContain("openclaw.runtime-context"); expect(JSON.stringify(providerMessages)).not.toContain("secret runtime context"); @@ -2197,19 +2192,20 @@ describe("compaction-safeguard double-compaction guard", () => { expect(compaction.summary).not.toContain("No prior history."); expect(mockSummarizeInStages).toHaveBeenCalled(); const summaryCall = mockSummarizeInStages.mock.calls[0]?.[0]; - expect(summaryCall?.messages).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - role: "custom", - customType: "cron-request", - content: "prepare the daily report", - }), - expect.objectContaining({ - role: "toolResult", - toolName: "read", - }), - ]), - ); + const summaryMessages = summaryCall?.messages ?? []; + const cronRequest = summaryMessages.find( + (message) => + message.role === "custom" && + "customType" in message && + message.customType === "cron-request", + ) as { content?: unknown } | undefined; + expect(cronRequest?.content).toBe("prepare the daily report"); + expect( + summaryMessages.some( + (message) => + message.role === "toolResult" && "toolName" in message && message.toolName === "read", + ), + ).toBe(true); }); it("continues when messages include real conversation content", async () => {