test(pdf-renderer): inject libLoader into createPdfRenderer to eliminate vi.mock factories
Adds an optional LibLoader parameter (defaults to the real pdfjs-dist dynamic imports) and a failing test that verified the loader is called during init(). This is the first step toward removing ManualMockedModule registrations that race with vitest-browser-playwright's birpc teardown (#535). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { describe, it, expect } from 'vitest';
|
import { describe, it, expect, vi } from 'vitest';
|
||||||
import { createPdfRenderer } from './usePdfRenderer.svelte';
|
import { createPdfRenderer } from './usePdfRenderer.svelte';
|
||||||
|
|
||||||
// Note: init() and loadDocument() require pdfjsLib (browser module).
|
// Note: init() and loadDocument() require pdfjsLib (browser module).
|
||||||
@@ -66,4 +66,17 @@ describe('createPdfRenderer', () => {
|
|||||||
expect(r.error).toBeNull();
|
expect(r.error).toBeNull();
|
||||||
expect(r.loading).toBe(false);
|
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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import type { PDFDocumentProxy, RenderTask } from 'pdfjs-dist';
|
import type { PDFDocumentProxy, RenderTask } from 'pdfjs-dist';
|
||||||
|
|
||||||
export function createPdfRenderer() {
|
type LibLoader = () => Promise<readonly [typeof import('pdfjs-dist'), { default: string }]>;
|
||||||
|
|
||||||
|
const defaultLibLoader: LibLoader = () =>
|
||||||
|
Promise.all([import('pdfjs-dist'), import('pdfjs-dist/build/pdf.worker.min.mjs?url')]);
|
||||||
|
|
||||||
|
export function createPdfRenderer(libLoader: LibLoader = defaultLibLoader) {
|
||||||
// Reactive state — exposed via getters
|
// Reactive state — exposed via getters
|
||||||
let currentPage = $state(1);
|
let currentPage = $state(1);
|
||||||
let totalPages = $state(0);
|
let totalPages = $state(0);
|
||||||
@@ -18,10 +23,7 @@ export function createPdfRenderer() {
|
|||||||
let pdfjsLib: typeof import('pdfjs-dist') | null = null;
|
let pdfjsLib: typeof import('pdfjs-dist') | null = null;
|
||||||
|
|
||||||
async function init(): Promise<void> {
|
async function init(): Promise<void> {
|
||||||
const [lib, { default: workerUrl }] = await Promise.all([
|
const [lib, { default: workerUrl }] = await libLoader();
|
||||||
import('pdfjs-dist'),
|
|
||||||
import('pdfjs-dist/build/pdf.worker.min.mjs?url')
|
|
||||||
]);
|
|
||||||
lib.GlobalWorkerOptions.workerSrc = workerUrl;
|
lib.GlobalWorkerOptions.workerSrc = workerUrl;
|
||||||
pdfjsLib = lib;
|
pdfjsLib = lib;
|
||||||
pdfjsReady = true;
|
pdfjsReady = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user