9 lines
6.5 KiB
JavaScript
9 lines
6.5 KiB
JavaScript
import fs from 'node:fs';import assert from 'node:assert/strict';import {pathToFileURL} from 'node:url';import {transformWithOxc} from 'vite';import {checkedWorkshopReport,workshopPageCsv} from '../resources/js/workshop-report-view.js';
|
|
const root=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')).root+'/private/receipt-composition-cc50a276c10c',checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);};let slots=[],cursor=0,effects=[],tree,calls=[],rootComponent,props;const same=(a,b)=>a&&b&&a.length===b.length&&a.every((v,i)=>v===b[i]);const R={createElement:(type,props,...children)=>({type,props:props??{},children}),Fragment:Symbol('fragment'),Suspense:Symbol('suspense'),lazy:()=>Symbol('lazy'),useState(initial){const i=cursor++;slots[i]??={value:initial};return[slots[i].value,v=>{slots[i].value=typeof v==='function'?v(slots[i].value):v;}];},useMemo(fn,deps){const i=cursor++;if(!same(slots[i]?.deps,deps))slots[i]={value:fn(),deps};return slots[i].value;},useEffect(fn,deps){const i=cursor++;if(!same(slots[i]?.deps,deps)){slots[i]?.cleanup?.();slots[i]={deps};effects.push(()=>slots[i].cleanup=fn());}}};globalThis.__equipmentHooks=R;const stub='const r=globalThis.__equipmentHooks;export default r;export const useState=r.useState,useMemo=r.useMemo,useEffect=r.useEffect;',reactUrl='data:text/javascript;base64,'+Buffer.from(stub).toString('base64'),compile=async(file,imports)=>{let s=fs.readFileSync('resources/js/'+file,'utf8').replace(/from\s*['"]react['"]/, 'from '+JSON.stringify(reactUrl));for(const f of imports)s=s.replace(new RegExp('from\\s*[\'"]\\./'+f.replaceAll('.','\\.')+'[\'"]'),'from '+JSON.stringify(pathToFileURL(process.cwd()+'/resources/js/'+f).href));const c=await transformWithOxc(s,file,{jsx:{runtime:'classic'}});return import('data:text/javascript;base64,'+Buffer.from(c.code).toString('base64'));};
|
|
const {default:Equipment}=await compile('WorkshopEquipmentWorkspace.jsx',['workshop-stock-operation.js']),{default:Orders,WorkshopOrderRow}=await compile('WorkshopOrderList.jsx',['workshop-menu.js','workshop-report-view.js']),equipment=[{id:101,identifier:'QA-FIRST',description:'Primeiro da fixture',serial:'A',client_name:'Cliente QA'},{id:102,identifier:'QA-CHOSEN',description:'Equipamento escolhido da fixture',serial:'B',client_name:'Cliente QA'}];
|
|
const dataFor=q=>{const page=Number(q.get('page')??1),id=Number(q.get('equipment_id'));return{read_only:true,states_are:'current_resource_records_not_delivery_or_payment',equipment:{...equipment[1],id},opening_period:null,observed_at:'QA',orders:{data:Array.from({length:page===1?25:2},(_,i)=>({id:(page-1)*25+i+1,reference:'QA-ORDER-'+((page-1)*25+i+1),equipment_id:id,equipment:'QA-CHOSEN',description:'Fixture de apresentação apenas',serial:'B',client:'Cliente QA',technician:'Técnico QA',state:'open',points:0,points_not_verified:0,minutes_reported:0,minutes_verified:0})),total:27,current_page:page,last_page:2,per_page:25}};};const api=async path=>{calls.push(path);if(path.startsWith('/api/workshop-equipment'))return{records:{data:equipment,current_page:1,last_page:1,total:2},can_create:false};return dataFor(new URL('http://qa'+path).searchParams);},render=()=>{cursor=0;tree=rootComponent(props);const jobs=effects;effects=[];jobs.forEach(f=>f());return tree;},tick=async()=>{await new Promise(r=>setTimeout(r,0));render();},descend=n=>Array.isArray(n)?n.flatMap(descend):n&&typeof n==='object'?[n,...descend(n.children)]:[],nodes=(n=tree)=>descend(n),text=n=>Array.isArray(n)?n.map(text).join(''):n&&typeof n==='object'?text(n.children):String(n??''),find=(tag,label)=>nodes().find(n=>n.type===tag&&text(n).includes(label));
|
|
rootComponent=Equipment;props={api,context:{token:'eq-context',unit:{id:2}},can:()=>false,navigate(){}};render();await tick();ok(calls.every(p=>!p.startsWith('/api/workshop/orders')),'catalogue does not choose a first equipment or query its orders');const search=find('label','Pesquisar código').children.find(n=>n?.type==='input');search.props.onChange({target:{value:'QA-SERIE'}});render();find('form','Pesquisar código').props.onSubmit({preventDefault(){}});render();await tick();const buttons=nodes().filter(n=>n.type==='button'&&text(n)==='Consultar ordens deste equipamento');assert.equal(buttons.length,2);buttons[1].props.onClick();render();const target=nodes().find(n=>n.props?.equipmentId);ok(target.props.equipmentId===102,'second equipment preserves exact identity no first fallback');target.props.onBack();render();ok(find('label','Pesquisar código').children.find(n=>n?.type==='input').props.value==='QA-SERIE','return preserves original catalogue search');
|
|
slots=[];effects=[];calls=[];let navigated=null,back=false;rootComponent=Orders;props={api,context:{token:'eq-context'},equipmentId:102,navigate:(page,id)=>{navigated={page,id};},onBack:()=>{back=true;}};render();await tick();ok(calls[0].includes('equipment_id=102'),'orders query includes exact chosen equipment');ok(text(tree).includes('Equipamento seleccionado')&&text(tree).includes('QA-CHOSEN')&&text(tree).includes('Cliente QA'),'current selected equipment metadata displayed');find('form','Pesquisar').props.onSubmit({preventDefault(){}});render();await tick();ok(calls.at(-1).includes('equipment_id=102'),'applying filters preserves equipment');find('button','Seguinte').props.onClick();render();await tick();ok(calls.at(-1).includes('equipment_id=102')&&calls.at(-1).includes('page=2'),'pagination preserves equipment');const rowNode=nodes().find(n=>n.type===WorkshopOrderRow),row=WorkshopOrderRow(rowNode.props);nodes(row).find(n=>n.type==='button').props.onClick();ok(navigated.page==='workshop'&&navigated.id===26,'opening order carries exact visible order ID');find('button','Voltar ao cadastro').props.onClick();ok(back,'explicit return works without business command');
|
|
const query={page:1,per_page:25,equipment_id:102},sample=dataFor(new URLSearchParams(query));ok(checkedWorkshopReport(sample,query)===sample,'selected equipment contract accepted');assert.throws(()=>checkedWorkshopReport({...sample,equipment:{...sample.equipment,id:101}},query));ok(true,'late different equipment refused');sample.equipment.client_name=' =FORMULA()';const csv=workshopPageCsv(sample,query);ok(csv.includes("' =FORMULA()")&&csv.includes('Equipamento escolhido')&&csv.includes('NAO E FECHO DIARIO'),'CSV identifies selected equipment safely and current-only basis');
|
|
const file=root+'/equipment-orders-ui-20261111.json';fs.writeFileSync(file,JSON.stringify({passed:true,checks,actual_component_handlers:true,api_mocked:true,business_commands:0,browser_visual_review:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));
|