























@@ -1,4 +1,4 @@
1-import { describe, expect, it, vi } from "vitest";
1+import { beforeEach, describe, expect, it, vi } from "vitest";
22import { baseConfigSnapshot, createTestRuntime } from "./test-runtime-config-helpers.js";
3344const mocks = vi.hoisted(() => ({
@@ -9,7 +9,8 @@ const mocks = vi.hoisted(() => ({
99diagnostics: [],
1010})),
1111loadAuthProfileStoreWithoutExternalProfiles: vi.fn(),
12-listChannelPlugins: vi.fn(() => []),
12+listReadOnlyChannelPluginsForConfig: vi.fn(() => []),
13+buildChannelAccountSnapshot: vi.fn(),
1314}));
14151516vi.mock("../config/config.js", () => ({
@@ -28,13 +29,26 @@ vi.mock("../agents/auth-profiles.js", () => ({
2829loadAuthProfileStoreWithoutExternalProfiles: mocks.loadAuthProfileStoreWithoutExternalProfiles,
2930}));
303131-vi.mock("../channels/plugins/index.js", () => ({
32-listChannelPlugins: mocks.listChannelPlugins,
32+vi.mock("../channels/plugins/read-only.js", () => ({
33+listReadOnlyChannelPluginsForConfig: mocks.listReadOnlyChannelPluginsForConfig,
34+}));
35+36+vi.mock("../channels/plugins/status.js", () => ({
37+buildChannelAccountSnapshot: mocks.buildChannelAccountSnapshot,
3338}));
34393540import { channelsListCommand } from "./channels/list.js";
36413742describe("channels list auth profiles", () => {
43+beforeEach(() => {
44+mocks.readConfigFileSnapshot.mockReset();
45+mocks.resolveCommandConfigWithSecrets.mockClear();
46+mocks.loadAuthProfileStoreWithoutExternalProfiles.mockReset();
47+mocks.listReadOnlyChannelPluginsForConfig.mockReset();
48+mocks.listReadOnlyChannelPluginsForConfig.mockReturnValue([]);
49+mocks.buildChannelAccountSnapshot.mockReset();
50+});
51+3852it("includes local auth profiles in JSON output without loading external profiles", async () => {
3953const runtime = createTestRuntime();
4054mocks.readConfigFileSnapshot.mockResolvedValue({
@@ -73,4 +87,92 @@ describe("channels list auth profiles", () => {
7387expect(ids).toContain("anthropic:default");
7488expect(ids).toContain("openai-codex:default");
7589});
90+91+it("includes configured chat channel accounts in JSON output", async () => {
92+const runtime = createTestRuntime();
93+mocks.listReadOnlyChannelPluginsForConfig.mockReturnValue([
94+{
95+id: "telegram",
96+meta: { id: "telegram", label: "Telegram" },
97+config: {
98+listAccountIds: () => ["alerts", "default"],
99+},
100+},
101+]);
102+mocks.readConfigFileSnapshot.mockResolvedValue({
103+ ...baseConfigSnapshot,
104+config: {
105+channels: {
106+telegram: {
107+accounts: {
108+default: { botToken: "123:abc" },
109+alerts: { botToken: "456:def" },
110+},
111+},
112+},
113+},
114+});
115+mocks.loadAuthProfileStoreWithoutExternalProfiles.mockReturnValue({
116+version: 1,
117+profiles: {},
118+});
119+120+await channelsListCommand({ json: true, usage: false }, runtime);
121+122+expect(mocks.listReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(
123+expect.any(Object),
124+expect.objectContaining({ includeSetupRuntimeFallback: true }),
125+);
126+const payload = JSON.parse(runtime.log.mock.calls[0]?.[0] as string) as {
127+chat?: Record<string, string[]>;
128+};
129+expect(payload.chat?.telegram).toEqual(["alerts", "default"]);
130+});
131+132+it("prints configured chat channel accounts before auth providers", async () => {
133+const runtime = createTestRuntime();
134+mocks.listReadOnlyChannelPluginsForConfig.mockReturnValue([
135+{
136+id: "telegram",
137+meta: { id: "telegram", label: "Telegram" },
138+config: {
139+listAccountIds: () => ["default"],
140+},
141+},
142+]);
143+mocks.buildChannelAccountSnapshot.mockResolvedValue({
144+accountId: "default",
145+configured: true,
146+tokenSource: "config",
147+enabled: true,
148+});
149+mocks.readConfigFileSnapshot.mockResolvedValue({
150+ ...baseConfigSnapshot,
151+config: {
152+channels: {
153+telegram: {
154+accounts: {
155+default: { botToken: "123:abc" },
156+},
157+},
158+},
159+},
160+});
161+mocks.loadAuthProfileStoreWithoutExternalProfiles.mockReturnValue({
162+version: 1,
163+profiles: {},
164+});
165+166+await channelsListCommand({ usage: false }, runtime);
167+168+expect(mocks.listReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(
169+expect.any(Object),
170+expect.objectContaining({ includeSetupRuntimeFallback: true }),
171+);
172+const output = runtime.log.mock.calls[0]?.[0] as string;
173+expect(output).toContain("Chat channels:");
174+expect(output).toContain("Telegram default:");
175+expect(output).toContain("configured");
176+expect(output.indexOf("Telegram default:")).toBeLessThan(output.indexOf("Auth providers"));
177+});
76178});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。