|
|
@@ -42,3 +42,20 @@ test('one worker tick requests every configured data set exactly once', async ()
|
|
|
assert(requests.every((entry) => entry.body.params.operation === 'ops/sync/run'));
|
|
|
assert(requests.every((entry) => entry.body.token === 'test-session'));
|
|
|
});
|
|
|
+
|
|
|
+test('dependent review records wait until learning history is fully caught up', async () => {
|
|
|
+ const requested=[];
|
|
|
+ const server=createServer((request,response)=>{
|
|
|
+ let body='';request.setEncoding('utf8');request.on('data',(chunk)=>{body+=chunk;});request.on('end',()=>{
|
|
|
+ const dataset=JSON.parse(body).params.dataset;requested.push(dataset);
|
|
|
+ response.writeHead(200,{'Content-Type':'application/json'});
|
|
|
+ response.end(JSON.stringify({success:true,data:{processed:1,failures:0,hasMore:dataset==='learning-records'}}));
|
|
|
+ });
|
|
|
+ });
|
|
|
+ await new Promise((resolve)=>server.listen(0,'127.0.0.1',resolve));
|
|
|
+ const address=server.address();assert(address&&typeof address==='object');
|
|
|
+ const child=spawn(process.execPath,['scripts/run-legacy-sync-worker.mjs','--once'],{cwd:process.cwd(),env:{...process.env,XIAOSHU_FUNCTION_URL:`http://127.0.0.1:${address.port}`,XIAOSHU_SYNC_OPERATOR_TOKEN:'test-session',XIAOSHU_SYNC_DATASETS:'memory-records,learning-records,lessons,appointments',XIAOSHU_SYNC_HEALTH_PORT:'0'},stdio:['ignore','pipe','pipe']});
|
|
|
+ let stderr='';child.stderr.on('data',(chunk)=>{stderr+=chunk;});
|
|
|
+ const exitCode=await new Promise((resolve)=>child.on('close',resolve));await new Promise((resolve)=>server.close(resolve));
|
|
|
+ assert.equal(exitCode,0,stderr);assert(requested.includes('learning-records'));assert(requested.includes('appointments'));assert(requested.includes('lessons'));assert(!requested.includes('memory-records'));assert(requested.indexOf('appointments')<requested.indexOf('lessons'));
|
|
|
+});
|