From 3ae7c9da0ce4360d316e17752915a103bd3c5d5d Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 12 May 2026 09:25:13 +0200 Subject: [PATCH] =?UTF-8?q?test(pdf-renderer):=20guard=20init()=20against?= =?UTF-8?q?=20repeated=20calls=20=E2=80=94=20libLoader=20must=20fire=20onc?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds idempotency test: calling init() twice must invoke libLoader only once. Adds `if (pdfjsReady) return;` guard to satisfy the contract. Addresses Felix Brandt round-4 suggestion on PR #536. Co-Authored-By: Claude Sonnet 4.6 --- .../document/viewer/usePdfRenderer.svelte.test.ts | 13 +++++++++++++ .../lib/document/viewer/usePdfRenderer.svelte.ts | 1 + 2 files changed, 14 insertions(+) diff --git a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts index 9d56d95c..7bdf387d 100644 --- a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts +++ b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.test.ts @@ -193,4 +193,17 @@ describe('createPdfRenderer', () => { await expect(r.init()).rejects.toThrow('load failed'); expect(r.pdfjsReady).toBe(false); }); + + it('init() is idempotent — libLoader called only once on repeated calls', 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(); + await r.init(); + expect(fakeLoader).toHaveBeenCalledOnce(); + }); }); diff --git a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.ts b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.ts index 700984e9..13315f8e 100644 --- a/frontend/src/lib/document/viewer/usePdfRenderer.svelte.ts +++ b/frontend/src/lib/document/viewer/usePdfRenderer.svelte.ts @@ -23,6 +23,7 @@ export function createPdfRenderer(libLoader: LibLoader = defaultLibLoader) { let pdfjsLib: typeof import('pdfjs-dist') | null = null; async function init(): Promise { + if (pdfjsReady) return; const [lib, { default: workerUrl }] = await libLoader(); lib.GlobalWorkerOptions.workerSrc = workerUrl; pdfjsLib = lib;