From 56d826c50876c5c19b6635f6d36b26c37e79eef9 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Fri, 16 Oct 2026 19:24:19 +0200 Subject: [PATCH] test: cover how the PDF preview reports protected and unreadable files --- src/lib/__tests__/pdf-pages.test.ts | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/lib/__tests__/pdf-pages.test.ts diff --git a/src/lib/__tests__/pdf-pages.test.ts b/src/lib/__tests__/pdf-pages.test.ts new file mode 100644 index 00000000..32a5261c --- /dev/null +++ b/src/lib/__tests__/pdf-pages.test.ts @@ -0,0 +1,42 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { NativeModules } from 'react-native'; +import { openPdfPages, PdfOpenError, renderPdfPage, canRenderPdfPages } from '../pdf-pages'; + +const modules = NativeModules as Record; + +function nativeError(code: string, message: string): Error { + return Object.assign(new Error(message), { code }); +} + +describe('pdf-pages', () => { + afterEach(() => { delete modules.BulwarkPdf; }); + + it('reports the page sizes the renderer returns', async () => { + modules.BulwarkPdf = { open: vi.fn(async () => ({ pages: [{ width: 595, height: 842 }] })) }; + await expect(openPdfPages('file:///x.pdf')).resolves.toEqual([{ width: 595, height: 842 }]); + }); + + it('tells a password-protected PDF from an unreadable one', async () => { + modules.BulwarkPdf = { open: vi.fn(async () => { throw nativeError('E_PDF_PROTECTED', 'password'); }) }; + await expect(openPdfPages('file:///x.pdf')).rejects.toMatchObject({ reason: 'protected' }); + + modules.BulwarkPdf = { open: vi.fn(async () => { throw nativeError('E_PDF_OPEN', 'not a PDF'); }) }; + await expect(openPdfPages('file:///x.pdf')).rejects.toMatchObject({ reason: 'unreadable' }); + + modules.BulwarkPdf = { open: vi.fn(async () => ({ pages: [] })) }; + await expect(openPdfPages('file:///x.pdf')).rejects.toBeInstanceOf(PdfOpenError); + }); + + it('fails cleanly in a build without the renderer', async () => { + expect(canRenderPdfPages()).toBe(false); + await expect(openPdfPages('file:///x.pdf')).rejects.toMatchObject({ reason: 'unreadable' }); + await expect(renderPdfPage('file:///x.pdf', 0, 100, 'file:///p.png')).rejects.toThrow(); + }); + + it('renders at a whole pixel width', async () => { + const renderPage = vi.fn(async () => 'file:///p.png'); + modules.BulwarkPdf = { renderPage }; + await renderPdfPage('file:///x.pdf', 2, 1620.6, 'file:///p.png'); + expect(renderPage).toHaveBeenCalledWith('file:///x.pdf', 2, 1621, 'file:///p.png'); + }); +});