1import { afterEach, describe, expect, it, vi } from "vitest";23456789function mockPdf(numPages: number, viewport: { width: number; height: number }) {10 const getPage = vi.fn(async () => ({ getViewport: () => viewport }));11 vi.doMock("pdfjs-dist", () => ({12 GlobalWorkerOptions: { workerSrc: "stub" },13 getDocument: () => ({ promise: Promise.resolve({ numPages, getPage }) }),14 }));15 return getPage;16}1718function fakeFile(size = 1000): File {19 return { size, arrayBuffer: async () => new ArrayBuffer(8) } as unknown as File;20}2122describe("PCH-01-014 — Codex PDF page/dimension clamps", () => {23 afterEach(() => {24 vi.resetModules();25 vi.doUnmock("pdfjs-dist");26 });2728 it("importCodexPDF truncates page count at MAX_PDF_PAGES", async () => {29 const getPage = mockPdf(1000, { width: 600, height: 800 });30 const { importCodexPDF } = await import("./pdf-import");31 const result = await importCodexPDF(fakeFile());32 33 expect(getPage.mock.calls.length).toBeLessThanOrEqual(253);34 expect(result.errors.some((e) => e.includes("only the first 250"))).toBe(true);35 });3637 it("renderPageToCanvas rejects an oversized viewport before allocating", async () => {38 mockPdf(1, { width: 14400 * 6, height: 14400 * 6 });39 const { importCodexPDF } = await import("./pdf-import");40 const result = await importCodexPDF(fakeFile());41 42 43 expect(result.errors.some((e) => e.includes("render limit"))).toBe(true);44 });4546 it("does not fire the dimension clamp on a normal-sized page", async () => {47 mockPdf(3, { width: 600, height: 800 });48 const { importCodexPDF } = await import("./pdf-import");49 const result = await importCodexPDF(fakeFile());50 51 52 expect(result.errors.some((e) => e.includes("render limit"))).toBe(false);53 expect(result.errors.some((e) => e.includes("only the first"))).toBe(false);54 });55});