import { describe, expect, it } from "vitest"; import { calcPagination, PER_PAGE_OPTIONS, parseListParams, } from "./admin-helpers"; describe("parseListParams", () => { it("parses defaults", () => { const p = parseListParams(new URLSearchParams()); expect(p).toEqual({ search: "", perPage: 20, page: 1, sort: undefined, order: "desc", }); }); it("parses explicit values", () => { const p = parseListParams( new URLSearchParams("search=sofa&perPage=50&page=3&sort=name&order=asc"), ); expect(p.search).toBe("sofa"); expect(p.perPage).toBe(50); expect(p.page).toBe(3); expect(p.sort).toBe("name"); expect(p.order).toBe("asc"); }); it("clamps perPage to [1, 100]", () => { expect(parseListParams(new URLSearchParams("perPage=0")).perPage).toBe(1); expect(parseListParams(new URLSearchParams("perPage=1000")).perPage).toBe( 100, ); }); it("clamps page to >= 1", () => { expect(parseListParams(new URLSearchParams("page=0")).page).toBe(1); expect(parseListParams(new URLSearchParams("page=-5")).page).toBe(1); }); it("defaults order to desc when not asc", () => { expect(parseListParams(new URLSearchParams("order=asc")).order).toBe("asc"); expect(parseListParams(new URLSearchParams("order=desc")).order).toBe( "desc", ); expect(parseListParams(new URLSearchParams("order=bogus")).order).toBe( "desc", ); }); }); describe("calcPagination", () => { it("computes last page, offset and clamps the page", () => { const p = calcPagination(50, 3, 20); expect(p.lastPage).toBe(3); expect(p.page).toBe(3); expect(p.offset).toBe(40); }); it("clamps page beyond last page", () => { const p = calcPagination(10, 99, 20); expect(p.lastPage).toBe(1); expect(p.page).toBe(1); expect(p.offset).toBe(0); }); it("handles zero total with lastPage 1", () => { const p = calcPagination(0, 1, 20); expect(p.lastPage).toBe(1); expect(p.offset).toBe(0); }); }); describe("PER_PAGE_OPTIONS", () => { it("exposes the selectable page sizes", () => { expect(PER_PAGE_OPTIONS).toEqual([10, 20, 50]); }); });