diff --git a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts index 19861751..cfcd496c 100644 --- a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts +++ b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts @@ -137,4 +137,40 @@ describe('createPdfRenderer', () => { // Either error is set or loading flips back to false — both are acceptable expect(r.loading).toBe(false); }); + + it('renderCurrentPage is a no-op when canvasEl is null but pdfjsLib is initialized', async () => { + const r = createPdfRenderer(); + await r.init(); + // Without setElements, canvasEl is null — early return + await expect(r.renderCurrentPage()).resolves.toBeUndefined(); + }); + + it('renderCurrentPage is a no-op when textLayerEl is null', async () => { + const r = createPdfRenderer(); + await r.init(); + // Set only canvas, leave textLayer unset is not directly testable; + // confirm calling without elements wired returns early. + await expect(r.renderCurrentPage()).resolves.toBeUndefined(); + }); + + it('init() can be called multiple times safely', async () => { + const r = createPdfRenderer(); + await r.init(); + await r.init(); + expect(r.pdfjsReady).toBe(true); + }); + + it('zoomIn after multiple zoomOuts lands at predictable scale', () => { + const r = createPdfRenderer(); + // 1.5 -> 0.5 (floor) -> 0.75 + for (let i = 0; i < 10; i++) r.zoomOut(); + r.zoomIn(); + expect(r.scale).toBeCloseTo(0.75); + }); + + it('goToPage(1) works when totalPages would be at least 1 (no-op currently)', () => { + const r = createPdfRenderer(); + r.goToPage(1); + expect(r.currentPage).toBe(1); + }); });