fix(pdf-viewer): eliminate real pdfjs-dist loading from browser tests — stop birpc teardown race #550
@@ -1,6 +1,25 @@
|
|||||||
import { describe, it, expect, vi } from 'vitest';
|
import { describe, it, expect, vi } from 'vitest';
|
||||||
|
import type { LibLoader } from './usePdfRenderer.svelte';
|
||||||
import { createPdfRenderer } from './usePdfRenderer.svelte';
|
import { createPdfRenderer } from './usePdfRenderer.svelte';
|
||||||
|
|
||||||
|
function makeFakeLibLoader(): LibLoader {
|
||||||
|
return vi.fn().mockResolvedValue([
|
||||||
|
{
|
||||||
|
GlobalWorkerOptions: { workerSrc: '' },
|
||||||
|
getDocument: vi.fn().mockReturnValue({
|
||||||
|
promise: Promise.resolve({ numPages: 1, getPage: vi.fn() })
|
||||||
|
}),
|
||||||
|
TextLayer: class {
|
||||||
|
render() {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
cancel() {}
|
||||||
|
}
|
||||||
|
} as unknown as typeof import('pdfjs-dist'),
|
||||||
|
{ default: '' }
|
||||||
|
] as const);
|
||||||
|
}
|
||||||
|
|
||||||
// Note: init() and loadDocument() require pdfjsLib (browser module).
|
// Note: init() and loadDocument() require pdfjsLib (browser module).
|
||||||
// These tests cover pure state logic only — bounds clamping and zoom limits.
|
// These tests cover pure state logic only — bounds clamping and zoom limits.
|
||||||
|
|
||||||
@@ -122,39 +141,36 @@ describe('createPdfRenderer', () => {
|
|||||||
expect(r.scale).toBe(before);
|
expect(r.scale).toBe(before);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('init() is callable and resolves without throwing in browser env', async () => {
|
it('init() sets pdfjsReady to true when loader resolves', async () => {
|
||||||
const r = createPdfRenderer();
|
const r = createPdfRenderer(makeFakeLibLoader());
|
||||||
await expect(r.init()).resolves.toBeUndefined();
|
await expect(r.init()).resolves.toBeUndefined();
|
||||||
// pdfjsReady is now true
|
|
||||||
expect(r.pdfjsReady).toBe(true);
|
expect(r.pdfjsReady).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('after init, loadDocument with a bogus URL sets error', async () => {
|
it('after init, loadDocument completes and loading returns to false', async () => {
|
||||||
const r = createPdfRenderer();
|
const r = createPdfRenderer(makeFakeLibLoader());
|
||||||
await r.init();
|
await r.init();
|
||||||
|
|
||||||
await r.loadDocument('about:invalid-pdf');
|
await r.loadDocument('/some/path');
|
||||||
// Either error is set or loading flips back to false — both are acceptable
|
|
||||||
expect(r.loading).toBe(false);
|
expect(r.loading).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renderCurrentPage is a no-op when canvasEl is null but pdfjsLib is initialized', async () => {
|
it('renderCurrentPage is a no-op when canvasEl is null but pdfjsLib is initialized', async () => {
|
||||||
const r = createPdfRenderer();
|
const r = createPdfRenderer(makeFakeLibLoader());
|
||||||
await r.init();
|
await r.init();
|
||||||
// Without setElements, canvasEl is null — early return
|
// Without setElements, canvasEl is null — early return
|
||||||
await expect(r.renderCurrentPage()).resolves.toBeUndefined();
|
await expect(r.renderCurrentPage()).resolves.toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renderCurrentPage is a no-op when textLayerEl is null', async () => {
|
it('renderCurrentPage is a no-op when textLayerEl is null', async () => {
|
||||||
const r = createPdfRenderer();
|
const r = createPdfRenderer(makeFakeLibLoader());
|
||||||
await r.init();
|
await r.init();
|
||||||
// Set only canvas, leave textLayer unset is not directly testable;
|
// Without setElements, textLayerEl is null — early return
|
||||||
// confirm calling without elements wired returns early.
|
|
||||||
await expect(r.renderCurrentPage()).resolves.toBeUndefined();
|
await expect(r.renderCurrentPage()).resolves.toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('init() can be called multiple times safely', async () => {
|
it('init() can be called multiple times safely', async () => {
|
||||||
const r = createPdfRenderer();
|
const r = createPdfRenderer(makeFakeLibLoader());
|
||||||
await r.init();
|
await r.init();
|
||||||
await r.init();
|
await r.init();
|
||||||
expect(r.pdfjsReady).toBe(true);
|
expect(r.pdfjsReady).toBe(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user