@@ -22,7 +22,7 @@ async function pdf(pages = 2) {
2222// Speaks the zotero-pdf2zh protocol and "translates" by echoing the upload.
2323async function fakeServer (
2424 t ,
25- { health = { status : 'ok' , version : '2.4.3' } , fail = false , stall = '' } = { } ,
25+ { health = { status : 'ok' , version : '2.4.3' } , fail = false , stall = '' , running = [ ] } = { } ,
2626) {
2727 const files = new Map ( ) ;
2828 const history = [ ] ;
@@ -35,7 +35,22 @@ async function fakeServer(
3535 } ;
3636 if ( req . url === '/health' ) return send ( 200 , health ) ;
3737 if ( stall === 'poll' && req . url . startsWith ( '/api/' ) ) return ;
38- if ( req . url === '/api/tasks' ) return send ( 200 , { status : 'success' , tasks : [ ] } ) ;
38+ if ( req . url === '/api/tasks' ) {
39+ const [ progress ] = running . splice ( 0 , 1 ) ;
40+ const tasks =
41+ progress === undefined
42+ ? [ ]
43+ : [
44+ {
45+ taskId : `task-${ history . length } ` ,
46+ finished : false ,
47+ status : 'running' ,
48+ progress,
49+ message : 'translate 0/100' ,
50+ } ,
51+ ] ;
52+ return send ( 200 , { status : 'success' , tasks } ) ;
53+ }
3954 if ( req . url === '/api/history' ) return send ( 200 , { status : 'success' , history } ) ;
4055 if ( req . url . startsWith ( '/translatedFile/' ) ) {
4156 const name = decodeURIComponent ( req . url . slice ( '/translatedFile/' . length ) ) ;
@@ -284,3 +299,28 @@ test('runner keeps the Fast kernel and cache-only misses off the remote server',
284299 assert . equal ( await data . translate ( { remoteKernel, cacheOnly : true } ) , null ) ;
285300 assert . equal ( server . requests . length , 0 ) ;
286301} ) ;
302+
303+ test ( 'a remote job stuck at 0% reports indeterminate progress, then real percentages' , async ( t ) => {
304+ const server = await fakeServer ( t , { running : [ 0 , 0 , 40 ] } ) ;
305+ const kernel = createRemoteKernel ( { pollIntervalMs : 10 } ) ;
306+ const events = [ ] ;
307+ await kernel . translatePage ( {
308+ url : server . url ,
309+ bytes : await pdf ( ) ,
310+ page : 1 ,
311+ language : 'zh' ,
312+ onProgress : ( progress ) => events . push ( progress ) ,
313+ } ) ;
314+ assert . equal ( events [ 0 ] . percent , null ) ;
315+ assert . ok ( events . length >= 3 ) ;
316+ assert . deepEqual (
317+ events . map ( ( event ) => event . percent ) ,
318+ [ null , null , null , 40 ] . slice ( 0 , events . length ) ,
319+ ) ;
320+ assert . deepEqual ( events . at ( - 1 ) , {
321+ stage : 'translate 0/100' ,
322+ completed : 40 ,
323+ total : 100 ,
324+ percent : 40 ,
325+ } ) ;
326+ } ) ;
0 commit comments