59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
import {describe, it, expect, vi, afterEach} from 'vitest'
|
|
import {jwennTeksSlug} from '../oki-api'
|
|
|
|
function fakeEntry(i) {
|
|
return {slug: `slug-${i}`}
|
|
}
|
|
|
|
describe('jwennTeksSlug (full pagination)', () => {
|
|
const originalFetch = global.fetch
|
|
|
|
afterEach(() => {
|
|
global.fetch = originalFetch
|
|
vi.restoreAllMocks()
|
|
})
|
|
|
|
it('walks every page instead of stopping at the first pageSize chunk', async () => {
|
|
const pageSize = 200
|
|
const totalRecords = 250
|
|
|
|
let calls = 0
|
|
global.fetch = vi.fn(async url => {
|
|
calls++
|
|
if (calls > 5) {
|
|
throw new Error('too many pagination calls, likely an infinite loop')
|
|
}
|
|
|
|
const pageMatch = url.match(/pagination\[page]=(\d+)/)
|
|
const page = pageMatch ? Number(pageMatch[1]) : 1
|
|
const start = (page - 1) * pageSize
|
|
const end = Math.min(start + pageSize, totalRecords)
|
|
const data = Array.from({length: Math.max(end - start, 0)}, (_, i) => fakeEntry(start + i))
|
|
|
|
return {
|
|
ok: true,
|
|
json: async () => ({data})
|
|
}
|
|
})
|
|
|
|
const slugs = await jwennTeksSlug()
|
|
|
|
expect(slugs).toHaveLength(totalRecords)
|
|
expect(slugs[0]).toBe('slug-0')
|
|
expect(slugs.at(-1)).toBe('slug-249')
|
|
expect(global.fetch).toHaveBeenCalledTimes(2)
|
|
})
|
|
|
|
it('stops after a single page when there are fewer records than pageSize', async () => {
|
|
global.fetch = vi.fn(async () => ({
|
|
ok: true,
|
|
json: async () => ({data: [fakeEntry(1), fakeEntry(2)]})
|
|
}))
|
|
|
|
const slugs = await jwennTeksSlug()
|
|
|
|
expect(slugs).toEqual(['slug-1', 'slug-2'])
|
|
expect(global.fetch).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|