Files
auto_news_upload/test/bridge.test.cjs
T
2026-10-31 16:15:04 +08:00

14 lines
1.4 KiB
JavaScript

'use strict';
const {test}=require('node:test');const assert=require('node:assert/strict');const fs=require('node:fs');const path=require('node:path');const vm=require('node:vm');
test('终止后较早的 heartbeat 响应不能恢复流程',async()=>{
const handlers=new Map(),requests=[],responses=[],values={pairToken:'test-token',pairPort:8770};
class Event{constructor(type,options={}){this.type=type;this.detail=options.detail;}}
const doc={readyState:'loading',addEventListener(type,fn){handlers.set(type,fn);},dispatchEvent(event){if(event.type==='dww11:local-response')responses.push(JSON.parse(event.detail));else handlers.get(event.type)?.(event);}};
vm.runInNewContext(fs.readFileSync(path.join(__dirname,'../browser/local-bridge.user.js'),'utf8'),{document:doc,CustomEvent:Event,GM_getValue:(k,d)=>values[k]??d,GM_setValue:(k,v)=>values[k]=v,GM_addValueChangeListener:()=>{},GM_xmlhttpRequest:r=>requests.push(r)});
const call=(id,route)=>handlers.get('dww11:local-request')(new Event('',{detail:JSON.stringify({id,route})}));
const heartbeat=call('old','heartbeat');const stop=call('stop','stop');
requests[0].onload({status:200,responseText:JSON.stringify({running:true,epoch:1})});await heartbeat;
assert.equal(responses.find(r=>r.id==='old').value.running,false);assert.equal(values.halted,true);
requests[1].onload({status:200,responseText:JSON.stringify({running:false,epoch:2})});await stop;
});