




















@@ -82,6 +82,20 @@ const {
8282} = discordSendMocks;
83838484const enableAllActions = () => true;
85+const DISCORD_TEST_CFG = {} as OpenClawConfig;
86+87+function handleMessagingAction(
88+action: string,
89+params: Record<string, unknown>,
90+isActionEnabled: (key: keyof DiscordActionConfig) => boolean,
91+options?: {
92+mediaLocalRoots?: readonly string[];
93+mediaReadFile?: (filePath: string) => Promise<Buffer>;
94+},
95+cfg: OpenClawConfig = DISCORD_TEST_CFG,
96+) {
97+return handleDiscordMessagingAction(action, params, isActionEnabled, options, cfg);
98+}
859986100const disabledActions = (key: keyof DiscordActionConfig) => key !== "reactions";
87101const channelInfoEnabled = (key: keyof DiscordActionConfig) => key === "channelInfo";
@@ -112,7 +126,7 @@ describe("handleDiscordMessagingAction", () => {
112126messageId: "M1",
113127emoji: "✅",
114128},
115-expectedOptions: undefined,
129+expectedOptions: { cfg: DISCORD_TEST_CFG, accountId: "default" },
116130},
117131{
118132name: "with accountId",
@@ -122,19 +136,21 @@ describe("handleDiscordMessagingAction", () => {
122136emoji: "✅",
123137accountId: "ops",
124138},
125-expectedOptions: { accountId: "ops" },
139+expectedOptions: { cfg: DISCORD_TEST_CFG, accountId: "ops" },
126140},
127141])("adds reactions $name", async ({ params, expectedOptions }) => {
128-await handleDiscordMessagingAction("react", params, enableAllActions);
142+await handleMessagingAction("react", params, enableAllActions);
129143if (expectedOptions) {
130144expect(reactMessageDiscord).toHaveBeenCalledWith("C1", "M1", "✅", expectedOptions);
131145return;
132146}
133-expect(reactMessageDiscord).toHaveBeenCalledWith("C1", "M1", "✅", {});
147+expect(reactMessageDiscord).toHaveBeenCalledWith("C1", "M1", "✅", {
148+cfg: DISCORD_TEST_CFG,
149+});
134150});
135151136152it("uses configured defaultAccount when cfg is provided and accountId is omitted", async () => {
137-await handleDiscordMessagingAction(
153+await handleMessagingAction(
138154"react",
139155{
140156channelId: "C1",
@@ -164,7 +180,7 @@ describe("handleDiscordMessagingAction", () => {
164180});
165181166182it("removes reactions on empty emoji", async () => {
167-await handleDiscordMessagingAction(
183+await handleMessagingAction(
168184"react",
169185{
170186channelId: "C1",
@@ -173,11 +189,14 @@ describe("handleDiscordMessagingAction", () => {
173189},
174190enableAllActions,
175191);
176-expect(removeOwnReactionsDiscord).toHaveBeenCalledWith("C1", "M1", {});
192+expect(removeOwnReactionsDiscord).toHaveBeenCalledWith("C1", "M1", {
193+cfg: DISCORD_TEST_CFG,
194+accountId: "default",
195+});
177196});
178197179198it("removes reactions when remove flag set", async () => {
180-await handleDiscordMessagingAction(
199+await handleMessagingAction(
181200"react",
182201{
183202channelId: "C1",
@@ -187,12 +206,15 @@ describe("handleDiscordMessagingAction", () => {
187206},
188207enableAllActions,
189208);
190-expect(removeReactionDiscord).toHaveBeenCalledWith("C1", "M1", "✅", {});
209+expect(removeReactionDiscord).toHaveBeenCalledWith("C1", "M1", "✅", {
210+cfg: DISCORD_TEST_CFG,
211+accountId: "default",
212+});
191213});
192214193215it("rejects removes without emoji", async () => {
194216await expect(
195-handleDiscordMessagingAction(
217+handleMessagingAction(
196218"react",
197219{
198220channelId: "C1",
@@ -207,7 +229,7 @@ describe("handleDiscordMessagingAction", () => {
207229208230it("respects reaction gating", async () => {
209231await expect(
210-handleDiscordMessagingAction(
232+handleMessagingAction(
211233"react",
212234{
213235channelId: "C1",
@@ -220,7 +242,7 @@ describe("handleDiscordMessagingAction", () => {
220242});
221243222244it("parses string booleans for poll options", async () => {
223-await handleDiscordMessagingAction(
245+await handleMessagingAction(
224246"poll",
225247{
226248to: "channel:123",
@@ -249,7 +271,7 @@ describe("handleDiscordMessagingAction", () => {
249271{ id: "1", timestamp: "2026-01-15T10:00:00.000Z" },
250272] as never);
251273252-const result = await handleDiscordMessagingAction(
274+const result = await handleMessagingAction(
253275"readMessages",
254276{ channelId: "C1" },
255277enableAllActions,
@@ -271,13 +293,7 @@ describe("handleDiscordMessagingAction", () => {
271293},
272294},
273295} as OpenClawConfig;
274-await handleDiscordMessagingAction(
275-"readMessages",
276-{ channelId: "C1" },
277-enableAllActions,
278-{},
279-cfg,
280-);
296+await handleMessagingAction("readMessages", { channelId: "C1" }, enableAllActions, {}, cfg);
281297expect(readMessagesDiscord).toHaveBeenCalledWith("C1", expect.any(Object), { cfg });
282298});
283299@@ -287,7 +303,7 @@ describe("handleDiscordMessagingAction", () => {
287303timestamp: "2026-01-15T11:00:00.000Z",
288304});
289305290-const result = await handleDiscordMessagingAction(
306+const result = await handleMessagingAction(
291307"fetchMessage",
292308{ guildId: "G1", channelId: "C1", messageId: "M1" },
293309enableAllActions,
@@ -307,7 +323,7 @@ describe("handleDiscordMessagingAction", () => {
307323},
308324},
309325} as OpenClawConfig;
310-await handleDiscordMessagingAction(
326+await handleMessagingAction(
311327"fetchMessage",
312328{ guildId: "G1", channelId: "C1", messageId: "M1" },
313329enableAllActions,
@@ -320,11 +336,7 @@ describe("handleDiscordMessagingAction", () => {
320336it("adds normalized timestamps to listPins payloads", async () => {
321337listPinsDiscord.mockResolvedValueOnce([{ id: "1", timestamp: "2026-01-15T12:00:00.000Z" }]);
322338323-const result = await handleDiscordMessagingAction(
324-"listPins",
325-{ channelId: "C1" },
326-enableAllActions,
327-);
339+const result = await handleMessagingAction("listPins", { channelId: "C1" }, enableAllActions);
328340const payload = result.details as {
329341pins: Array<{ timestampMs?: number; timestampUtc?: string }>;
330342};
@@ -340,7 +352,7 @@ describe("handleDiscordMessagingAction", () => {
340352messages: [[{ id: "1", timestamp: "2026-01-15T13:00:00.000Z" }]],
341353});
342354343-const result = await handleDiscordMessagingAction(
355+const result = await handleMessagingAction(
344356"searchMessages",
345357{ guildId: "G1", content: "hi" },
346358enableAllActions,
@@ -360,7 +372,7 @@ describe("handleDiscordMessagingAction", () => {
360372sendVoiceMessageDiscord.mockClear();
361373sendMessageDiscord.mockClear();
362374363-await handleDiscordMessagingAction(
375+await handleMessagingAction(
364376"sendMessage",
365377{
366378to: "channel:123",
@@ -372,6 +384,7 @@ describe("handleDiscordMessagingAction", () => {
372384);
373385374386expect(sendVoiceMessageDiscord).toHaveBeenCalledWith("channel:123", "/tmp/voice.mp3", {
387+cfg: DISCORD_TEST_CFG,
375388replyTo: undefined,
376389silent: true,
377390});
@@ -380,7 +393,7 @@ describe("handleDiscordMessagingAction", () => {
380393381394it("forwards trusted mediaLocalRoots into sendMessageDiscord", async () => {
382395sendMessageDiscord.mockClear();
383-await handleDiscordMessagingAction(
396+await handleMessagingAction(
384397"sendMessage",
385398{
386399to: "channel:123",
@@ -404,7 +417,7 @@ describe("handleDiscordMessagingAction", () => {
404417sendMessageDiscord.mockClear();
405418sendDiscordComponentMessage.mockClear();
406419407-await handleDiscordMessagingAction(
420+await handleMessagingAction(
408421"sendMessage",
409422{
410423to: "channel:123",
@@ -429,7 +442,7 @@ describe("handleDiscordMessagingAction", () => {
429442430443it("forwards the optional filename into sendMessageDiscord", async () => {
431444sendMessageDiscord.mockClear();
432-await handleDiscordMessagingAction(
445+await handleMessagingAction(
433446"sendMessage",
434447{
435448to: "channel:123",
@@ -451,7 +464,7 @@ describe("handleDiscordMessagingAction", () => {
451464452465it("rejects voice messages that include content", async () => {
453466await expect(
454-handleDiscordMessagingAction(
467+handleMessagingAction(
455468"sendMessage",
456469{
457470to: "channel:123",
@@ -466,7 +479,7 @@ describe("handleDiscordMessagingAction", () => {
466479467480it("forwards optional thread content", async () => {
468481createThreadDiscord.mockClear();
469-await handleDiscordMessagingAction(
482+await handleMessagingAction(
470483"threadCreate",
471484{
472485channelId: "C1",
@@ -484,7 +497,7 @@ describe("handleDiscordMessagingAction", () => {
484497content: "Initial forum post body",
485498appliedTags: undefined,
486499},
487-{},
500+{ cfg: DISCORD_TEST_CFG },
488501);
489502});
490503});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。