Spaces:
Runtime error
Runtime error
| import { test } from 'node:test'; | |
| import assert from 'node:assert/strict'; | |
| import { fetchAllPages } from './fetchAllPages.ts'; | |
| /** Fake page source: holds `total` rows, but never returns more than `serverMax` per call. */ | |
| function fakeSource(total: number, serverMax: number) { | |
| const calls: Array<{ limit: number; offset: number }> = []; | |
| const fetchPage = async (limit: number, offset: number) => { | |
| calls.push({ limit, offset }); | |
| const take = Math.min(limit, serverMax); | |
| const data = Array.from({ length: Math.max(0, Math.min(take, total - offset)) }, (_, i) => offset + i); | |
| return { data, total }; | |
| }; | |
| return { fetchPage, calls }; | |
| } | |
| test('walks every page when the server clamps below the requested size', async () => { | |
| // The shipped bug: requesting 500 against a server that clamps to 200 stopped after one page. | |
| const { fetchPage, calls } = fakeSource(650, 200); | |
| const rows = await fetchAllPages(fetchPage, { pageSize: 500 }); | |
| assert.equal(rows.length, 650); | |
| assert.deepEqual(rows.slice(0, 3), [0, 1, 2]); | |
| assert.equal(calls.length, 4); | |
| }); | |
| test('stops once total is reached without an extra empty request', async () => { | |
| const { fetchPage, calls } = fakeSource(400, 200); | |
| const rows = await fetchAllPages(fetchPage, { pageSize: 200 }); | |
| assert.equal(rows.length, 400); | |
| assert.equal(calls.length, 2); | |
| }); | |
| test('stops on an empty page even if total over-reports', async () => { | |
| // Guards the infinite loop: a stale/wrong `total` must not keep the loop spinning. | |
| const { fetchPage, calls } = fakeSource(50, 200); | |
| const rows = await fetchAllPages(async (limit, offset) => { | |
| const page = await fetchPage(limit, offset); | |
| return { data: page.data, total: 9999 }; | |
| }); | |
| assert.equal(rows.length, 50); | |
| assert.equal(calls.length, 2); | |
| }); | |
| test('honours the safety cap', async () => { | |
| const { fetchPage } = fakeSource(10_000, 200); | |
| const rows = await fetchAllPages(fetchPage, { pageSize: 200, maxItems: 500 }); | |
| assert.equal(rows.length, 600); // stops at the first page that crosses the cap | |
| }); | |
| test('returns an empty list when there is nothing to export', async () => { | |
| const { fetchPage, calls } = fakeSource(0, 200); | |
| const rows = await fetchAllPages(fetchPage); | |
| assert.deepEqual(rows, []); | |
| assert.equal(calls.length, 1); | |
| }); | |