From d1cb779f5fc0bdcf52fa932017a5cd5f9a637cb4 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 19 Feb 2026 08:47:14 +0000 Subject: [PATCH] test(agents): dedupe embedded runner and sessions lifecycle fixtures --- ...gents.sessions-spawn.lifecycle.e2e.test.ts | 38 +++---- ...pi-embedded-runner-extraparams.e2e.test.ts | 98 +++++++------------ 2 files changed, 54 insertions(+), 82 deletions(-) diff --git a/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.e2e.test.ts b/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.e2e.test.ts index e65af829cd..b3fbdacf15 100644 --- a/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.e2e.test.ts +++ b/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.e2e.test.ts @@ -148,6 +148,20 @@ function expectSingleCompletionSend( expect(send?.message).toBe(expected.message); } +function createDeleteCleanupHooks(setDeletedKey: (key: string | undefined) => void) { + return { + onAgentSubagentSpawn: (params: unknown) => { + const rec = params as { channel?: string; timeout?: number } | undefined; + expect(rec?.channel).toBe("discord"); + expect(rec?.timeout).toBe(1); + }, + onSessionsDelete: (params: unknown) => { + const rec = params as { key?: string } | undefined; + setDeletedKey(rec?.key); + }, + }; +} + describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { beforeEach(() => { resetSessionsSpawnConfigOverride(); @@ -231,15 +245,9 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { callGatewayMock.mockReset(); let deletedKey: string | undefined; const ctx = setupSessionsSpawnGatewayMock({ - onAgentSubagentSpawn: (params) => { - const rec = params as { channel?: string; timeout?: number } | undefined; - expect(rec?.channel).toBe("discord"); - expect(rec?.timeout).toBe(1); - }, - onSessionsDelete: (params) => { - const rec = params as { key?: string } | undefined; - deletedKey = rec?.key; - }, + ...createDeleteCleanupHooks((key) => { + deletedKey = key; + }), }); const tool = await getSessionsSpawnTool({ @@ -315,15 +323,9 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { let deletedKey: string | undefined; const ctx = setupSessionsSpawnGatewayMock({ includeChatHistory: true, - onAgentSubagentSpawn: (params) => { - const rec = params as { channel?: string; timeout?: number } | undefined; - expect(rec?.channel).toBe("discord"); - expect(rec?.timeout).toBe(1); - }, - onSessionsDelete: (params) => { - const rec = params as { key?: string } | undefined; - deletedKey = rec?.key; - }, + ...createDeleteCleanupHooks((key) => { + deletedKey = key; + }), agentWaitResult: { status: "ok", startedAt: 3000, endedAt: 4000 }, }); diff --git a/src/agents/pi-embedded-runner-extraparams.e2e.test.ts b/src/agents/pi-embedded-runner-extraparams.e2e.test.ts index c1d76f3518..28ef1f0ea8 100644 --- a/src/agents/pi-embedded-runner-extraparams.e2e.test.ts +++ b/src/agents/pi-embedded-runner-extraparams.e2e.test.ts @@ -64,6 +64,30 @@ describe("resolveExtraParams", () => { }); describe("applyExtraParamsToAgent", () => { + function createOptionsCaptureAgent() { + const calls: Array = []; + const baseStreamFn: StreamFn = (_model, _context, options) => { + calls.push(options); + return {} as ReturnType; + }; + return { + calls, + agent: { streamFn: baseStreamFn }, + }; + } + + function buildAnthropicModelConfig(modelKey: string, params: Record) { + return { + agents: { + defaults: { + models: { + [modelKey]: { params }, + }, + }, + }, + }; + } + function runStoreMutationCase(params: { applyProvider: string; applyModelId: string; @@ -86,12 +110,7 @@ describe("applyExtraParamsToAgent", () => { } it("adds OpenRouter attribution headers to stream options", () => { - const calls: Array = []; - const baseStreamFn: StreamFn = (_model, _context, options) => { - calls.push(options); - return {} as ReturnType; - }; - const agent = { streamFn: baseStreamFn }; + const { calls, agent } = createOptionsCaptureAgent(); applyExtraParamsToAgent(agent, undefined, "openrouter", "openrouter/auto"); @@ -113,25 +132,8 @@ describe("applyExtraParamsToAgent", () => { }); it("adds Anthropic 1M beta header when context1m is enabled for Opus/Sonnet", () => { - const calls: Array = []; - const baseStreamFn: StreamFn = (_model, _context, options) => { - calls.push(options); - return {} as ReturnType; - }; - const agent = { streamFn: baseStreamFn }; - const cfg = { - agents: { - defaults: { - models: { - "anthropic/claude-opus-4-6": { - params: { - context1m: true, - }, - }, - }, - }, - }, - }; + const { calls, agent } = createOptionsCaptureAgent(); + const cfg = buildAnthropicModelConfig("anthropic/claude-opus-4-6", { context1m: true }); applyExtraParamsToAgent(agent, cfg, "anthropic", "claude-opus-4-6"); @@ -152,26 +154,11 @@ describe("applyExtraParamsToAgent", () => { }); it("merges existing anthropic-beta headers with configured betas", () => { - const calls: Array = []; - const baseStreamFn: StreamFn = (_model, _context, options) => { - calls.push(options); - return {} as ReturnType; - }; - const agent = { streamFn: baseStreamFn }; - const cfg = { - agents: { - defaults: { - models: { - "anthropic/claude-sonnet-4-5": { - params: { - context1m: true, - anthropicBeta: ["files-api-2025-04-14"], - }, - }, - }, - }, - }, - }; + const { calls, agent } = createOptionsCaptureAgent(); + const cfg = buildAnthropicModelConfig("anthropic/claude-sonnet-4-5", { + context1m: true, + anthropicBeta: ["files-api-2025-04-14"], + }); applyExtraParamsToAgent(agent, cfg, "anthropic", "claude-sonnet-4-5"); @@ -193,25 +180,8 @@ describe("applyExtraParamsToAgent", () => { }); it("ignores context1m for non-Opus/Sonnet Anthropic models", () => { - const calls: Array = []; - const baseStreamFn: StreamFn = (_model, _context, options) => { - calls.push(options); - return {} as ReturnType; - }; - const agent = { streamFn: baseStreamFn }; - const cfg = { - agents: { - defaults: { - models: { - "anthropic/claude-haiku-3-5": { - params: { - context1m: true, - }, - }, - }, - }, - }, - }; + const { calls, agent } = createOptionsCaptureAgent(); + const cfg = buildAnthropicModelConfig("anthropic/claude-haiku-3-5", { context1m: true }); applyExtraParamsToAgent(agent, cfg, "anthropic", "claude-haiku-3-5");