test: speed up slack extension suites

This commit is contained in:
Peter Steinberger
2026-03-24 15:13:57 +00:00
parent 88f49c27a0
commit db4572b459
10 changed files with 55 additions and 30 deletions

View File

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

View File

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

View File

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

View File

@@ -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<void> {
}
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",

View File

@@ -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<string, unknown>;
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<void> {
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",

View File

@@ -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<void> {
}
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",

View File

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

View File

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

View File

@@ -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<string, unknown>) {
}
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 () => {

View File

@@ -194,8 +194,11 @@ async function loadRegisterSlackMonitorSlashCommands(): Promise<RegisterFn> {
const { dispatchMock } = getSlackSlashMocks();
beforeEach(async () => {
beforeAll(() => {
vi.resetModules();
});
beforeEach(async () => {
registerSlackMonitorSlashCommandsPromise = undefined;
resetSlackSlashMocks();
});