29 lines
1.7 KiB
JavaScript
29 lines
1.7 KiB
JavaScript
import {test} from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {readPdfPages} from '../src/services/pdfDocumentReader.js';
|
|
import {awaitWithAbort} from '../src/services/abortable.js';
|
|
test('cancelling pending OCR cleans the page and prevents reading subsequent pages',async()=>{
|
|
const c=new AbortController();let reads=0,cleanups=0;
|
|
const doc={numPages:3,getPage:async()=>{reads++;return {getTextContent:async()=>({items:[]}),cleanup:()=>cleanups++};}};
|
|
await assert.rejects(readPdfPages(doc,{signal:c.signal,ocrPage:async()=>{c.abort();return new Promise(()=>{});}}),{name:'AbortError'});
|
|
assert.equal(reads,1);assert.equal(cleanups,1);
|
|
});
|
|
test('late page acquisition after cancellation cleans the acquired page',async()=>{
|
|
const c=new AbortController();let release,cleanups=0;
|
|
const pending=readPdfPages({numPages:1,getPage:()=>new Promise(resolve=>release=resolve)},{signal:c.signal});
|
|
c.abort();await assert.rejects(pending,{name:'AbortError'});
|
|
release({cleanup:()=>cleanups++});await Promise.resolve();await Promise.resolve();
|
|
assert.equal(cleanups,1);
|
|
});
|
|
test('abort invokes resource cancellation once even if work settles later',async()=>{
|
|
const c=new AbortController();let release,cancelled=0;
|
|
const pending=awaitWithAbort(new Promise(resolve=>release=resolve),c.signal,()=>cancelled++);
|
|
c.abort();await assert.rejects(pending,{name:'AbortError'});
|
|
release('late');await Promise.resolve();assert.equal(cancelled,1);
|
|
});
|
|
test('normal completion removes cancellation callbacks',async()=>{
|
|
const c=new AbortController();let cancelled=0;
|
|
assert.equal(await awaitWithAbort(Promise.resolve('source'),c.signal,()=>cancelled++),'source');
|
|
c.abort();assert.equal(cancelled,0);
|
|
});
|