sendou.ink/app/utils/remix.server.test.ts
2026-07-26 12:34:07 +03:00

113 lines
2.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { paginate } from "./remix.server";
const buildUrl = (url: string) => new URL(url);
const captureRedirect = (fn: () => void) => {
try {
fn();
} catch (thrown) {
if (thrown instanceof Response) return thrown;
throw thrown;
}
return null;
};
describe("paginate()", () => {
it("returns the page count rounded up", () => {
const result = paginate({
url: buildUrl("https://sendou.ink/vods?page=1"),
page: 1,
pageSize: 10,
totalCount: 41,
});
expect(result).toEqual({ currentPage: 1, pagesCount: 5 });
});
it("does not redirect when page is within bounds", () => {
const response = captureRedirect(() =>
paginate({
url: buildUrl("https://sendou.ink/vods?page=2"),
page: 2,
pageSize: 10,
totalCount: 50,
}),
);
expect(response).toBeNull();
});
it("does not redirect when page equals pagesCount", () => {
const response = captureRedirect(() =>
paginate({
url: buildUrl("https://sendou.ink/vods?page=5"),
page: 5,
pageSize: 10,
totalCount: 50,
}),
);
expect(response).toBeNull();
});
it("redirects to last page when page exceeds pagesCount", () => {
const response = captureRedirect(() =>
paginate({
url: buildUrl("https://sendou.ink/vods?page=99"),
page: 99,
pageSize: 10,
totalCount: 50,
}),
);
expect(response).not.toBeNull();
expect(response?.headers.get("Location")).toBe("/vods?page=5");
});
it("preserves other search params when redirecting", () => {
const response = captureRedirect(() =>
paginate({
url: buildUrl(
"https://sendou.ink/vods?type=TOURNAMENT&page=99&mode=SZ",
),
page: 99,
pageSize: 10,
totalCount: 25,
}),
);
const location = response?.headers.get("Location");
expect(location).not.toBeNull();
const locationUrl = new URL(location!, "https://sendou.ink");
expect(locationUrl.pathname).toBe("/vods");
expect(locationUrl.searchParams.get("page")).toBe("3");
expect(locationUrl.searchParams.get("type")).toBe("TOURNAMENT");
expect(locationUrl.searchParams.get("mode")).toBe("SZ");
});
it("stays on page 1 when there are no results", () => {
const result = paginate({
url: buildUrl("https://sendou.ink/vods?page=1"),
page: 1,
pageSize: 10,
totalCount: 0,
});
expect(result).toEqual({ currentPage: 1, pagesCount: 1 });
});
it("redirects to page 1 when there are no results and page exceeds 1", () => {
const response = captureRedirect(() =>
paginate({
url: buildUrl("https://sendou.ink/vods?page=4"),
page: 4,
pageSize: 10,
totalCount: 0,
}),
);
expect(response?.headers.get("Location")).toBe("/vods?page=1");
});
});