From 8aa286476db2ae79b85155fc695f93b231e70274 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 11 May 2026 15:58:39 +0100 Subject: [PATCH] test: tighten command assertions --- src/acp/translator.lifecycle.test.ts | 7 +++++- .../channel-setup/plugin-install.test.ts | 6 +---- src/commands/doctor-config-flow.test.ts | 8 +++---- src/commands/gateway-status.test.ts | 22 ++++++++++--------- src/commands/status-json-payload.test.ts | 11 +++++----- .../status.command-report-data.test.ts | 12 ++++------ 6 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/acp/translator.lifecycle.test.ts b/src/acp/translator.lifecycle.test.ts index ea2d1ec0fdf..6c693fee702 100644 --- a/src/acp/translator.lifecycle.test.ts +++ b/src/acp/translator.lifecycle.test.ts @@ -336,10 +336,15 @@ describe("acp translator stable lifecycle handlers", () => { const result = await agent.resumeSession(createResumeSessionRequest("agent:main:work")); expect(result.modes?.currentModeId).toBe("adaptive"); + expect(result.configOptions).toBeDefined(); + if (!result.configOptions) { + throw new Error("expected resume session config options"); + } const thoughtLevelOption = result.configOptions.find((option) => option.id === "thought_level"); expect(thoughtLevelOption?.currentValue).toBe("adaptive"); expect(sessionStore.getSession("agent:main:work")?.sessionKey).toBe("agent:main:work"); - expect(request.mock.calls.map((call) => call[0])).not.toContain("sessions.get"); + const requestCalls = (request as unknown as { mock: { calls: Array<[string]> } }).mock.calls; + expect(requestCalls.map((call) => call[0])).not.toContain("sessions.get"); expect(sessionUpdate).toHaveBeenCalledWith({ sessionId: "agent:main:work", update: { diff --git a/src/commands/channel-setup/plugin-install.test.ts b/src/commands/channel-setup/plugin-install.test.ts index 2a2423ffb10..6b1a3e8e194 100644 --- a/src/commands/channel-setup/plugin-install.test.ts +++ b/src/commands/channel-setup/plugin-install.test.ts @@ -207,11 +207,7 @@ function expectSetupSnapshotDoesNotScopeToPlugin(params: { workspaceDir: "/tmp/openclaw-workspace", }); - expect(loadOpenClawPlugins).toHaveBeenCalledWith( - expect.not.objectContaining({ - onlyPluginIds: [params.pluginId], - }), - ); + expect(loadOpenClawPlugins).toHaveBeenCalledTimes(1); const firstLoadCall = vi.mocked(loadOpenClawPlugins).mock.calls[0]?.[0] as | { onlyPluginIds?: string[] } | undefined; diff --git a/src/commands/doctor-config-flow.test.ts b/src/commands/doctor-config-flow.test.ts index 12d84e319b1..4b2a108ae21 100644 --- a/src/commands/doctor-config-flow.test.ts +++ b/src/commands/doctor-config-flow.test.ts @@ -1455,11 +1455,9 @@ describe("doctor config flow", () => { }); expect(noteImplicitFallbackClobberWarningsMock).toHaveBeenCalledTimes(1); - expect(noteImplicitFallbackClobberWarningsMock).toHaveBeenCalledWith( - expect.objectContaining({ - agents: config.agents, - }), - ); + const [[warningParams]] = noteImplicitFallbackClobberWarningsMock.mock + .calls as unknown as Array<[{ agents?: unknown }]>; + expect(warningParams.agents).toStrictEqual(config.agents); const doctorWarnings = terminalNoteMock.mock.calls .filter(([, title]) => title === "Doctor warnings") .map(([message]) => message); diff --git a/src/commands/gateway-status.test.ts b/src/commands/gateway-status.test.ts index 19c6355a216..68186477400 100644 --- a/src/commands/gateway-status.test.ts +++ b/src/commands/gateway-status.test.ts @@ -398,18 +398,20 @@ describe("gateway-status command", () => { expect(runtimeErrors).toHaveLength(0); const parsed = JSON.parse(runtimeLogs.join("\n")) as { degraded?: boolean; - warnings?: Array<{ code?: string; message?: string }>; + warnings?: Array<{ code?: string; message?: string; targetIds?: string[] }>; }; expect(parsed.degraded).toBe(true); - expect(parsed.warnings).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - code: "model_pricing_degraded", - message: - "Model pricing degraded: OpenRouter pricing fetch failed: TypeError: fetch failed", - }), - ]), - ); + const pricingWarnings = + parsed.warnings?.filter((warning) => warning.code === "model_pricing_degraded") ?? []; + expect(pricingWarnings).toHaveLength(2); + expect(pricingWarnings.map((warning) => warning.message)).toEqual([ + "Model pricing degraded: OpenRouter pricing fetch failed: TypeError: fetch failed", + "Model pricing degraded: OpenRouter pricing fetch failed: TypeError: fetch failed", + ]); + expect(pricingWarnings.map((warning) => warning.targetIds)).toEqual([ + ["sshTunnel"], + ["configRemote"], + ]); }); it("includes diagnostic next steps when no gateway is reachable or discoverable", async () => { diff --git a/src/commands/status-json-payload.test.ts b/src/commands/status-json-payload.test.ts index c773f6d831c..2c598c5e826 100644 --- a/src/commands/status-json-payload.test.ts +++ b/src/commands/status-json-payload.test.ts @@ -209,11 +209,10 @@ describe("status-json-payload", () => { secretDiagnostics: [], }); - expect(payload.gateway).toMatchObject({ - modelPricing: { - state: "degraded", - detail: "OpenRouter pricing fetch failed: TypeError: fetch failed", - }, - }); + const modelPricing = payload.gateway.modelPricing as + | { state?: string; detail?: string } + | undefined; + expect(modelPricing?.state).toBe("degraded"); + expect(modelPricing?.detail).toBe("OpenRouter pricing fetch failed: TypeError: fetch failed"); }); }); diff --git a/src/commands/status.command-report-data.test.ts b/src/commands/status.command-report-data.test.ts index ee3e0aaec3c..ed52487bdc7 100644 --- a/src/commands/status.command-report-data.test.ts +++ b/src/commands/status.command-report-data.test.ts @@ -85,13 +85,9 @@ describe("buildStatusCommandReportData", () => { }), ); - expect(result.overviewRows).toEqual( - expect.arrayContaining([ - { - Item: "Model pricing", - Value: "warn(degraded · OpenRouter pricing fetch failed: TypeError: fetch failed)", - }, - ]), - ); + expect(result.overviewRows).toContainEqual({ + Item: "Model pricing", + Value: "warn(degraded · OpenRouter pricing fetch failed: TypeError: fetch failed)", + }); }); });