forked from Lilly-Protocol/lily-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpagination-helper.test.ts
More file actions
102 lines (89 loc) · 3.26 KB
/
Copy pathpagination-helper.test.ts
File metadata and controls
102 lines (89 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { describe, it, expect, vi } from 'vitest';
import {
parseCursorPage,
buildPaginationQuery,
paginate,
} from '../src/pagination';
describe('pagination helper (issue #61)', () => {
describe('parseCursorPage', () => {
it('returns items and cursor when provided', () => {
const page = parseCursorPage([1, 2, 3], 'abc123');
expect(page.items).toEqual([1, 2, 3]);
expect(page.nextCursor).toBe('abc123');
expect(page.hasMore).toBe(true);
});
it('sets hasMore to false when cursor is null', () => {
const page = parseCursorPage([1, 2], null);
expect(page.hasMore).toBe(false);
expect(page.nextCursor).toBeNull();
});
it('sets hasMore to false when cursor is empty string', () => {
const page = parseCursorPage([1], '');
expect(page.hasMore).toBe(false);
});
it('handles undefined cursor', () => {
const page = parseCursorPage([1, 2, 3], undefined);
expect(page.nextCursor).toBeNull();
expect(page.hasMore).toBe(false);
});
it('returns empty items array when given empty', () => {
const page = parseCursorPage([], 'cursor');
expect(page.items).toEqual([]);
expect(page.hasMore).toBe(true);
});
});
describe('buildPaginationQuery', () => {
it('returns empty object when cursor is null', () => {
expect(buildPaginationQuery(null)).toEqual({});
});
it('returns empty object when cursor is empty', () => {
expect(buildPaginationQuery('')).toEqual({});
});
it('returns empty object when cursor is undefined', () => {
expect(buildPaginationQuery(undefined)).toEqual({});
});
it('returns cursor in query when provided', () => {
expect(buildPaginationQuery('abc123')).toEqual({ cursor: 'abc123' });
});
});
describe('paginate', () => {
it('yields all items from a single page', async () => {
const fetchPage = vi.fn().mockResolvedValue([1, 2, 3]);
const results: number[] = [];
for await (const item of paginate(fetchPage)) {
results.push(item);
}
expect(results).toEqual([1, 2, 3]);
expect(fetchPage).toHaveBeenCalledTimes(1);
});
it('stops at maxPages when limit is set', async () => {
const fetchPage = vi.fn().mockResolvedValue([1, 2]);
const results: number[] = [];
for await (const item of paginate(fetchPage, { limit: 2, maxPages: 3 })) {
results.push(item);
}
expect(results.length).toBe(6); // 3 pages * 2 items
expect(fetchPage).toHaveBeenCalledTimes(3);
});
it('stops when page returns fewer items than limit', async () => {
const fetchPage = vi.fn()
.mockResolvedValueOnce([1, 2])
.mockResolvedValueOnce([3]);
const results: number[] = [];
for await (const item of paginate(fetchPage, { limit: 2 })) {
results.push(item);
}
expect(results).toEqual([1, 2, 3]);
expect(fetchPage).toHaveBeenCalledTimes(2);
});
it('stops on empty page', async () => {
const fetchPage = vi.fn().mockResolvedValue([]);
const results: number[] = [];
for await (const item of paginate(fetchPage, { limit: 10 })) {
results.push(item);
}
expect(results).toEqual([]);
expect(fetchPage).toHaveBeenCalledTimes(1);
});
});
});