|
1 | 1 | import { renderHook } from '@testing-library/react'; |
2 | | -import { connectQueryWrapper } from 'test-utils'; |
| 2 | +import { NuqsTestingAdapter } from 'nuqs/adapters/testing'; |
| 3 | +import type { PropsWithChildren } from 'react'; |
3 | 4 |
|
4 | 5 | import usePaginationParams from './use-pagination-params'; |
5 | 6 |
|
| 7 | +const createWrapper = |
| 8 | + (searchParams?: Record<string, string>) => |
| 9 | + ({ children }: PropsWithChildren) => <NuqsTestingAdapter searchParams={searchParams}>{children}</NuqsTestingAdapter>; |
| 10 | + |
6 | 11 | describe('usePaginationParams', () => { |
7 | 12 | test('returns default values when URL parameters are absent', () => { |
8 | | - const { wrapper } = connectQueryWrapper(); |
9 | | - // Assuming a total data length of 100 for testing |
10 | 13 | const totalDataLength = 100; |
11 | | - const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { wrapper }); |
| 14 | + const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { |
| 15 | + wrapper: createWrapper(), |
| 16 | + }); |
12 | 17 | expect(result.current.pageSize).toBe(10); |
13 | 18 | expect(result.current.pageIndex).toBe(0); |
14 | 19 | }); |
15 | 20 |
|
16 | 21 | test('parses pageSize and pageIndex from URL parameters', () => { |
17 | | - const { wrapper } = connectQueryWrapper(); |
18 | 22 | const totalDataLength = 100; |
19 | | - const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { wrapper }); |
20 | | - // Without setting initial URL, defaults apply |
21 | | - expect(result.current.pageSize).toBe(10); |
22 | | - expect(result.current.pageIndex).toBe(0); |
| 23 | + const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { |
| 24 | + wrapper: createWrapper({ pageSize: '20', page: '2' }), |
| 25 | + }); |
| 26 | + expect(result.current.pageSize).toBe(20); |
| 27 | + expect(result.current.pageIndex).toBe(2); |
23 | 28 | }); |
24 | 29 |
|
25 | 30 | test('uses defaultPageSize when pageSize is not in URL', () => { |
26 | | - const { wrapper } = connectQueryWrapper(); |
27 | 31 | const totalDataLength = 150; |
28 | | - const { result } = renderHook(() => usePaginationParams(totalDataLength, 15), { wrapper }); |
| 32 | + const { result } = renderHook(() => usePaginationParams(totalDataLength, 15), { |
| 33 | + wrapper: createWrapper(), |
| 34 | + }); |
29 | 35 | expect(result.current.pageSize).toBe(15); |
30 | 36 | expect(result.current.pageIndex).toBe(0); |
31 | 37 | }); |
32 | 38 |
|
33 | | - test('returns default pageIndex when URL page param would exceed total pages', () => { |
34 | | - const { wrapper } = connectQueryWrapper(); |
| 39 | + test('returns bounded pageIndex when URL page param would exceed total pages', () => { |
35 | 40 | const totalDataLength = 50; // Only 5 pages available with pageSize 10 |
36 | | - const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { wrapper }); |
| 41 | + const { result } = renderHook(() => usePaginationParams(totalDataLength, 10), { |
| 42 | + wrapper: createWrapper({ page: '10' }), // Page 10 exceeds available pages |
| 43 | + }); |
37 | 44 | expect(result.current.pageSize).toBe(10); |
38 | | - expect(result.current.pageIndex).toBe(0); |
| 45 | + expect(result.current.pageIndex).toBe(4); // Bounded to max valid page (5 pages = index 0-4) |
39 | 46 | }); |
40 | 47 | }); |
0 commit comments