From 295bcde7b82cf31e4dc1d14c110a288b4c60575a Mon Sep 17 00:00:00 2001 From: Shakker Date: Sun, 26 Apr 2026 08:32:44 +0100 Subject: [PATCH] test: update channel metadata mocks --- src/commands/agents.commands.list.test.ts | 43 +++++++++++++++++++++-- src/commands/doctor-security.test.ts | 18 ++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/commands/agents.commands.list.test.ts b/src/commands/agents.commands.list.test.ts index 5ca1b330c06..49e82047432 100644 --- a/src/commands/agents.commands.list.test.ts +++ b/src/commands/agents.commands.list.test.ts @@ -2,9 +2,29 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { OutputRuntimeEnv } from "../runtime.js"; -const { buildProviderStatusIndexMock, requireValidConfigMock } = vi.hoisted(() => ({ +const { + buildProviderStatusIndexMock, + buildProviderSummaryMetadataIndexMock, + listProvidersForAgentMock, + providerSummaryMetadataMock, + requireValidConfigMock, + summarizeBindingsMock, +} = vi.hoisted(() => ({ buildProviderStatusIndexMock: vi.fn(), + buildProviderSummaryMetadataIndexMock: vi.fn(), + listProvidersForAgentMock: vi.fn(), + providerSummaryMetadataMock: new Map([ + [ + "telegram", + { + label: "Telegram", + defaultAccountId: "default", + visibleInConfiguredLists: true, + }, + ], + ]), requireValidConfigMock: vi.fn(), + summarizeBindingsMock: vi.fn(), })); vi.mock("./agents.command-shared.js", () => ({ @@ -13,8 +33,9 @@ vi.mock("./agents.command-shared.js", () => ({ vi.mock("./agents.providers.js", () => ({ buildProviderStatusIndex: buildProviderStatusIndexMock, - listProvidersForAgent: () => ["Telegram default: configured"], - summarizeBindings: () => ["Telegram default"], + buildProviderSummaryMetadataIndex: buildProviderSummaryMetadataIndexMock, + listProvidersForAgent: listProvidersForAgentMock, + summarizeBindings: summarizeBindingsMock, })); const { agentsListCommand } = await import("./agents.commands.list.js"); @@ -47,6 +68,9 @@ describe("agentsListCommand", () => { vi.clearAllMocks(); requireValidConfigMock.mockResolvedValue(createConfig()); buildProviderStatusIndexMock.mockResolvedValue(new Map()); + buildProviderSummaryMetadataIndexMock.mockReturnValue(providerSummaryMetadataMock); + listProvidersForAgentMock.mockReturnValue(["Telegram default: configured"]); + summarizeBindingsMock.mockReturnValue(["Telegram default"]); }); it("keeps plain JSON output on the config-only path", async () => { @@ -67,6 +91,19 @@ describe("agentsListCommand", () => { await agentsListCommand({ json: true, bindings: true }, runtime); expect(buildProviderStatusIndexMock).toHaveBeenCalledOnce(); + expect(buildProviderSummaryMetadataIndexMock).toHaveBeenCalledOnce(); + expect(summarizeBindingsMock).toHaveBeenCalledWith( + expect.objectContaining({ agents: expect.any(Object) }), + [expect.objectContaining({ agentId: "main" })], + providerSummaryMetadataMock, + ); + expect(listProvidersForAgentMock).toHaveBeenCalledWith( + expect.objectContaining({ + cfg: expect.objectContaining({ agents: expect.any(Object) }), + bindings: [expect.objectContaining({ agentId: "main" })], + providerMetadata: providerSummaryMetadataMock, + }), + ); expect(runtime.json[0]).toEqual([ expect.objectContaining({ id: "main", diff --git a/src/commands/doctor-security.test.ts b/src/commands/doctor-security.test.ts index f1754d3125f..92af2432c2c 100644 --- a/src/commands/doctor-security.test.ts +++ b/src/commands/doctor-security.test.ts @@ -6,6 +6,7 @@ import type { OpenClawConfig } from "../config/config.js"; const note = vi.hoisted(() => vi.fn()); const pluginRegistry = vi.hoisted(() => ({ list: [] as unknown[] })); +const listReadOnlyChannelPluginsForConfigMock = vi.hoisted(() => vi.fn()); vi.mock("../terminal/note.js", () => ({ note, @@ -15,6 +16,10 @@ vi.mock("../channels/plugins/index.js", () => ({ listChannelPlugins: () => pluginRegistry.list, })); +vi.mock("../channels/plugins/read-only.js", () => ({ + listReadOnlyChannelPluginsForConfig: listReadOnlyChannelPluginsForConfigMock, +})); + vi.mock("../channels/read-only-account-inspect.js", () => ({ inspectReadOnlyChannelAccount: vi.fn(async () => null), })); @@ -28,6 +33,8 @@ describe("noteSecurityWarnings gateway exposure", () => { beforeEach(() => { note.mockClear(); + listReadOnlyChannelPluginsForConfigMock.mockReset(); + listReadOnlyChannelPluginsForConfigMock.mockImplementation(() => pluginRegistry.list); pluginRegistry.list = []; prevToken = process.env.OPENCLAW_GATEWAY_TOKEN; prevPassword = process.env.OPENCLAW_GATEWAY_PASSWORD; @@ -197,6 +204,10 @@ describe("noteSecurityWarnings gateway exposure", () => { ]; const cfg = { session: { dmScope: "main" } } as OpenClawConfig; await noteSecurityWarnings(cfg); + expect(listReadOnlyChannelPluginsForConfigMock).toHaveBeenCalledWith(cfg, { + includePersistedAuthState: true, + includeSetupRuntimeFallback: false, + }); const message = lastMessage(); expect(message).toContain('config set session.dmScope "per-channel-peer"'); }); @@ -454,6 +465,13 @@ describe("noteSecurityWarnings gateway exposure", () => { ]; await noteSecurityWarnings({} as OpenClawConfig); + expect(listReadOnlyChannelPluginsForConfigMock).toHaveBeenCalledWith( + {}, + { + includePersistedAuthState: true, + includeSetupRuntimeFallback: false, + }, + ); const message = lastMessage(); expect(message).toContain("[secrets]"); expect(message).toContain("failed to resolve account");