From e6a9e9a700608998f5f1ebb7144caf88ff3c8b4a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 22 Apr 2026 20:23:30 +0100 Subject: [PATCH] test: cover Telegram webhook timeout reply continuation --- extensions/telegram/src/webhook.test.ts | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/extensions/telegram/src/webhook.test.ts b/extensions/telegram/src/webhook.test.ts index d36d7916530..eeb948e79ab 100644 --- a/extensions/telegram/src/webhook.test.ts +++ b/extensions/telegram/src/webhook.test.ts @@ -537,6 +537,60 @@ describe("startTelegramWebhook", () => { ); }); + it("returns after grammY timeout reply while webhook work continues", async () => { + let finishWork: (() => void) | undefined; + let workFinished = false; + webhookCallbackSpy.mockImplementationOnce( + () => + vi.fn( + async ( + update: unknown, + reply: (json: string) => Promise, + _secretHeader: string | undefined, + _unauthorized: () => Promise, + ) => { + expect(update).toEqual({ update_id: 2, message: { text: "slow" } }); + await reply("{}"); + await new Promise((resolve) => { + finishWork = resolve; + }); + workFinished = true; + }, + ) as unknown as typeof handlerSpy, + ); + + await withStartedWebhook( + { + secret: TELEGRAM_SECRET, + path: TELEGRAM_WEBHOOK_PATH, + }, + async ({ port }) => { + expect(webhookCallbackSpy).toHaveBeenCalledWith( + expect.anything(), + "callback", + expect.objectContaining({ + onTimeout: "return", + timeoutMilliseconds: 5_000, + }), + ); + const response = await postWebhookJson({ + url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), + payload: JSON.stringify({ update_id: 2, message: { text: "slow" } }), + secret: TELEGRAM_SECRET, + timeoutMs: 1_000, + }); + + expect(response.status).toBe(200); + expect(await response.text()).toBe("{}"); + expect(workFinished).toBe(false); + + finishWork?.(); + await sleep(WEBHOOK_TEST_YIELD_MS); + expect(workFinished).toBe(true); + }, + ); + }); + it("rejects unauthenticated requests before reading the request body", async () => { handlerSpy.mockClear(); await withStartedWebhook(