import { beforeEach, describe, expect, it, vi } from "vitest";
import type { Redirect } from "../../src/lib/api/redirects.js";
import { render } from "../utils/render.tsx";
vi.mock("../../src/lib/api/redirects.js", () => ({
createRedirect: vi.fn(),
deleteRedirect: vi.fn(),
fetch404Summary: vi.fn().mockResolvedValue([]),
fetchRedirects: vi.fn(),
updateRedirect: vi.fn(),
}));
import { Redirects } from "../../src/components/Redirects.js";
import { fetchRedirects, updateRedirect } from "../../src/lib/api/redirects.js";
function makeRedirect(index: number): Redirect {
return {
id: `redirect-${index}`,
source: `/source-${index}`,
destination: `/destination-${index}`,
type: 301,
isPattern: false,
enabled: true,
hits: 0,
lastHitAt: null,
groupName: null,
auto: false,
createdAt: "2026-08-10T00:00:00.000Z",
updatedAt: "2026-08-10T00:00:00.000Z",
};
}
describe("Redirects", () => {
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(updateRedirect).mockResolvedValue(makeRedirect(1));
vi.mocked(fetchRedirects).mockImplementation(async ({ cursor } = {}) => {
if (cursor === "page-2") {
return { items: [makeRedirect(101)] };
}
return {
items: Array.from({ length: 100 }, (_, index) => makeRedirect(index + 1)),
nextCursor: "page-2",
};
});
});
it("loads redirects beyond the first page", async () => {
const screen = await render();
await expect.element(screen.getByText("/source-100")).toBeInTheDocument();
await screen.getByRole("button", { name: "Load more" }).click();
await expect.element(screen.getByText("/source-101")).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Load more" }).query()).toBeNull();
expect(fetchRedirects).toHaveBeenLastCalledWith(
expect.objectContaining({ cursor: "page-2", limit: 100 }),
);
});
it("restarts pagination after a redirect mutation", async () => {
const screen = await render();
await expect.element(screen.getByText("/source-100")).toBeInTheDocument();
await screen.getByRole("button", { name: "Load more" }).click();
await expect.element(screen.getByText("/source-101")).toBeInTheDocument();
await screen.getByRole("switch", { name: "Disable redirect" }).first().click();
await expect.element(screen.getByRole("button", { name: "Load more" })).toBeInTheDocument();
expect(screen.getByText("/source-101").query()).toBeNull();
});
});