fix: paginer entièrement le sitemap et retirer le lien mort /pwopose
This commit is contained in:
@@ -31,10 +31,6 @@ export default async function sitemap() {
|
||||
{
|
||||
url: `${url}/awtis`,
|
||||
priority: 0.6
|
||||
},
|
||||
{
|
||||
url: `${url}/pwopose`,
|
||||
priority: 0.5
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
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)
|
||||
})
|
||||
})
|
||||
+26
-22
@@ -171,32 +171,36 @@ export async function jwennTeks() {
|
||||
return data
|
||||
}
|
||||
|
||||
export async function jwennAwtisSlug() {
|
||||
const query = qs.stringify({
|
||||
sort: ['createdAt:desc'],
|
||||
pagination: {
|
||||
pageSize: 200
|
||||
}
|
||||
}, {
|
||||
encodeValuesOnly: true
|
||||
})
|
||||
async function jwennTouSlug(endpoint) {
|
||||
const pageSize = 200
|
||||
const slugs = []
|
||||
let page = 1
|
||||
let hasMore = true
|
||||
|
||||
const {data} = await request(`/artistes?${query}`, headers)
|
||||
return data.map(({slug}) => slug)
|
||||
while (hasMore) {
|
||||
const query = qs.stringify({
|
||||
sort: ['createdAt:desc'],
|
||||
fields: ['slug'],
|
||||
pagination: {page, pageSize}
|
||||
}, {
|
||||
encodeValuesOnly: true
|
||||
})
|
||||
|
||||
const {data} = await request(`/${endpoint}?${query}`, headers)
|
||||
slugs.push(...data.map(({slug}) => slug))
|
||||
hasMore = data.length === pageSize
|
||||
page += 1
|
||||
}
|
||||
|
||||
return slugs
|
||||
}
|
||||
|
||||
export async function jwennAwtisSlug() {
|
||||
return jwennTouSlug('artistes')
|
||||
}
|
||||
|
||||
export async function jwennTeksSlug() {
|
||||
const query = qs.stringify({
|
||||
sort: ['createdAt:desc'],
|
||||
pagination: {
|
||||
pageSize: 200
|
||||
}
|
||||
}, {
|
||||
encodeValuesOnly: true
|
||||
})
|
||||
|
||||
const {data} = await request(`/paroles?${query}`, headers)
|
||||
return data.map(({slug}) => slug)
|
||||
return jwennTouSlug('paroles')
|
||||
}
|
||||
|
||||
export async function jwennDenyeTeks() {
|
||||
|
||||
Reference in New Issue
Block a user