From fe27215747cc1c401a88d8a2fad8560315a5a9a6 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 15:03:14 +0000 Subject: [PATCH] refactor(test): share web broadcast-groups harness --- ...asts-sequentially-configured-order.test.ts | 42 ++++--------------- ...wn-broadcast-agent-ids-agents-list.test.ts | 13 ++---- ...uto-reply.broadcast-groups.test-harness.ts | 22 ++++++++++ 3 files changed, 34 insertions(+), 43 deletions(-) create mode 100644 src/web/auto-reply.broadcast-groups.test-harness.ts diff --git a/src/web/auto-reply.broadcast-groups.broadcasts-sequentially-configured-order.test.ts b/src/web/auto-reply.broadcast-groups.broadcasts-sequentially-configured-order.test.ts index 42a263708ae..a4575a36611 100644 --- a/src/web/auto-reply.broadcast-groups.broadcasts-sequentially-configured-order.test.ts +++ b/src/web/auto-reply.broadcast-groups.broadcasts-sequentially-configured-order.test.ts @@ -1,10 +1,8 @@ import "./test-helpers.js"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; -import { monitorWebChannel } from "./auto-reply.js"; +import { monitorWebChannelWithCapture } from "./auto-reply.broadcast-groups.test-harness.js"; import { - createWebInboundDeliverySpies, - createWebListenerFactoryCapture, installWebAutoReplyTestHomeHooks, installWebAutoReplyUnitTestHooks, resetLoadConfigMock, @@ -37,16 +35,10 @@ describe("broadcast groups", () => { return { text: "ok" }; }); - const spies = createWebInboundDeliverySpies(); - - const { listenerFactory, getOnMessage } = createWebListenerFactoryCapture(); - - await monitorWebChannel(false, listenerFactory, false, resolver); - const onMessage = getOnMessage(); - expect(onMessage).toBeDefined(); + const { spies, onMessage } = await monitorWebChannelWithCapture(resolver); await sendWebDirectInboundMessage({ - onMessage: onMessage!, + onMessage, spies, id: "m1", from: "+1000", @@ -72,17 +64,12 @@ describe("broadcast groups", () => { }, } satisfies OpenClawConfig); - const spies = createWebInboundDeliverySpies(); const resolver = vi.fn().mockResolvedValue({ text: "ok" }); - const { listenerFactory, getOnMessage } = createWebListenerFactoryCapture(); - - await monitorWebChannel(false, listenerFactory, false, resolver); - const onMessage = getOnMessage(); - expect(onMessage).toBeDefined(); + const { spies, onMessage } = await monitorWebChannelWithCapture(resolver); await sendWebGroupInboundMessage({ - onMessage: onMessage!, + onMessage, spies, body: "hello group", id: "g1", @@ -94,7 +81,7 @@ describe("broadcast groups", () => { expect(resolver).not.toHaveBeenCalled(); await sendWebGroupInboundMessage({ - onMessage: onMessage!, + onMessage, spies, body: "@bot ping", id: "g2", @@ -124,7 +111,7 @@ describe("broadcast groups", () => { } await sendWebGroupInboundMessage({ - onMessage: onMessage!, + onMessage, spies, body: "@bot ping 2", id: "g3", @@ -177,20 +164,9 @@ describe("broadcast groups", () => { return { text: "ok" }; }); - let capturedOnMessage: - | ((msg: import("./inbound.js").WebInboundMessage) => Promise) - | undefined; - const listenerFactory = async (opts: { - onMessage: (msg: import("./inbound.js").WebInboundMessage) => Promise; - }) => { - capturedOnMessage = opts.onMessage; - return { close: vi.fn() }; - }; + const { onMessage: capturedOnMessage } = await monitorWebChannelWithCapture(resolver); - await monitorWebChannel(false, listenerFactory, false, resolver); - expect(capturedOnMessage).toBeDefined(); - - await capturedOnMessage?.({ + await capturedOnMessage({ id: "m1", from: "+1000", conversationId: "+1000", diff --git a/src/web/auto-reply.broadcast-groups.skips-unknown-broadcast-agent-ids-agents-list.test.ts b/src/web/auto-reply.broadcast-groups.skips-unknown-broadcast-agent-ids-agents-list.test.ts index 78bb489e435..1499c607eb8 100644 --- a/src/web/auto-reply.broadcast-groups.skips-unknown-broadcast-agent-ids-agents-list.test.ts +++ b/src/web/auto-reply.broadcast-groups.skips-unknown-broadcast-agent-ids-agents-list.test.ts @@ -1,10 +1,8 @@ import "./test-helpers.js"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; -import { monitorWebChannel } from "./auto-reply.js"; +import { monitorWebChannelWithCapture } from "./auto-reply.broadcast-groups.test-harness.js"; import { - createWebInboundDeliverySpies, - createWebListenerFactoryCapture, installWebAutoReplyTestHomeHooks, installWebAutoReplyUnitTestHooks, resetLoadConfigMock, @@ -35,15 +33,10 @@ describe("broadcast groups", () => { return { text: "ok" }; }); - const spies = createWebInboundDeliverySpies(); - const { listenerFactory, getOnMessage } = createWebListenerFactoryCapture(); - - await monitorWebChannel(false, listenerFactory, false, resolver); - const onMessage = getOnMessage(); - expect(onMessage).toBeDefined(); + const { spies, onMessage } = await monitorWebChannelWithCapture(resolver); await sendWebDirectInboundMessage({ - onMessage: onMessage!, + onMessage, spies, id: "m1", from: "+1000", diff --git a/src/web/auto-reply.broadcast-groups.test-harness.ts b/src/web/auto-reply.broadcast-groups.test-harness.ts new file mode 100644 index 00000000000..00d9ccedb1a --- /dev/null +++ b/src/web/auto-reply.broadcast-groups.test-harness.ts @@ -0,0 +1,22 @@ +import type { WebInboundMessage } from "./inbound.js"; +import { monitorWebChannel } from "./auto-reply.js"; +import { + createWebInboundDeliverySpies, + createWebListenerFactoryCapture, +} from "./auto-reply.test-harness.js"; + +export async function monitorWebChannelWithCapture(resolver: unknown): Promise<{ + spies: ReturnType; + onMessage: (msg: WebInboundMessage) => Promise; +}> { + const spies = createWebInboundDeliverySpies(); + const { listenerFactory, getOnMessage } = createWebListenerFactoryCapture(); + + await monitorWebChannel(false, listenerFactory, false, resolver as never); + const onMessage = getOnMessage(); + if (!onMessage) { + throw new Error("Missing onMessage handler"); + } + + return { spies, onMessage }; +}