diff --git a/src/agents/subagent-announce.format.e2e.test.ts b/src/agents/subagent-announce.format.e2e.test.ts index e30b313f49d..be1d287aa3c 100644 --- a/src/agents/subagent-announce.format.e2e.test.ts +++ b/src/agents/subagent-announce.format.e2e.test.ts @@ -118,14 +118,18 @@ vi.mock("./tools/agent-step.js", () => ({ readLatestAssistantReply: readLatestAssistantReplyMock, })); -vi.mock("../config/sessions.js", () => ({ - loadSessionStore: vi.fn(() => loadSessionStoreFixture()), - resolveAgentIdFromSessionKey: () => "main", - resolveStorePath: () => "/tmp/sessions.json", - resolveMainSessionKey: () => "agent:main:main", - readSessionUpdatedAt: vi.fn(() => undefined), - recordSessionMetaFromInbound: vi.fn().mockResolvedValue(undefined), -})); +vi.mock("../config/sessions.js", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + loadSessionStore: vi.fn(() => loadSessionStoreFixture()), + resolveAgentIdFromSessionKey: () => "main", + resolveStorePath: () => "/tmp/sessions.json", + resolveMainSessionKey: () => "agent:main:main", + readSessionUpdatedAt: vi.fn(() => undefined), + recordSessionMetaFromInbound: vi.fn().mockResolvedValue(undefined), + }; +}); vi.mock("./pi-embedded.js", () => embeddedRunMock); diff --git a/src/telegram/bot.media.e2e-harness.ts b/src/telegram/bot.media.e2e-harness.ts index fec64cbdbf0..58628df522b 100644 --- a/src/telegram/bot.media.e2e-harness.ts +++ b/src/telegram/bot.media.e2e-harness.ts @@ -83,11 +83,15 @@ vi.mock("@grammyjs/transformer-throttler", () => ({ vi.mock("../media/store.js", async (importOriginal) => { const actual = await importOriginal(); - return { - ...actual, - saveMediaBuffer: (...args: Parameters) => - saveMediaBufferSpy(...args), - }; + const mockModule = Object.create(null) as Record; + Object.defineProperties(mockModule, Object.getOwnPropertyDescriptors(actual)); + Object.defineProperty(mockModule, "saveMediaBuffer", { + configurable: true, + enumerable: true, + writable: true, + value: (...args: Parameters) => saveMediaBufferSpy(...args), + }); + return mockModule; }); vi.mock("../config/config.js", async (importOriginal) => { diff --git a/src/web/test-helpers.ts b/src/web/test-helpers.ts index b4cbe125f66..3e8964b507d 100644 --- a/src/web/test-helpers.ts +++ b/src/web/test-helpers.ts @@ -64,14 +64,23 @@ vi.mock("../../config/config.js", async (importOriginal) => { }; }); -vi.mock("../media/store.js", () => ({ - saveMediaBuffer: vi.fn().mockImplementation(async (_buf: Buffer, contentType?: string) => ({ - id: "mid", - path: "/tmp/mid", - size: _buf.length, - contentType, - })), -})); +vi.mock("../media/store.js", async (importOriginal) => { + const actual = await importOriginal(); + const mockModule = Object.create(null) as Record; + Object.defineProperties(mockModule, Object.getOwnPropertyDescriptors(actual)); + Object.defineProperty(mockModule, "saveMediaBuffer", { + configurable: true, + enumerable: true, + writable: true, + value: vi.fn().mockImplementation(async (_buf: Buffer, contentType?: string) => ({ + id: "mid", + path: "/tmp/mid", + size: _buf.length, + contentType, + })), + }); + return mockModule; +}); vi.mock("@whiskeysockets/baileys", () => { const created = createMockBaileys(); diff --git a/vitest.e2e.config.ts b/vitest.e2e.config.ts index f21205c1abe..b70d8c8eedb 100644 --- a/vitest.e2e.config.ts +++ b/vitest.e2e.config.ts @@ -21,7 +21,9 @@ export default defineConfig({ ...base, test: { ...baseTest, - pool: "vmForks", + // vmForks reuses VM contexts in ways that can leak module state/mocks across + // files for our e2e harnesses. Use process forks for deterministic isolation. + pool: "forks", maxWorkers: e2eWorkers, silent: !verboseE2E, include: ["test/**/*.e2e.test.ts", "src/**/*.e2e.test.ts"],