diff --git a/extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts b/extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts index c9b2f0b36a6..584a037f33a 100644 --- a/extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts +++ b/extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts @@ -1,6 +1,6 @@ import type { Client } from "@buape/carbon"; import { MessageType } from "@buape/carbon"; -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { dispatchMock, loadConfigMock, @@ -16,12 +16,14 @@ let createDiscordMessageHandler: typeof import("./monitor/message-handler.js").c let __resetDiscordChannelInfoCacheForTest: typeof import("./monitor/message-utils.js").__resetDiscordChannelInfoCacheForTest; let createNoopThreadBindingManager: typeof import("./monitor/thread-bindings.js").createNoopThreadBindingManager; -beforeEach(async () => { - vi.resetModules(); +beforeAll(async () => { ({ ChannelType } = await import("@buape/carbon")); ({ createDiscordMessageHandler } = await import("./monitor/message-handler.js")); ({ __resetDiscordChannelInfoCacheForTest } = await import("./monitor/message-utils.js")); ({ createNoopThreadBindingManager } = await import("./monitor/thread-bindings.js")); +}); + +beforeEach(async () => { __resetDiscordChannelInfoCacheForTest(); sendMock.mockClear().mockResolvedValue(undefined); updateLastRouteMock.mockClear(); diff --git a/extensions/discord/src/monitor/agent-components.wildcard.test.ts b/extensions/discord/src/monitor/agent-components.wildcard.test.ts index a13b5c2299e..04d484cc022 100644 --- a/extensions/discord/src/monitor/agent-components.wildcard.test.ts +++ b/extensions/discord/src/monitor/agent-components.wildcard.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, describe, expect, it, vi } from "vitest"; let buildDiscordComponentCustomId: typeof import("../components.js").buildDiscordComponentCustomId; let buildDiscordModalCustomId: typeof import("../components.js").buildDiscordModalCustomId; @@ -10,8 +10,7 @@ let createDiscordComponentRoleSelect: typeof import("./agent-components.js").cre let createDiscordComponentStringSelect: typeof import("./agent-components.js").createDiscordComponentStringSelect; let createDiscordComponentUserSelect: typeof import("./agent-components.js").createDiscordComponentUserSelect; -beforeEach(async () => { - vi.resetModules(); +beforeAll(async () => { ({ buildDiscordComponentCustomId, buildDiscordModalCustomId } = await import("../components.js")); ({ createDiscordComponentButton, diff --git a/extensions/discord/src/monitor/listeners.test.ts b/extensions/discord/src/monitor/listeners.test.ts index 054c3428ddd..75ad573471a 100644 --- a/extensions/discord/src/monitor/listeners.test.ts +++ b/extensions/discord/src/monitor/listeners.test.ts @@ -3,7 +3,6 @@ import { beforeAll, describe, expect, it, vi } from "vitest"; let DiscordMessageListener: typeof import("./listeners.js").DiscordMessageListener; beforeAll(async () => { - vi.resetModules(); ({ DiscordMessageListener } = await import("./listeners.js")); }); diff --git a/extensions/discord/src/monitor/native-command.options.test.ts b/extensions/discord/src/monitor/native-command.options.test.ts index deceb66d80f..5c058068a8d 100644 --- a/extensions/discord/src/monitor/native-command.options.test.ts +++ b/extensions/discord/src/monitor/native-command.options.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig, loadConfig } from "../../../../src/config/config.js"; let listNativeCommandSpecs: typeof import("../../../../src/auto-reply/commands-registry.js").listNativeCommandSpecs; let createDiscordNativeCommand: typeof import("./native-command.js").createDiscordNativeCommand; @@ -64,8 +64,7 @@ function readChoices(option: CommandOption | undefined): unknown[] | undefined { } describe("createDiscordNativeCommand option wiring", () => { - beforeEach(async () => { - vi.resetModules(); + beforeAll(async () => { ({ listNativeCommandSpecs } = await import("../../../../src/auto-reply/commands-registry.js")); ({ createDiscordNativeCommand } = await import("./native-command.js")); ({ createNoopThreadBindingManager } = await import("./thread-bindings.js")); diff --git a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts index 1e505349fe9..5abfebd5637 100644 --- a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts +++ b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts @@ -283,7 +283,6 @@ async function expectBoundStatusCommandDispatch(params: { describe("Discord native plugin command dispatch", () => { beforeAll(async () => { - vi.resetModules(); ({ createDiscordNativeCommand } = await import("./native-command.js")); }); diff --git a/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts b/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts index e048fb5c143..ff80e530404 100644 --- a/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts +++ b/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts @@ -1,5 +1,5 @@ import { ChannelType } from "discord-api-types/v10"; -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../../src/config/config.js"; import type { ThreadBindingRecord } from "./thread-bindings.types.js"; @@ -37,11 +37,13 @@ vi.mock("../send.js", async (importOriginal) => { let maybeSendBindingMessage: typeof import("./thread-bindings.discord-api.js").maybeSendBindingMessage; let resolveChannelIdForBinding: typeof import("./thread-bindings.discord-api.js").resolveChannelIdForBinding; +beforeAll(async () => { + ({ maybeSendBindingMessage, resolveChannelIdForBinding } = + await import("./thread-bindings.discord-api.js")); +}); + describe("resolveChannelIdForBinding", () => { - beforeEach(async () => { - vi.resetModules(); - ({ maybeSendBindingMessage, resolveChannelIdForBinding } = - await import("./thread-bindings.discord-api.js")); + beforeEach(() => { hoisted.restGet.mockClear(); hoisted.createDiscordRestClient.mockClear(); hoisted.sendMessageDiscord.mockClear().mockResolvedValue({}); @@ -127,10 +129,7 @@ describe("resolveChannelIdForBinding", () => { }); describe("maybeSendBindingMessage", () => { - beforeEach(async () => { - vi.resetModules(); - ({ maybeSendBindingMessage, resolveChannelIdForBinding } = - await import("./thread-bindings.discord-api.js")); + beforeEach(() => { hoisted.sendMessageDiscord.mockClear().mockResolvedValue({}); hoisted.sendWebhookMessageDiscord.mockClear().mockResolvedValue({}); }); diff --git a/extensions/discord/src/monitor/thread-session-close.test.ts b/extensions/discord/src/monitor/thread-session-close.test.ts index faff3a4cf03..713bbd1690f 100644 --- a/extensions/discord/src/monitor/thread-session-close.test.ts +++ b/extensions/discord/src/monitor/thread-session-close.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const hoisted = vi.hoisted(() => { const updateSessionStore = vi.fn(); @@ -30,9 +30,11 @@ const MATCHED_KEY = `agent:main:discord:channel:${THREAD_ID}`; const UNMATCHED_KEY = `agent:main:discord:channel:${OTHER_ID}`; describe("closeDiscordThreadSessions", () => { - beforeEach(async () => { - vi.resetModules(); + beforeAll(async () => { ({ closeDiscordThreadSessions } = await import("./thread-session-close.js")); + }); + + beforeEach(() => { hoisted.updateSessionStore.mockClear(); hoisted.resolveStorePath.mockClear(); hoisted.resolveStorePath.mockReturnValue("/tmp/openclaw-sessions.json"); diff --git a/extensions/discord/src/monitor/thread-title.generate.test.ts b/extensions/discord/src/monitor/thread-title.generate.test.ts index 9c66ed7a138..05f064067d5 100644 --- a/extensions/discord/src/monitor/thread-title.generate.test.ts +++ b/extensions/discord/src/monitor/thread-title.generate.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const hoisted = vi.hoisted(() => ({ completeWithPreparedSimpleCompletionModelMock: vi.fn(), @@ -20,8 +20,11 @@ vi.mock("openclaw/plugin-sdk/agent-runtime", async (importOriginal) => { let generateThreadTitle: typeof import("./thread-title.js").generateThreadTitle; -beforeEach(async () => { - vi.resetModules(); +beforeAll(async () => { + ({ generateThreadTitle } = await import("./thread-title.js")); +}); + +beforeEach(() => { hoisted.completeWithPreparedSimpleCompletionModelMock.mockReset(); hoisted.prepareSimpleCompletionModelForAgentMock.mockReset(); hoisted.extractAssistantTextMock.mockReset(); @@ -44,7 +47,6 @@ beforeEach(async () => { }); hoisted.completeWithPreparedSimpleCompletionModelMock.mockResolvedValue({}); hoisted.extractAssistantTextMock.mockReturnValue("Generated title"); - ({ generateThreadTitle } = await import("./thread-title.js")); }); describe("generateThreadTitle", () => { diff --git a/extensions/discord/src/monitor/threading.auto-thread.test.ts b/extensions/discord/src/monitor/threading.auto-thread.test.ts index e7065bd08a5..a675fd1c897 100644 --- a/extensions/discord/src/monitor/threading.auto-thread.test.ts +++ b/extensions/discord/src/monitor/threading.auto-thread.test.ts @@ -1,5 +1,5 @@ import { ChannelType } from "@buape/carbon"; -import { describe, it, expect, vi, beforeEach } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../../src/config/config.js"; type MaybeCreateDiscordAutoThreadFn = typeof import("./threading.js").maybeCreateDiscordAutoThread; @@ -46,8 +46,7 @@ async function flushAsyncWork() { await Promise.resolve(); } -beforeEach(async () => { - vi.resetModules(); +beforeAll(async () => { postMock.mockReset(); getMock.mockReset(); patchMock.mockReset(); @@ -55,6 +54,13 @@ beforeEach(async () => { ({ maybeCreateDiscordAutoThread } = await import("./threading.js")); }); +beforeEach(() => { + postMock.mockReset(); + getMock.mockReset(); + patchMock.mockReset(); + generateThreadTitleMock.mockReset(); +}); + describe("maybeCreateDiscordAutoThread", () => { it("skips auto-thread if channelType is GuildForum", async () => { const result = await maybeCreateDiscordAutoThread(