Files
Epicnabbo-Catalogus-Updated…/src/lib/api.test.ts
T
SimoandCursor 3bd712e744 fix(admin): polish tickets, photos purge note, drizzle contracts
Add queue banners/counts on ticket detail pages, document local-only photo purge, and harden Drizzle Kit smoke contracts after Prisma removal.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:07:54 +02:00

52 lines
1.4 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { apiUnavailable, pagination, positiveBigInt } from "@/lib/api";
describe("apiUnavailable", () => {
it("returns a no-store 503 error without exposing internal details", async () => {
const response = apiUnavailable("Account data is temporarily unavailable");
expect(response.status).toBe(503);
expect(response.headers.get("cache-control")).toBe("no-store");
await expect(response.json()).resolves.toEqual({
error: "Account data is temporarily unavailable",
});
});
});
describe("positiveBigInt", () => {
it.each(["1", "9007199254740993"])("parses positive integer id %s", (raw) => {
expect(positiveBigInt(raw)).toBe(BigInt(raw));
});
it.each([null, "", "0", "-1", "1.5", "abc"])(
"rejects invalid id %s",
(raw) => {
expect(positiveBigInt(raw)).toBeNull();
},
);
});
describe("pagination", () => {
it("rejects fractional and malformed values before they reach the DB layer", () => {
const params = new URLSearchParams({ page: "2.5", perPage: "10.1" });
expect(pagination(params, 20, 100)).toEqual({
page: 1,
perPage: 20,
skip: 0,
take: 20,
});
});
it("clamps valid page sizes to the configured maximum", () => {
const params = new URLSearchParams({ page: "3", perPage: "999" });
expect(pagination(params, 20, 100)).toEqual({
page: 3,
perPage: 100,
skip: 200,
take: 100,
});
});
});