diff --git a/src/telegram/monitor.test.ts b/src/telegram/monitor.test.ts index 0b28734f835..83b39fa5c78 100644 --- a/src/telegram/monitor.test.ts +++ b/src/telegram/monitor.test.ts @@ -129,6 +129,46 @@ function mockRunOnceAndAbort(abort: AbortController) { runSpy.mockImplementationOnce(() => makeAbortRunner(abort)); } +async function expectOffsetConfirmationSkipped(offset: number | null) { + readTelegramUpdateOffsetSpy.mockResolvedValueOnce(offset); + const abort = new AbortController(); + api.getUpdates.mockReset(); + api.deleteWebhook.mockReset(); + api.deleteWebhook.mockResolvedValueOnce(true); + mockRunOnceAndAbort(abort); + + await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); + + expect(api.getUpdates).not.toHaveBeenCalled(); +} + +async function runMonitorAndCaptureStartupOrder(params?: { persistedOffset?: number | null }) { + if (params && "persistedOffset" in params) { + readTelegramUpdateOffsetSpy.mockResolvedValueOnce(params.persistedOffset ?? null); + } + const abort = new AbortController(); + const order: string[] = []; + api.getUpdates.mockReset(); + api.deleteWebhook.mockReset(); + api.deleteWebhook.mockImplementationOnce(async () => { + order.push("deleteWebhook"); + return true; + }); + if (typeof params?.persistedOffset === "number") { + api.getUpdates.mockImplementationOnce(async () => { + order.push("getUpdates"); + return []; + }); + } + runSpy.mockImplementationOnce(() => { + order.push("run"); + return makeAbortRunner(abort); + }); + + await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); + return { order }; +} + function mockRunOnceWithStalledPollingRunner(): { stop: ReturnType void | Promise>>; } { @@ -349,19 +389,7 @@ describe("monitorTelegramProvider (grammY)", () => { }); it("deletes webhook before starting polling", async () => { - const abort = new AbortController(); - const order: string[] = []; - api.deleteWebhook.mockReset(); - api.deleteWebhook.mockImplementationOnce(async () => { - order.push("deleteWebhook"); - return true; - }); - runSpy.mockImplementationOnce(() => { - order.push("run"); - return makeAbortRunner(abort); - }); - - await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); + const { order } = await runMonitorAndCaptureStartupOrder(); expect(api.deleteWebhook).toHaveBeenCalledWith({ drop_pending_updates: false }); expect(order).toEqual(["deleteWebhook", "run"]); @@ -577,67 +605,24 @@ describe("monitorTelegramProvider (grammY)", () => { }); it("confirms persisted offset with Telegram before starting runner", async () => { - readTelegramUpdateOffsetSpy.mockResolvedValueOnce(549076203); - const abort = new AbortController(); - const order: string[] = []; - api.getUpdates.mockReset(); - api.getUpdates.mockImplementationOnce(async () => { - order.push("getUpdates"); - return []; + const { order } = await runMonitorAndCaptureStartupOrder({ + persistedOffset: 549076203, }); - api.deleteWebhook.mockReset(); - api.deleteWebhook.mockImplementationOnce(async () => { - order.push("deleteWebhook"); - return true; - }); - runSpy.mockImplementationOnce(() => { - order.push("run"); - return makeAbortRunner(abort); - }); - - await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); expect(api.getUpdates).toHaveBeenCalledWith({ offset: 549076204, limit: 1, timeout: 0 }); expect(order).toEqual(["deleteWebhook", "getUpdates", "run"]); }); it("skips offset confirmation when no persisted offset exists", async () => { - readTelegramUpdateOffsetSpy.mockResolvedValueOnce(null); - const abort = new AbortController(); - api.getUpdates.mockReset(); - api.deleteWebhook.mockReset(); - api.deleteWebhook.mockResolvedValueOnce(true); - mockRunOnceAndAbort(abort); - - await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); - - expect(api.getUpdates).not.toHaveBeenCalled(); + await expectOffsetConfirmationSkipped(null); }); it("skips offset confirmation when persisted offset is invalid", async () => { - readTelegramUpdateOffsetSpy.mockResolvedValueOnce(-1 as number); - const abort = new AbortController(); - api.getUpdates.mockReset(); - api.deleteWebhook.mockReset(); - api.deleteWebhook.mockResolvedValueOnce(true); - mockRunOnceAndAbort(abort); - - await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); - - expect(api.getUpdates).not.toHaveBeenCalled(); + await expectOffsetConfirmationSkipped(-1); }); it("skips offset confirmation when persisted offset cannot be safely incremented", async () => { - readTelegramUpdateOffsetSpy.mockResolvedValueOnce(Number.MAX_SAFE_INTEGER); - const abort = new AbortController(); - api.getUpdates.mockReset(); - api.deleteWebhook.mockReset(); - api.deleteWebhook.mockResolvedValueOnce(true); - mockRunOnceAndAbort(abort); - - await monitorTelegramProvider({ token: "tok", abortSignal: abort.signal }); - - expect(api.getUpdates).not.toHaveBeenCalled(); + await expectOffsetConfirmationSkipped(Number.MAX_SAFE_INTEGER); }); it("resets webhookCleared latch on 409 conflict so deleteWebhook re-runs", async () => {