test: tighten Telegram polling conflict coverage (#69873) (thanks @hclsys)

This commit is contained in:
Peter Steinberger
2026-04-22 20:15:36 +01:00
parent 3a11435c7d
commit 67e5cca7a4
3 changed files with 6 additions and 2 deletions

View File

@@ -19,6 +19,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- Telegram/polling: rebuild the polling HTTP transport after `getUpdates` 409 conflicts, so retries use a fresh TCP connection instead of looping on a Telegram-terminated keep-alive socket. (#69873) Thanks @hclsys.
- Slack/files: resolve `downloadFile` bot tokens from the runtime config when callers provide `cfg` without an explicit token or prebuilt client, preserving cfg-only file downloads outside the action runtime path. (#70160) Thanks @martingarramon.
- Slack/HTTP: dispatch registered Request URL webhooks through the same handler registry used by Slack monitor setup, so HTTP-mode Slack events no longer 404 after successful route registration. (#70275) Thanks @FroeMic.
- CLI sessions: persist CLI session clearing through the atomic session-store merge path, so expired Claude/Codex CLI bindings are actually removed before retrying without the stale session id. (#70298) Thanks @HFConsultant.

View File

@@ -844,6 +844,8 @@ describe("monitorTelegramProvider (grammY)", () => {
expect(resolveTelegramTransportSpy).toHaveBeenCalledTimes(2);
expect(createTelegramBotCalls[0]?.telegramTransport).toBe(telegramTransport1);
expect(createTelegramBotCalls[1]?.telegramTransport).toBe(telegramTransport2);
expect(telegramTransport1.close).toHaveBeenCalledTimes(1);
expect(telegramTransport2.close).toHaveBeenCalledTimes(1);
});
it("falls back to configured webhookSecret when not passed explicitly", async () => {

View File

@@ -946,10 +946,11 @@ describe("TelegramPollingSession", () => {
await session.runUntilAbort();
expect(createTelegramTransport).toHaveBeenCalledTimes(1);
expectTelegramBotTransportSequence(transport1, transport2);
// The stale transport is closed by the dirty-rebuild; the new transport
// is closed when dispose() fires on session exit.
expect(transport1.close).toHaveBeenCalled();
expect(transport2.close).toHaveBeenCalled();
expect(transport1.close).toHaveBeenCalledTimes(1);
expect(transport2.close).toHaveBeenCalledTimes(1);
});
it("closes the transport once when runUntilAbort exits normally", async () => {