From 41194dadb96ddd18378faa37494369da76b3d690 Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Mon, 24 Aug 2026 16:23:48 -0700 Subject: [PATCH] test(qa): prove Slack pagination request budget --- .../slack/slack-live.runtime.test.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts index f95eb664596c..6e70c0bd4163 100644 --- a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts +++ b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.test.ts @@ -28,6 +28,7 @@ import { buildSlackApprovalCheckpointMessage, collectSlackActionValues, extractSlackNativeApprovalId, + listSlackMessages, runSlackTableInvalidBlocksFallbackScenario, } from "./slack-live.observations.js"; import * as slackScenarioImplementations from "./slack-live.scenario-implementations.js"; @@ -107,6 +108,32 @@ describe("Slack live QA runtime helpers", () => { expect(testing.resolveSlackRateLimitDelayMs(new Error("network failed"))).toBeUndefined(); }); + it("bounds paginated history work and surfaces Slack rate limits for poller backoff", async () => { + const history = vi + .fn() + .mockResolvedValueOnce({ messages: [], response_metadata: { next_cursor: "page-2" } }) + .mockResolvedValueOnce({ messages: [], response_metadata: { next_cursor: "page-3" } }) + .mockRejectedValueOnce({ retryAfter: 10 }); + + await expect( + listSlackMessages({ + channelId: "C123456789", + client: { conversations: { history } } as never, + oldestTs: "1.000000", + }), + ).rejects.toEqual({ retryAfter: 10 }); + expect(history).toHaveBeenCalledTimes(3); + + history.mockReset(); + history.mockResolvedValue({ messages: [], response_metadata: { next_cursor: "more" } }); + await listSlackMessages({ + channelId: "C123456789", + client: { conversations: { history } } as never, + oldestTs: "1.000000", + }); + expect(history).toHaveBeenCalledTimes(5); + }); + beforeEach(() => { vi.useRealTimers(); });