import { describe, it, expect, vi } from 'vitest'; import { createPdfRenderer } from './usePdfRenderer.svelte'; // Note: init() and loadDocument() require pdfjsLib (browser module). // These tests cover pure state logic only — bounds clamping and zoom limits. describe('createPdfRenderer', () => { it('starts at page 1 with scale 1.5 and no error', () => { const r = createPdfRenderer(); expect(r.currentPage).toBe(1); expect(r.scale).toBe(1.5); expect(r.totalPages).toBe(0); expect(r.loading).toBe(false); expect(r.error).toBeNull(); expect(r.isLoaded).toBe(false); expect(r.pdfjsReady).toBe(false); }); it('prevPage does not go below page 1', () => { const r = createPdfRenderer(); r.prevPage(); expect(r.currentPage).toBe(1); }); it('nextPage does not exceed totalPages', () => { const r = createPdfRenderer(); // totalPages = 0, so 1 < 0 is false → stays at 1 r.nextPage(); expect(r.currentPage).toBe(1); }); it('goToPage does not navigate when n > totalPages', () => { const r = createPdfRenderer(); r.goToPage(5); expect(r.currentPage).toBe(1); }); it('goToPage does not navigate when n < 1', () => { const r = createPdfRenderer(); r.goToPage(0); expect(r.currentPage).toBe(1); }); it('zoomIn increases scale by 0.25', () => { const r = createPdfRenderer(); r.zoomIn(); expect(r.scale).toBeCloseTo(1.75); }); it('zoomOut decreases scale by 0.25', () => { const r = createPdfRenderer(); r.zoomOut(); expect(r.scale).toBeCloseTo(1.25); }); it('zoomOut does not go below 0.5', () => { const r = createPdfRenderer(); for (let i = 0; i < 20; i++) r.zoomOut(); expect(r.scale).toBeCloseTo(0.5); }); it('loadDocument is a no-op when pdfjsLib not initialized', async () => { const r = createPdfRenderer(); await r.loadDocument('/some/path'); // No-op because pdfjsLib is null (init not called) expect(r.error).toBeNull(); expect(r.loading).toBe(false); }); it('calls injected libLoader during init and sets pdfjsReady', async () => { const fakePdfjs = { GlobalWorkerOptions: { workerSrc: '' }, getDocument: vi.fn(), TextLayer: class {} } as unknown as typeof import('pdfjs-dist'); const fakeLoader = vi.fn().mockResolvedValue([fakePdfjs, { default: '' }] as const); const r = createPdfRenderer(fakeLoader); await r.init(); expect(fakeLoader).toHaveBeenCalledOnce(); expect(r.pdfjsReady).toBe(true); }); it('leaves pdfjsReady false when libLoader rejects', async () => { const failingLoader = vi.fn().mockRejectedValue(new Error('load failed')); const r = createPdfRenderer(failingLoader); await r.init().catch(() => {}); expect(r.pdfjsReady).toBe(false); }); });