

























@@ -1,23 +1,25 @@
1-import { afterEach, describe, expect, it, vi } from "vitest";
1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+import { getActiveWebListener, resolveWebAccountId } from "./active-listener.js";
2334vi.mock("openclaw/plugin-sdk/config-runtime", () => ({
45loadConfig: () => ({
56channels: { whatsapp: { accounts: { work: { enabled: true } }, defaultAccount: "work" } },
67}),
78}));
8910+const registryMocks = vi.hoisted(() => ({
11+getRegisteredWhatsAppConnectionController: vi.fn(),
12+}));
13+14+vi.mock("./connection-controller-registry.js", () => ({
15+getRegisteredWhatsAppConnectionController:
16+registryMocks.getRegisteredWhatsAppConnectionController,
17+}));
18+919const WHATSAPP_ACTIVE_LISTENER_TEST_CFG = {
1020channels: { whatsapp: { accounts: { work: { enabled: true } }, defaultAccount: "work" } },
1121};
122213-type ActiveListenerModule = typeof import("./active-listener.js");
14-15-const activeListenerModuleUrl = new URL("./active-listener.ts", import.meta.url).href;
16-17-async function importActiveListenerModule(cacheBust: string): Promise<ActiveListenerModule> {
18-return (await import(`${activeListenerModuleUrl}?t=${cacheBust}`)) as ActiveListenerModule;
19-}
20-2123function makeListener() {
2224return {
2325sendMessage: vi.fn(async () => ({ messageId: "msg-1" })),
@@ -27,53 +29,43 @@ function makeListener() {
2729};
2830}
293130-afterEach(() => {
31-vi.doUnmock("./connection-controller-registry.js");
32+beforeEach(() => {
33+registryMocks.getRegisteredWhatsAppConnectionController.mockReset();
3234});
33353436describe("active WhatsApp listener view", () => {
35-it("reads controller-backed state across duplicate module instances", async () => {
37+it("reads controller-backed state", () => {
3638const listener = makeListener();
37-vi.doMock("./connection-controller-registry.js", () => ({
38-getRegisteredWhatsAppConnectionController: (accountId: string) =>
39+registryMocks.getRegisteredWhatsAppConnectionController.mockImplementation(
40+(accountId: string) =>
3941accountId === "work"
4042 ? {
4143getActiveListener: () => listener,
4244}
4345 : null,
44-}));
45-46-const first = await importActiveListenerModule(`first-${Date.now()}`);
47-const second = await importActiveListenerModule(`second-${Date.now()}`);
46+);
484749-expect(first.getActiveWebListener("work")).toBe(listener);
50-expect(second.getActiveWebListener("work")).toBe(listener);
48+expect(getActiveWebListener("work")).toBe(listener);
5149});
525053-it("resolves the configured default account when accountId is omitted", async () => {
51+it("resolves the configured default account when accountId is omitted", () => {
5452const listener = makeListener();
55-vi.doMock("./connection-controller-registry.js", () => ({
56-getRegisteredWhatsAppConnectionController: (accountId: string) =>
53+registryMocks.getRegisteredWhatsAppConnectionController.mockImplementation(
54+(accountId: string) =>
5755accountId === "work"
5856 ? {
5957getActiveListener: () => listener,
6058}
6159 : null,
62-}));
60+);
636164-const mod = await importActiveListenerModule(`default-${Date.now()}`);
65-66-expect(mod.resolveWebAccountId({ cfg: WHATSAPP_ACTIVE_LISTENER_TEST_CFG })).toBe("work");
67-expect(mod.getActiveWebListener("work")).toBe(listener);
62+expect(resolveWebAccountId({ cfg: WHATSAPP_ACTIVE_LISTENER_TEST_CFG })).toBe("work");
63+expect(getActiveWebListener("work")).toBe(listener);
6864});
696570-it("returns null when the controller has no active listener for the account", async () => {
71-vi.doMock("./connection-controller-registry.js", () => ({
72-getRegisteredWhatsAppConnectionController: () => null,
73-}));
74-75-const mod = await importActiveListenerModule(`missing-${Date.now()}`);
66+it("returns null when the controller has no active listener for the account", () => {
67+registryMocks.getRegisteredWhatsAppConnectionController.mockReturnValue(null);
766877-expect(mod.getActiveWebListener("work")).toBeNull();
69+expect(getActiveWebListener("work")).toBeNull();
7870});
7971});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。