





























@@ -42,18 +42,41 @@ async function removeUnsafeChannelConfig(unsafeChannel: string) {
4242);
4343}
444445+function selectArg(index = 0): {
46+message?: string;
47+options?: Array<{ value: unknown; label: string }>;
48+} {
49+const call = select.mock.calls[index];
50+expect(call).toBeDefined();
51+return call?.[0] as { message?: string; options?: Array<{ value: unknown; label: string }> };
52+}
53+54+function confirmArg(index = 0): { message?: string } {
55+const call = confirm.mock.calls[index];
56+expect(call).toBeDefined();
57+return call?.[0] as { message?: string };
58+}
59+60+function expectOption(
61+options: Array<{ value: unknown; label: string }> | undefined,
62+value: unknown,
63+label: string,
64+) {
65+expect(
66+options?.some(
67+(option) => option.label === label && JSON.stringify(option.value) === JSON.stringify(value),
68+),
69+).toBe(true);
70+}
71+72+function optionLabels(options: Array<{ value: unknown; label: string }> | undefined) {
73+return options?.map((option) => ({ value: option.value, label: option.label }));
74+}
75+4576function expectUnknownChannelRemovalPrompt(unsafeChannel: string, label: string) {
46-expect(select).toHaveBeenCalledWith(
47-expect.objectContaining({
48-options: expect.arrayContaining([
49-expect.objectContaining({ value: channelChoice(unsafeChannel), label }),
50-]),
51-}),
52-);
53-expect(confirm).toHaveBeenCalledWith(
54-expect.objectContaining({
55-message: `Delete ${label} configuration from ~/.openclaw/openclaw.json?`,
56-}),
77+expectOption(selectArg().options, channelChoice(unsafeChannel), label);
78+expect(confirmArg().message).toBe(
79+`Delete ${label} configuration from ~/.openclaw/openclaw.json?`,
5780);
5881expect(note).toHaveBeenCalledWith(
5982`${label} removed from config.\nNote: credentials/sessions on disk are unchanged.`,
@@ -87,17 +110,14 @@ describe("removeChannelConfigWizard", () => {
87110{} as never,
88111);
8911290-expect(select).toHaveBeenCalledWith(
91-expect.objectContaining({
92-message: "Remove which channel config?",
93-options: [
94-expect.objectContaining({ value: channelChoice("telegram"), label: "Telegram" }),
95-expect.objectContaining({ value: channelChoice("twitch"), label: "Twitch" }),
96-expect.objectContaining({ value: channelChoice("unknown"), label: "unknown" }),
97-{ value: doneChoice, label: "Done" },
98-],
99-}),
100-);
113+const prompt = selectArg();
114+expect(prompt.message).toBe("Remove which channel config?");
115+expect(optionLabels(prompt.options)).toEqual([
116+{ value: channelChoice("telegram"), label: "Telegram" },
117+{ value: channelChoice("twitch"), label: "Twitch" },
118+{ value: channelChoice("unknown"), label: "unknown" },
119+{ value: doneChoice, label: "Done" },
120+]);
101121});
102122103123it("deletes the selected channel block from openclaw.json", async () => {
@@ -113,10 +133,8 @@ describe("removeChannelConfigWizard", () => {
113133{} as never,
114134);
115135116-expect(confirm).toHaveBeenCalledWith(
117-expect.objectContaining({
118-message: "Delete Telegram configuration from ~/.openclaw/openclaw.json?",
119-}),
136+expect(confirmArg().message).toBe(
137+"Delete Telegram configuration from ~/.openclaw/openclaw.json?",
120138);
121139expect(next.channels).toEqual({ twitch: { token: "secret" } });
122140expect(note).toHaveBeenCalledWith(
@@ -138,11 +156,7 @@ describe("removeChannelConfigWizard", () => {
138156{} as never,
139157);
140158141-expect(confirm).toHaveBeenCalledWith(
142-expect.objectContaining({
143-message: "Delete done configuration from ~/.openclaw/openclaw.json?",
144-}),
145-);
159+expect(confirmArg().message).toBe("Delete done configuration from ~/.openclaw/openclaw.json?");
146160expect(next.channels).toEqual({ telegram: { token: "secret" } });
147161expect(note).toHaveBeenCalledWith(
148162"done removed from config.\nNote: credentials/sessions on disk are unchanged.",
@@ -185,14 +199,10 @@ describe("removeChannelConfigWizard", () => {
185199{} as never,
186200);
187201188-expect(select).toHaveBeenCalledWith(
189-expect.objectContaining({
190-options: [
191-expect.objectContaining({ value: channelChoice("telegram"), label: "Telegram" }),
192-{ value: doneChoice, label: "Done" },
193-],
194-}),
195-);
202+expect(optionLabels(selectArg().options)).toEqual([
203+{ value: channelChoice("telegram"), label: "Telegram" },
204+{ value: doneChoice, label: "Done" },
205+]);
196206});
197207198208it("sanitizes known channel labels before rendering prompts", async () => {
@@ -211,17 +221,9 @@ describe("removeChannelConfigWizard", () => {
211221{} as never,
212222);
213223214-expect(select).toHaveBeenCalledWith(
215-expect.objectContaining({
216-options: expect.arrayContaining([
217-expect.objectContaining({ value: channelChoice("telegram"), label: "Telegram\\nBot" }),
218-]),
219-}),
220-);
221-expect(confirm).toHaveBeenCalledWith(
222-expect.objectContaining({
223-message: "Delete Telegram\\nBot configuration from ~/.openclaw/openclaw.json?",
224-}),
224+expectOption(selectArg().options, channelChoice("telegram"), "Telegram\\nBot");
225+expect(confirmArg().message).toBe(
226+"Delete Telegram\\nBot configuration from ~/.openclaw/openclaw.json?",
225227);
226228expect(note).toHaveBeenCalledWith(
227229"Telegram\\nBot removed from config.\nNote: credentials/sessions on disk are unchanged.",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。