feat(media): pagination

This commit is contained in:
Florian Sylvain committed 2026-10-13 19:54:59 +02:00
1 parent 04dc151ed7
commit 63c1e7076e
65 files changed
+2960 -365

No files matched your search

+76 -9
View File
@@ -1,5 +1,19 @@
import { describe, expect, it } from 'vitest'
import { DEFAULT_CONTROLS, parseMediaControls, toRequestQuery, toRouteQuery } from '../mediaQuery'
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import {
DEFAULT_CONTROLS,
parseMediaControls,
toHashRequestQuery,
toRequestQuery,
toRouteQuery,
} from '../mediaQuery'
beforeEach(() => {
localStorage.clear()
})
afterEach(() => {
localStorage.clear()
})
describe('parseMediaControls', () => {
it('uses the defaults for an empty query', () => {
@@ -21,6 +35,34 @@ describe('parseMediaControls', () => {
expect(parseMediaControls(query)).toEqual({ ...DEFAULT_CONTROLS, ...expected })
})
it.each([
[{ page: '7' }, { page: 7 }],
[{ size: '50' }, { size: 50 }],
[
{ page: '3', size: '5' },
{ page: 3, size: 5 },
],
[{ page: '0' }, {}],
[{ page: '-2' }, {}],
[{ page: '1.5' }, {}],
[{ page: 'abc' }, {}],
[{ size: '10' }, {}],
[{ size: '0' }, {}],
[{ size: '200' }, {}],
[{ size: '' }, {}],
])('maps the paging of %j', (query, expected) => {
expect(parseMediaControls(query)).toEqual({ ...DEFAULT_CONTROLS, ...expected })
})
it('uses the stored size only when the URL has no size', () => {
localStorage.setItem('renewcms-page-size-media', '5')
expect(parseMediaControls({}).size).toBe(5)
expect(parseMediaControls({ size: '100' }).size).toBe(100)
expect(parseMediaControls({ size: '10' }).size).toBe(25)
expect(parseMediaControls({}, false).size).toBe(25)
})
it('takes the first value of a repeated parameter and trims the search', () => {
expect(parseMediaControls({ q: [' wall ', 'x'] }).q).toBe('wall')
})
@@ -33,20 +75,45 @@ describe('toRouteQuery', () => {
it('keeps only the non-default values', () => {
expect(
toRouteQuery({ q: 'wall', filter: 'unused', sort: 'largest', view: 'list' }),
toRouteQuery({
...DEFAULT_CONTROLS,
q: 'wall',
filter: 'unused',
sort: 'largest',
view: 'list',
}),
).toEqual({ q: 'wall', filter: 'unused', sort: 'largest', view: 'list' })
})
it('keeps the page and the size when they are not the defaults', () => {
expect(toRouteQuery({ ...DEFAULT_CONTROLS, page: 7, size: 50 })).toEqual({
page: '7',
size: '50',
})
})
it('drops the page and the size on the Duplicates tab', () => {
expect(
toRouteQuery({ ...DEFAULT_CONTROLS, filter: 'duplicates', page: 4, size: 5 }),
).toEqual({ filter: 'duplicates' })
})
})
describe('toRequestQuery', () => {
it.each([
[{}, 'filter=all&sort=newest&limit=100'],
[{ filter: 'unused' }, 'filter=unused&sort=newest&limit=100'],
[{ filter: 'duplicates' }, 'filter=duplicates&sort=newest&limit=100'],
[{ sort: 'largest' }, 'filter=all&sort=largest&limit=100'],
[{ q: 'wall' }, 'q=wall&filter=all&sort=newest&limit=100'],
[{ q: 'a b&c', filter: 'unused' }, 'q=a%20b%26c&filter=unused&sort=newest&limit=100'],
[{}, 'filter=all&sort=newest&page=1&size=25'],
[{ filter: 'unused' }, 'filter=unused&sort=newest&page=1&size=25'],
[{ filter: 'duplicates' }, 'filter=duplicates&sort=newest&page=1&size=25'],
[{ sort: 'largest' }, 'filter=all&sort=largest&page=1&size=25'],
[{ q: 'wall' }, 'q=wall&filter=all&sort=newest&page=1&size=25'],
[{ q: 'a b&c', filter: 'unused' }, 'q=a%20b%26c&filter=unused&sort=newest&page=1&size=25'],
])('builds the request for %j', (overrides, expected) => {
expect(toRequestQuery({ ...DEFAULT_CONTROLS, ...overrides })).toBe(expected)
})
})
describe('toHashRequestQuery', () => {
it('asks for every copy in one page', () => {
expect(toHashRequestQuery('abc')).toBe('hash=abc&page=1&size=100')
})
})