| 1 | // Echte paginering (shaer-sk4).
|
|---|
| 2 | //
|
|---|
| 3 | // Robin zag dat elke ?page= dezelfde inhoud gaf. Dat klopte: pagedCollection
|
|---|
| 4 | // veranderde alleen de VORM en sneed nooit, first en last wezen allebei naar
|
|---|
| 5 | // pagina 1, en pagina 99 noemde zichzelf pagina 1.
|
|---|
| 6 | //
|
|---|
| 7 | // De WORTEL houdt zijn items inline, en dat is de hele reden dat dit veilig is:
|
|---|
| 8 | // Shaer leest een document en volgt `next` niet. Werd de wortel nu leeg, dan
|
|---|
| 9 | // kreeg elke draaiende app nul items en geen foutmelding.
|
|---|
| 10 | import { test } from 'node:test';
|
|---|
| 11 | import assert from 'node:assert/strict';
|
|---|
| 12 |
|
|---|
| 13 | process.env.DATABASE_PATH = ':memory:';
|
|---|
| 14 | process.env.PUBLIC_BASE_URL = 'https://ons.test';
|
|---|
| 15 |
|
|---|
| 16 | const { pagedCollection, PAGINA_GROOTTE } = await import('../src/services/ap-core.js');
|
|---|
| 17 |
|
|---|
| 18 | const ID = 'https://ons.test/ap/users/dev/followers';
|
|---|
| 19 | const vijftig = Array.from({ length: 50 }, (_, i) => `https://elders.test/u/${i}`);
|
|---|
| 20 |
|
|---|
| 21 | test('de wortel draagt ALLES inline, en wijst naar echte grenzen', () => {
|
|---|
| 22 | const c = pagedCollection(ID, vijftig);
|
|---|
| 23 | assert.equal(c.type, 'OrderedCollection');
|
|---|
| 24 | assert.equal(c.orderedItems.length, 50, 'inline, want de app volgt next niet');
|
|---|
| 25 | assert.equal(c.first, `${ID}?page=1`);
|
|---|
| 26 | assert.equal(c.last, `${ID}?page=3`, '50 items bij 20 per pagina is drie paginas');
|
|---|
| 27 | });
|
|---|
| 28 |
|
|---|
| 29 | test('pagina 1 snijdt echt, en biedt een next', () => {
|
|---|
| 30 | const p = pagedCollection(ID, vijftig, { page: 1 });
|
|---|
| 31 | assert.equal(p.type, 'OrderedCollectionPage');
|
|---|
| 32 | assert.equal(p.id, `${ID}?page=1`);
|
|---|
| 33 | assert.equal(p.partOf, ID);
|
|---|
| 34 | assert.equal(p.orderedItems.length, PAGINA_GROOTTE);
|
|---|
| 35 | assert.equal(p.orderedItems[0], vijftig[0]);
|
|---|
| 36 | assert.equal(p.next, `${ID}?page=2`);
|
|---|
| 37 | assert.equal(p.prev, undefined, 'de eerste heeft geen vorige');
|
|---|
| 38 | });
|
|---|
| 39 |
|
|---|
| 40 | test('pagina 2 geeft ANDERE items dan pagina 1 -- dat was de klacht', () => {
|
|---|
| 41 | const een = pagedCollection(ID, vijftig, { page: 1 }).orderedItems;
|
|---|
| 42 | const twee = pagedCollection(ID, vijftig, { page: 2 }).orderedItems;
|
|---|
| 43 | assert.notDeepEqual(een, twee);
|
|---|
| 44 | assert.equal(twee[0], vijftig[20]);
|
|---|
| 45 | assert.equal(pagedCollection(ID, vijftig, { page: 2 }).prev, `${ID}?page=1`);
|
|---|
| 46 | });
|
|---|
| 47 |
|
|---|
| 48 | test('de laatste pagina heeft de rest en GEEN next', () => {
|
|---|
| 49 | const p = pagedCollection(ID, vijftig, { page: 3 });
|
|---|
| 50 | assert.equal(p.orderedItems.length, 10);
|
|---|
| 51 | assert.equal(p.next, undefined);
|
|---|
| 52 | assert.equal(p.prev, `${ID}?page=2`);
|
|---|
| 53 | });
|
|---|
| 54 |
|
|---|
| 55 | test('een pagina voorbij het einde is leeg en zegt dat ook', () => {
|
|---|
| 56 | // Hem naar de laatste terugbuigen zou opnieuw een antwoord zijn dat over
|
|---|
| 57 | // zichzelf liegt -- precies wat er mis was.
|
|---|
| 58 | const p = pagedCollection(ID, vijftig, { page: 99 });
|
|---|
| 59 | assert.equal(p.id, `${ID}?page=99`, 'en niet ?page=1');
|
|---|
| 60 | assert.equal(p.orderedItems.length, 0);
|
|---|
| 61 | assert.equal(p.next, undefined);
|
|---|
| 62 | });
|
|---|
| 63 |
|
|---|
| 64 | test('een lege collectie heeft een pagina, geen nul', () => {
|
|---|
| 65 | const c = pagedCollection(ID, []);
|
|---|
| 66 | assert.equal(c.first, `${ID}?page=1`);
|
|---|
| 67 | assert.equal(c.last, `${ID}?page=1`);
|
|---|
| 68 | });
|
|---|
| 69 |
|
|---|
| 70 | test('totalItems telt het GEHEEL, ook op een pagina', () => {
|
|---|
| 71 | // De count-only vorm voor het publiek geeft een telling zonder items; die
|
|---|
| 72 | // mag een pagina niet stilletjes tot nul maken.
|
|---|
| 73 | const p = pagedCollection(ID, vijftig, { page: 2, totalItems: 12345 });
|
|---|
| 74 | assert.equal(p.totalItems, 12345);
|
|---|
| 75 | });
|
|---|