import { describe, expect, it } from "vitest";
import {
createOffsetPager,
discoveredPageCount,
pageCount,
pageRows
} from "#lib/components/profile/pagination.svelte.ts";
describe("profile pagination counts", () => {
it("uses the known total for profile lists", () => {
expect(pageCount(4, 30)).toBe(1);
expect(pageCount(30, 30)).toBe(1);
expect(pageCount(31, 30)).toBe(2);
});
it("only discovers an extra page when totals are unavailable", () => {
expect(discoveredPageCount(1, false)).toBe(1);
expect(discoveredPageCount(1, true)).toBe(2);
expect(discoveredPageCount(2, true)).toBe(3);
});
it("sizes a page's skeleton to the items it will hold", () => {
expect(pageRows(1, 30, 100)).toBe(30);
expect(pageRows(4, 30, 100)).toBe(10);
expect(pageRows(4, 30, 90)).toBe(1);
expect(pageRows(4, 30)).toBe(30);
});
it("jumps to a page in one fetch", async () => {
const requested: number[] = [];
const pager = createOffsetPager({ page: 1, items: ["first"] }, 30, async (offset) => {
requested.push(offset);
return [`page at ${offset}`];
});
await pager.select(40);
expect(requested).toEqual([1170]);
expect(pager.items).toEqual(["page at 1170"]);
expect(pager.state).toEqual({ kind: "at-page", page: 40 });
await pager.select(40);
await pager.select(1);
expect(requested).toEqual([1170]);
expect(pager.items).toEqual(["first"]);
});
it("keeps pager lifecycle in one state", async () => {
let release!: (items: string[]) => void;
const pager = createOffsetPager(
{ page: 1, items: ["first"] },
30,
() => new Promise<string[]>((resolve) => (release = resolve))
);
const loading = pager.select(2);
// while loading, state points to the incoming page, not the page left behind
expect(pager.state).toEqual({ kind: "loading", page: 2 });
expect(pager.items).toEqual([]);
expect(pager.hasNext).toBe(true);
release(["second"]);
await loading;
expect(pager.state).toEqual({ kind: "at-page", page: 2 });
const failing = createOffsetPager({ page: 1, items: ["first"] }, 30, async () => {
throw new Error("nope");
});
await failing.select(2);
expect(failing.state).toEqual({ kind: "failed", page: 1 });
});
});