修复新闻工作台换号联动流程
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
15 files changed
+203
-34
No files matched your search
@@ -0,0 +1,56 @@
|
||||
'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');
|
||||
const flush=async()=>{for(let i=0;i<12;i++)await new Promise(resolve=>setImmediate(resolve));};
|
||||
|
||||
function fixture({holdStart=false,holdResume=false,flow=null,helloError=false}={}) {
|
||||
const elements=[],handlers=new Map(),routes=[];
|
||||
let finishStart,finishResume;
|
||||
function element(){
|
||||
const attrs=new Map();
|
||||
const el={style:{},hidden:false,disabled:false,children:[],
|
||||
append(...nodes){this.children.push(...nodes);},prepend(){},before(){},remove(){},
|
||||
addEventListener(type,fn){this[type]=fn;},removeAttribute(key){attrs.delete(key);},
|
||||
setAttribute(key,value){attrs.set(key,value);},getAttribute:key=>attrs.get(key)??null,
|
||||
attachShadow:()=>element()};
|
||||
elements.push(el);return el;
|
||||
}
|
||||
const doc={body:element(),createElement:element,querySelector:()=>null,querySelectorAll:()=>[],
|
||||
addEventListener(type,fn){handlers.set(type,fn);}};
|
||||
const context={document:doc,location:{origin:'https://www.dww11.com',hostname:'www.dww11.com',href:'https://www.dww11.com/'},
|
||||
URL,Node:{TEXT_NODE:3},MutationObserver:class{observe(){}},setTimeout,
|
||||
chrome:{runtime:{sendMessage:async({route})=>{
|
||||
routes.push(route);
|
||||
if(route==='/hello')return helloError?{ok:false,error:'unavailable'}:{ok:true,data:{flow,total:1}};
|
||||
if(route==='/start'&&holdStart)return new Promise(resolve=>{finishStart=()=>resolve({ok:true,data:{flow:{id:'test',phase:'logout',paused:false}}});});
|
||||
if(route==='/resume'&&holdResume)return new Promise(resolve=>{finishResume=()=>resolve({ok:true,data:{flow:{id:'test',phase:'logout',paused:false}}});});
|
||||
if(route==='/suspend')return {ok:true,data:{}};
|
||||
throw new Error('Unexpected route '+route);
|
||||
}}}};
|
||||
vm.runInNewContext(fs.readFileSync(path.join(__dirname,'../../dww11-account-switch-browser-extension/content.js'),'utf8'),context);
|
||||
return {routes,state:()=>JSON.parse(elements.find(e=>e.id==='dww11-extension-panel').getAttribute('data-auto-news-state')),
|
||||
click:async(text)=>{elements.find(e=>e.textContent===text).click();await flush();},
|
||||
stop:()=>handlers.get('dww11:auto-stop')(),finishStart:()=>finishStart(),finishResume:()=>finishResume()};
|
||||
}
|
||||
|
||||
test('插件公开生命周期状态,不包含账号和凭据',async()=>{
|
||||
const f=fixture();await flush();
|
||||
assert.deepEqual(f.state(),{ready:true,idle:true,paused:false});
|
||||
const failed=fixture({helloError:true});await flush();
|
||||
assert.deepEqual(failed.state(),{ready:false,idle:false,paused:false});
|
||||
});
|
||||
test('抽号响应返回前终止,保留该次抽号并暂停,不执行登录',async()=>{
|
||||
const f=fixture({holdStart:true});await flush();await f.click('登陆下一帐号');
|
||||
assert.equal(f.state().idle,false);f.stop();f.finishStart();await flush();
|
||||
assert.deepEqual(f.routes,['/hello','/start','/suspend']);
|
||||
assert.deepEqual(f.state(),{ready:true,idle:false,paused:true});
|
||||
});
|
||||
test('恢复响应返回前终止,不执行登录或再次抽号',async()=>{
|
||||
const f=fixture({holdResume:true,flow:{id:'test',paused:true,phase:'logout'}});await flush();
|
||||
await f.click('继续未完成流程');f.stop();f.finishResume();await flush();
|
||||
assert.deepEqual(f.routes,['/hello','/resume','/suspend']);
|
||||
assert.equal(f.state().paused,true);
|
||||
});
|
||||
Reference in new issue
Block a user