94 lines
3.2 KiB
TypeScript
Vendored
94 lines
3.2 KiB
TypeScript
Vendored
import { strict as assert } from "node:assert";
|
|
import { test } from "vitest";
|
|
import { canGoNextDataGridPage } from "../../apps/desktop/src/lib/dataGrid/dataGridPagination.ts";
|
|
|
|
test("known total disables next page at the last exact page", () => {
|
|
assert.equal(
|
|
canGoNextDataGridPage({
|
|
rowCount: 1,
|
|
pageSize: 1,
|
|
pageOffset: 8,
|
|
totalRowCount: 9,
|
|
}),
|
|
false,
|
|
);
|
|
});
|
|
|
|
test("known total allows next page before the last page", () => {
|
|
assert.equal(
|
|
canGoNextDataGridPage({
|
|
rowCount: 1,
|
|
pageSize: 1,
|
|
pageOffset: 7,
|
|
totalRowCount: 9,
|
|
}),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("backend hasMore takes precedence over a stale known total", () => {
|
|
assert.equal(
|
|
canGoNextDataGridPage({
|
|
hasMore: true,
|
|
rowCount: 1,
|
|
pageSize: 1,
|
|
pageOffset: 8,
|
|
totalRowCount: 9,
|
|
}),
|
|
true,
|
|
);
|
|
});
|
|
|
|
test("unknown total falls back to full-page heuristic", () => {
|
|
assert.equal(canGoNextDataGridPage({ rowCount: 1, pageSize: 1 }), true);
|
|
assert.equal(canGoNextDataGridPage({ rowCount: 0, pageSize: 1 }), false);
|
|
});
|
|
|
|
// --- auto-redirect page calculation after refresh ---
|
|
// These tests document the math used in DataGrid.vue's loading watcher:
|
|
// lastPageNum = Math.max(1, Math.ceil(total / pageSize))
|
|
// redirect when currentPage > lastPageNum
|
|
|
|
test("auto-redirect: current page beyond last page after data deletion — should redirect", () => {
|
|
// user on page 5, data shrinks to 200 rows, pageSize=100 → last page=2
|
|
const total = 200;
|
|
const pageSize = 100;
|
|
const currentPage = 5;
|
|
const lastPageNum = Math.max(1, Math.ceil(total / pageSize));
|
|
assert.equal(lastPageNum, 2);
|
|
assert.equal(currentPage > lastPageNum, true, "redirect should be triggered");
|
|
assert.equal((lastPageNum - 1) * pageSize, 100, "paginate offset for last page should be 100");
|
|
});
|
|
|
|
test("auto-redirect: current page still valid after partial deletion — no redirect", () => {
|
|
// user on page 5, data still has 500 rows → last page stays 5
|
|
const total = 500;
|
|
const pageSize = 100;
|
|
const currentPage = 5;
|
|
const lastPageNum = Math.max(1, Math.ceil(total / pageSize));
|
|
assert.equal(lastPageNum, 5);
|
|
assert.equal(currentPage > lastPageNum, false, "no redirect should be triggered");
|
|
});
|
|
|
|
test("auto-redirect: fewer rows than one page — redirects to page 1", () => {
|
|
// user on page 3, data shrinks to 30 rows, pageSize=100 → last page=1
|
|
const total = 30;
|
|
const pageSize = 100;
|
|
const currentPage = 3;
|
|
const lastPageNum = Math.max(1, Math.ceil(total / pageSize));
|
|
assert.equal(lastPageNum, 1, "ceil(30/100)=1, max(1,1)=1");
|
|
assert.equal(currentPage > lastPageNum, true, "redirect should be triggered");
|
|
assert.equal((lastPageNum - 1) * pageSize, 0, "paginate offset for page 1 should be 0");
|
|
});
|
|
|
|
test("auto-redirect: total is zero — guard prevents redirect attempt", () => {
|
|
// When total=0, the '!total || total <= 0' guard fires and skips the redirect
|
|
const total = 0;
|
|
assert.equal(!total || total <= 0, true, "guard should prevent redirect when total is 0");
|
|
});
|
|
|
|
test("auto-redirect: total is undefined — guard prevents redirect attempt", () => {
|
|
const total = undefined;
|
|
assert.equal(!total || (total as any) <= 0, true, "guard should prevent redirect when total is unknown");
|
|
});
|