[ { "name": "first page of seven items, three at a time", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 1, 3], "expect": { "items": [{ "id": 1 }, { "id": 2 }, { "id": 3 }], "page": 1, "perPage": 3, "total": 7, "totalPages": 3, "hasNext": true, "hasPrev": false } }, { "name": "a middle page has a page either side of it", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 2, 3], "expect": { "items": [{ "id": 4 }, { "id": 5 }, { "id": 6 }], "page": 2, "perPage": 3, "total": 7, "totalPages": 3, "hasNext": true, "hasPrev": true } }, { "name": "the last page is short and has no next", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 3, 3], "expect": { "items": [{ "id": 7 }], "page": 3, "perPage": 3, "total": 7, "totalPages": 3, "hasNext": false, "hasPrev": true } }, { "name": "a page past the end is empty, not an error, and still reports the real totals", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 9, 3], "expect": { "items": [], "page": 9, "perPage": 3, "total": 7, "totalPages": 3, "hasNext": false, "hasPrev": true } }, { "name": "the page immediately after the last one is empty", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 4, 3], "expect": { "items": [], "page": 4, "perPage": 3, "total": 7, "totalPages": 3, "hasNext": false, "hasPrev": true } }, { "name": "a page size that divides exactly leaves no short page", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }], 2, 3], "expect": { "items": [{ "id": 4 }, { "id": 5 }, { "id": 6 }], "page": 2, "perPage": 3, "total": 6, "totalPages": 2, "hasNext": false, "hasPrev": true } }, { "name": "one item per page makes as many pages as there are items", "args": [[{ "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 }, { "id": 6 }, { "id": 7 }], 4, 1], "expect": { "items": [{ "id": 4 }], "page": 4, "perPage": 1, "total": 7, "totalPages": 7, "hasNext": true, "hasPrev": true } }, { "name": "a single item is a single full page with nothing either side", "args": [[{ "id": 1, "name": "only" }], 1, 10], "expect": { "items": [{ "id": 1, "name": "only" }], "page": 1, "perPage": 10, "total": 1, "totalPages": 1, "hasNext": false, "hasPrev": false } }, { "name": "an empty collection is zero pages, not one empty page", "args": [[], 1, 10], "expect": { "items": [], "page": 1, "perPage": 10, "total": 0, "totalPages": 0, "hasNext": false, "hasPrev": false } }, { "name": "page two of an empty collection still says there is something behind it", "args": [[], 2, 10], "expect": { "items": [], "page": 2, "perPage": 10, "total": 0, "totalPages": 0, "hasNext": false, "hasPrev": true } }, { "name": "a page size bigger than the collection returns all of it", "args": [[{ "id": 1 }, { "id": 2 }], 1, 50], "expect": { "items": [{ "id": 1 }, { "id": 2 }], "page": 1, "perPage": 50, "total": 2, "totalPages": 1, "hasNext": false, "hasPrev": false } }, { "name": "records are passed through untouched, however uneven their shapes", "args": [[{ "id": 1, "name": "alpha" }, { "id": 2, "tags": ["x", "y"] }, { "id": 3, "meta": { "ok": true } }], 1, 2], "expect": { "items": [{ "id": 1, "name": "alpha" }, { "id": 2, "tags": ["x", "y"] }], "page": 1, "perPage": 2, "total": 3, "totalPages": 2, "hasNext": true, "hasPrev": false } }, { "name": "a page size of zero is an error, never the whole collection", "args": [[{ "id": 1 }], 1, 0], "expectError": "must be at least 1" }, { "name": "a negative page size is an error", "args": [[{ "id": 1 }], 1, -5], "expectError": "must be at least 1" }, { "name": "page zero is a caller bug because pages are 1-based", "args": [[{ "id": 1 }], 0, 10], "expectError": "page must be 1 or greater" }, { "name": "a negative page is a caller bug", "args": [[{ "id": 1 }], -2, 10], "expectError": "page must be 1 or greater" }, { "name": "a fractional page number is a caller bug", "args": [[{ "id": 1 }], 1.5, 10], "expectError": "page must be a whole number" }, { "name": "a fractional page size is a caller bug", "args": [[{ "id": 1 }], 1, 2.5], "expectError": "must be a whole number" } ]