mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-05-06 13:19:31 -05:00
98 lines
2.5 KiB
TypeScript
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");
|
|
});
|
|
});
|