75 lines
3.6 KiB
JavaScript
75 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const fs=require('node:fs');
|
|
const path=require('node:path');
|
|
const vm=require('node:vm');
|
|
|
|
const root=path.resolve(__dirname,'..');
|
|
const manifest=JSON.parse(fs.readFileSync(path.join(root,'prototype-src','manifest.json'),'utf8'));
|
|
const html=fs.readFileSync(path.join(root,manifest.source),'utf8');
|
|
const failures=[];
|
|
function expect(condition,message){if(!condition)failures.push(message);}
|
|
function section(startMarker,endMarker){
|
|
const start=html.indexOf(startMarker);
|
|
const end=html.indexOf(endMarker,start+startMarker.length);
|
|
return start>=0&&end>start?html.slice(start,end):'';
|
|
}
|
|
function functionSource(name){
|
|
const start=html.indexOf(`function ${name}(`);
|
|
if(start<0)return '';
|
|
const braceStart=html.indexOf('{',start);
|
|
let depth=0,quote='',escaped=false;
|
|
for(let index=braceStart;index<html.length;index+=1){
|
|
const char=html[index];
|
|
if(quote){
|
|
if(escaped)escaped=false;
|
|
else if(char==='\\')escaped=true;
|
|
else if(char===quote)quote='';
|
|
continue;
|
|
}
|
|
if(char==="'"||char==='"'||char==='`'){quote=char;continue;}
|
|
if(char==='{')depth+=1;
|
|
if(char==='}'&&--depth===0)return html.slice(start,index+1);
|
|
}
|
|
return '';
|
|
}
|
|
|
|
const lastMilePage=section('<div class="page" id="page-last-mile-orders">','<!-- ==================== OVERSEAS WAREHOUSE - 尾程订单详情');
|
|
const getRelabel=functionSource('getLastMileRelabelOrder');
|
|
const statusClass=functionSource('lastMileRelabelStatusClass');
|
|
const renderList=functionSource('renderLastMileOrders');
|
|
const renderDetail=functionSource('renderLastMileOrderDetail');
|
|
|
|
expect(/>派送单号<\/th><th[^>]*>换标单号<\/th><th[^>]*>换标状态<\/th>/.test(lastMilePage),'列表应在派送单号后显示换标单号和换标状态');
|
|
expect(Boolean(getRelabel),'缺少 getLastMileRelabelOrder 函数');
|
|
expect(Boolean(statusClass),'缺少 lastMileRelabelStatusClass 函数');
|
|
expect(/getLastMileRelabelOrder/.test(renderList),'列表应实时查询关联换标单');
|
|
expect(/openFbaRelabelOrderDetail/.test(renderList),'列表换标单号应进入换标单详情');
|
|
expect(/换标状态/.test(renderDetail),'尾程详情计划信息应显示换标状态');
|
|
expect(/openFbaRelabelOrderDetail/.test(renderDetail),'尾程详情关联换标单应进入换标单详情');
|
|
expect(/lastMileNo\s*:\s*'LMO20260810001'/.test(html),'应提供尾程订单换标关联样例');
|
|
expect(/colspan="33"/.test(renderList),'列表空状态应覆盖新增后的 33 列');
|
|
|
|
if(getRelabel&&statusClass){
|
|
try{
|
|
const context={fbaRelabelOrderData:[
|
|
{orderNo:'REL-1',lastMileNo:'LMO-1',status:'待处理'},
|
|
{orderNo:'REL-2',lastMileNo:'LMO-2',status:'处理中'},
|
|
{orderNo:'REL-3',lastMileNo:'LMO-3',status:'已完成'}
|
|
]};
|
|
vm.createContext(context);
|
|
vm.runInContext(`${getRelabel}\n${statusClass}`,context,{timeout:1000});
|
|
expect(context.getLastMileRelabelOrder({no:'LMO-2'}).orderNo==='REL-2','应按尾程单号实时关联换标单');
|
|
expect(context.getLastMileRelabelOrder({no:'LMO-X'})===null,'无关联换标单应返回空值');
|
|
expect(context.lastMileRelabelStatusClass('待处理')==='tag-orange','待处理状态应显示橙色');
|
|
expect(context.lastMileRelabelStatusClass('处理中')==='tag-purple','处理中状态应显示紫色');
|
|
expect(context.lastMileRelabelStatusClass('已完成')==='tag-green','已完成状态应显示绿色');
|
|
}catch(error){failures.push(`换标关联行为执行失败:${error.message}`);}
|
|
}
|
|
|
|
if(failures.length){
|
|
console.error('LAST_MILE_RELABEL_DISPLAY_CHECK_FAIL');
|
|
failures.forEach(failure=>console.error(`- ${failure}`));
|
|
process.exitCode=1;
|
|
}else console.log('LAST_MILE_RELABEL_DISPLAY_CHECK_PASS');
|