From db4572b4593275ccf867ab333caf3f03be2fb87e Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 24 Mar 2026 15:13:57 +0000 Subject: [PATCH] test: speed up slack extension suites --- extensions/slack/src/monitor.tool-result.test.ts | 10 +++++----- extensions/slack/src/monitor/events/channels.test.ts | 9 ++++++--- .../slack/src/monitor/events/interactions.test.ts | 7 +++++-- extensions/slack/src/monitor/events/members.test.ts | 9 ++++++--- extensions/slack/src/monitor/events/messages.test.ts | 11 ++++++----- extensions/slack/src/monitor/events/pins.test.ts | 9 ++++++--- extensions/slack/src/monitor/events/reactions.test.ts | 9 ++++++--- extensions/slack/src/monitor/message-handler.test.ts | 9 ++++++--- extensions/slack/src/monitor/replies.test.ts | 7 +++++-- extensions/slack/src/monitor/slash.test.ts | 5 ++++- 10 files changed, 55 insertions(+), 30 deletions(-) diff --git a/extensions/slack/src/monitor.tool-result.test.ts b/extensions/slack/src/monitor.tool-result.test.ts index 0b8ad78b4de..23a92a56f3a 100644 --- a/extensions/slack/src/monitor.tool-result.test.ts +++ b/extensions/slack/src/monitor.tool-result.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { defaultSlackTestConfig, getSlackTestState, @@ -20,15 +20,15 @@ let monitorSlackProvider: typeof import("./monitor.js").monitorSlackProvider; const slackTestState = getSlackTestState(); const { sendMock, replyMock, reactMock, upsertPairingRequestMock } = slackTestState; -beforeEach(() => { +beforeAll(async () => { vi.resetModules(); -}); - -beforeEach(async () => { ({ resetInboundDedupe } = await import("../../../src/auto-reply/reply/inbound-dedupe.js")); ({ HISTORY_CONTEXT_MARKER } = await import("../../../src/auto-reply/reply/history.js")); ({ CURRENT_MESSAGE_MARKER } = await import("../../../src/auto-reply/reply/mentions.js")); ({ monitorSlackProvider } = await import("./monitor.js")); +}); + +beforeEach(() => { resetInboundDedupe(); resetSlackTestState(defaultSlackTestConfig()); }); diff --git a/extensions/slack/src/monitor/events/channels.test.ts b/extensions/slack/src/monitor/events/channels.test.ts index 83e24e735ae..bf7058c4e71 100644 --- a/extensions/slack/src/monitor/events/channels.test.ts +++ b/extensions/slack/src/monitor/events/channels.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const enqueueSystemEventMock = vi.hoisted(() => vi.fn()); let registerSlackChannelEvents: typeof import("./channels.js").registerSlackChannelEvents; @@ -32,13 +32,16 @@ function createChannelContext(params?: { } describe("registerSlackChannelEvents", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); - enqueueSystemEventMock.mockClear(); ({ registerSlackChannelEvents } = await import("./channels.js")); ({ createSlackSystemEventTestHarness } = await import("./system-event-test-harness.js")); }); + beforeEach(() => { + enqueueSystemEventMock.mockClear(); + }); + it("does not track mismatched events", async () => { const trackEvent = vi.fn(); const { getCreatedHandler } = createChannelContext({ diff --git a/extensions/slack/src/monitor/events/interactions.test.ts b/extensions/slack/src/monitor/events/interactions.test.ts index 1997312eb1b..60af6b72a37 100644 --- a/extensions/slack/src/monitor/events/interactions.test.ts +++ b/extensions/slack/src/monitor/events/interactions.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const enqueueSystemEventMock = vi.fn(); const dispatchPluginInteractiveHandlerMock = vi.fn(async () => ({ @@ -197,9 +197,12 @@ function createContext(overrides?: { } describe("registerSlackInteractionEvents", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); ({ registerSlackInteractionEvents } = await import("./interactions.js")); + }); + + beforeEach(() => { enqueueSystemEventMock.mockClear(); dispatchPluginInteractiveHandlerMock.mockClear(); resolvePluginConversationBindingApprovalMock.mockClear(); diff --git a/extensions/slack/src/monitor/events/members.test.ts b/extensions/slack/src/monitor/events/members.test.ts index fca6e91f797..124972a746a 100644 --- a/extensions/slack/src/monitor/events/members.test.ts +++ b/extensions/slack/src/monitor/events/members.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const memberMocks = vi.hoisted(() => ({ enqueue: vi.fn(), @@ -65,14 +65,17 @@ async function runMemberCase(args: MemberCaseArgs = {}): Promise { } describe("registerSlackMemberEvents", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); - memberMocks.enqueue.mockClear(); ({ registerSlackMemberEvents } = await import("./members.js")); ({ createSlackSystemEventTestHarness: initSlackHarness } = await import("./system-event-test-harness.js")); }); + beforeEach(() => { + memberMocks.enqueue.mockClear(); + }); + const cases: Array<{ name: string; args: MemberCaseArgs; calls: number }> = [ { name: "enqueues DM member events when dmPolicy is open", diff --git a/extensions/slack/src/monitor/events/messages.test.ts b/extensions/slack/src/monitor/events/messages.test.ts index bf30edae442..82f4a2e5616 100644 --- a/extensions/slack/src/monitor/events/messages.test.ts +++ b/extensions/slack/src/monitor/events/messages.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createSlackSystemEventTestHarness, type SlackSystemEventTestOverrides, @@ -52,11 +52,15 @@ function resetMessageMocks(): void { messageAllowMock.mockReset().mockResolvedValue([]); } -beforeEach(async () => { +beforeAll(async () => { vi.resetModules(); ({ registerSlackMessageEvents } = await import("./messages.js")); }); +beforeEach(() => { + resetMessageMocks(); +}); + function makeChangedEvent(overrides?: { channel?: string; user?: string }) { const user = overrides?.user ?? "U1"; return { @@ -116,7 +120,6 @@ async function invokeRegisteredHandler(input: { event: Record; body?: unknown; }) { - resetMessageMocks(); const { handler, handleSlackMessage } = createHandlers(input.eventName, input.overrides); expect(handler).toBeTruthy(); await handler!({ @@ -127,7 +130,6 @@ async function invokeRegisteredHandler(input: { } async function runMessageCase(input: MessageCase = {}): Promise { - resetMessageMocks(); const { handler } = createHandlers("message", input.overrides); expect(handler).toBeTruthy(); await handler!({ @@ -204,7 +206,6 @@ describe("registerSlackMessageEvents", () => { }); it("handles channel and group messages via the unified message handler", async () => { - resetMessageMocks(); const { handler, handleSlackMessage } = createHandlers("message", { dmPolicy: "open", channelType: "channel", diff --git a/extensions/slack/src/monitor/events/pins.test.ts b/extensions/slack/src/monitor/events/pins.test.ts index a67ffd7b42e..e8b222fc66d 100644 --- a/extensions/slack/src/monitor/events/pins.test.ts +++ b/extensions/slack/src/monitor/events/pins.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const pinEnqueueMock = vi.hoisted(() => vi.fn()); let registerSlackPinEvents: typeof import("./pins.js").registerSlackPinEvents; @@ -69,14 +69,17 @@ async function runPinCase(input: PinCase = {}): Promise { } describe("registerSlackPinEvents", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); - pinEnqueueMock.mockClear(); ({ registerSlackPinEvents } = await import("./pins.js")); ({ createSlackSystemEventTestHarness: buildPinHarness } = await import("./system-event-test-harness.js")); }); + beforeEach(() => { + pinEnqueueMock.mockClear(); + }); + const cases: Array<{ name: string; args: PinCase; expectedCalls: number }> = [ { name: "enqueues DM pin system events when dmPolicy is open", diff --git a/extensions/slack/src/monitor/events/reactions.test.ts b/extensions/slack/src/monitor/events/reactions.test.ts index 1960de9dc13..fa1aadd0908 100644 --- a/extensions/slack/src/monitor/events/reactions.test.ts +++ b/extensions/slack/src/monitor/events/reactions.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const reactionQueueMock = vi.hoisted(() => vi.fn()); let registerSlackReactionEvents: typeof import("./reactions.js").registerSlackReactionEvents; @@ -71,13 +71,16 @@ async function executeReactionCase(input: ReactionRunInput = {}) { } describe("registerSlackReactionEvents", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); - reactionQueueMock.mockClear(); ({ registerSlackReactionEvents } = await import("./reactions.js")); ({ createSlackSystemEventTestHarness } = await import("./system-event-test-harness.js")); }); + beforeEach(() => { + reactionQueueMock.mockClear(); + }); + const cases: Array<{ name: string; input: ReactionRunInput; expectedCalls: number }> = [ { name: "enqueues DM reaction system events when dmPolicy is open", diff --git a/extensions/slack/src/monitor/message-handler.test.ts b/extensions/slack/src/monitor/message-handler.test.ts index 7918446e5c8..d0587cf6ee2 100644 --- a/extensions/slack/src/monitor/message-handler.test.ts +++ b/extensions/slack/src/monitor/message-handler.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const enqueueMock = vi.fn(async (_entry: unknown) => {}); const flushKeyMock = vi.fn(async (_key: string) => {}); @@ -70,12 +70,15 @@ async function handleDirectMessage( } describe("createSlackMessageHandler", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); + ({ createSlackMessageHandler } = await import("./message-handler.js")); + }); + + beforeEach(() => { enqueueMock.mockClear(); flushKeyMock.mockClear(); resolveThreadTsMock.mockClear(); - ({ createSlackMessageHandler } = await import("./message-handler.js")); }); it("does not track invalid non-message events from the message stream", async () => { diff --git a/extensions/slack/src/monitor/replies.test.ts b/extensions/slack/src/monitor/replies.test.ts index 1f511933216..6a6deb1f231 100644 --- a/extensions/slack/src/monitor/replies.test.ts +++ b/extensions/slack/src/monitor/replies.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const sendMock = vi.fn(); vi.mock("../send.js", () => ({ @@ -21,9 +21,12 @@ function baseParams(overrides?: Record) { } describe("deliverReplies identity passthrough", () => { - beforeEach(async () => { + beforeAll(async () => { vi.resetModules(); ({ deliverReplies } = await import("./replies.js")); + }); + + beforeEach(() => { sendMock.mockReset(); }); it("passes identity to sendMessageSlack for text replies", async () => { diff --git a/extensions/slack/src/monitor/slash.test.ts b/extensions/slack/src/monitor/slash.test.ts index fba939345c3..aafe07bc9e9 100644 --- a/extensions/slack/src/monitor/slash.test.ts +++ b/extensions/slack/src/monitor/slash.test.ts @@ -194,8 +194,11 @@ async function loadRegisterSlackMonitorSlashCommands(): Promise { const { dispatchMock } = getSlackSlashMocks(); -beforeEach(async () => { +beforeAll(() => { vi.resetModules(); +}); + +beforeEach(async () => { registerSlackMonitorSlashCommandsPromise = undefined; resetSlackSlashMocks(); });