From 08b5ba1a1261ea3212d30efafae1d3ce7fa56b60 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 23 Mar 2026 12:12:31 +0000 Subject: [PATCH] test: reset line webhook mocks between cases --- extensions/line/src/bot-handlers.test.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/extensions/line/src/bot-handlers.test.ts b/extensions/line/src/bot-handlers.test.ts index 5e1612f0f05..dd10b273ac4 100644 --- a/extensions/line/src/bot-handlers.test.ts +++ b/extensions/line/src/bot-handlers.test.ts @@ -74,6 +74,16 @@ type LineWebhookContext = Parameters ({ log: vi.fn(), error: vi.fn(), exit: vi.fn() }); +function buildDefaultLineMessageContext() { + return { + ctxPayload: { From: "line:group:group-1" }, + replyToken: "reply-token", + route: { agentId: "default" }, + isGroup: true, + accountId: "default", + }; +} + function createReplayMessageEvent(params: { messageId: string; groupId: string; @@ -200,14 +210,15 @@ async function startInflightReplayDuplicate(params: { describe("handleLineWebhookEvents", () => { beforeAll(async () => { + vi.resetModules(); ({ handleLineWebhookEvents, createLineWebhookReplayCache } = await import("./bot-handlers.js")); }); beforeEach(() => { - buildLineMessageContextMock.mockClear(); - buildLinePostbackContextMock.mockClear(); - readAllowFromStoreMock.mockClear(); - upsertPairingRequestMock.mockClear(); + buildLineMessageContextMock.mockReset().mockResolvedValue(buildDefaultLineMessageContext()); + buildLinePostbackContextMock.mockReset().mockResolvedValue(null as unknown); + readAllowFromStoreMock.mockReset().mockResolvedValue([]); + upsertPairingRequestMock.mockReset().mockResolvedValue({ code: "CODE", created: true }); }); it("blocks group messages when groupPolicy is disabled", async () => { @@ -573,10 +584,11 @@ describe("handleLineWebhookEvents", () => { isRedelivery: true, }); const { firstRun, secondRun } = await startInflightReplayDuplicate({ event, processMessage }); + const firstFailure = expect(firstRun).rejects.toThrow("transient inflight failure"); + const secondFailure = expect(secondRun).rejects.toThrow("transient inflight failure"); rejectFirst?.(new Error("transient inflight failure")); - await expect(firstRun).rejects.toThrow("transient inflight failure"); - await expect(secondRun).rejects.toThrow("transient inflight failure"); + await Promise.all([firstFailure, secondFailure]); expect(processMessage).toHaveBeenCalledTimes(1); });