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); });