test: speed up discord monitor suites

This commit is contained in:
Peter Steinberger
2026-03-24 22:14:54 +00:00
parent e28b516fb5
commit 3dc139b0c0
9 changed files with 37 additions and 30 deletions

View File

@@ -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();

View File

@@ -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,

View File

@@ -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"));
});

View File

@@ -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"));

View File

@@ -283,7 +283,6 @@ async function expectBoundStatusCommandDispatch(params: {
describe("Discord native plugin command dispatch", () => {
beforeAll(async () => {
vi.resetModules();
({ createDiscordNativeCommand } = await import("./native-command.js"));
});

View File

@@ -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({});
});

View File

@@ -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");

View File

@@ -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", () => {

View File

@@ -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(