sendou.ink/app/utils/remix.server.test.ts
2026-04-27 17:31:41 +03:00

98 lines
2.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { redirectIfPageOutOfBounds } from "./remix.server";
const buildRequest = (url: string) => new Request(url);
const captureRedirect = (fn: () => void) => {
try {
fn();
} catch (thrown) {
if (thrown instanceof Response) return thrown;
throw thrown;
}
return null;
};
describe("redirectIfPageOutOfBounds()", () => {
it("does not redirect when page is within bounds", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest("https://sendou.ink/vods?page=2"),
page: 2,
pagesCount: 5,
}),
);
expect(response).toBeNull();
});
it("does not redirect when page equals pagesCount", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest("https://sendou.ink/vods?page=5"),
page: 5,
pagesCount: 5,
}),
);
expect(response).toBeNull();
});
it("redirects to last page when page exceeds pagesCount", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest("https://sendou.ink/vods?page=99"),
page: 99,
pagesCount: 5,
}),
);
expect(response).not.toBeNull();
expect(response?.headers.get("Location")).toBe("/vods?page=5");
});
it("preserves other search params when redirecting", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest(
"https://sendou.ink/vods?type=TOURNAMENT&page=99&mode=SZ",
),
page: 99,
pagesCount: 3,
}),
);
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("does not redirect on page 1 when pagesCount is 0 (empty results)", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest("https://sendou.ink/vods?page=1"),
page: 1,
pagesCount: 0,
}),
);
expect(response).toBeNull();
});
it("redirects to page 1 when pagesCount is 0 and page exceeds 1", () => {
const response = captureRedirect(() =>
redirectIfPageOutOfBounds({
request: buildRequest("https://sendou.ink/vods?page=4"),
page: 4,
pagesCount: 0,
}),
);
expect(response?.headers.get("Location")).toBe("/vods?page=1");
});
});