test: update channel metadata mocks

This commit is contained in:
Shakker
2026-04-26 08:32:44 +01:00
parent 8d50cd82d3
commit 295bcde7b8
2 changed files with 58 additions and 3 deletions

View File

@@ -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",

View File

@@ -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");