Files
SGF/scripts/sgf-workshop-period-http.mjs
2026-11-11 09:00:17 +02:00

4 lines
3.5 KiB
JavaScript

import fs from 'node:fs';import assert from 'node:assert/strict';import crypto from 'node:crypto';import {session} from './sgf-single-http.mjs';import {checkedWorkshopReport,workshopPageCsv} from '../resources/js/workshop-report-view.js';
const checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);},s=await session('sgf:workshop_manage','workshop'),path='/api/workshop/orders?',get=async(q,who=s)=>{const r=await who.get(path+new URLSearchParams(q));assert.equal(r.status,200);return checkedWorkshopReport(await r.json(),q);};const old=await get({page:1,per_page:100}),chosen=old.orders.data[0];assert(chosen);const instant=new Date(chosen.created_at.replace(' ','T').replace(/([+-]\d{2})$/,'$1:00')),day=new Intl.DateTimeFormat('en-CA',{timeZone:'Africa/Johannesburg',year:'numeric',month:'2-digit',day:'2-digit'}).format(instant),query={page:1,per_page:25,from:day,to:day},data=await get(query);ok(data.orders.data.some(r=>r.id===chosen.id),'actual order in explicit local opening day');ok(data.opening_period.zone==='Africa/Johannesburg'&&data.opening_period.start_utc&&data.opening_period.end_utc_exclusive,'explicit UTC bounds and zone');for(const row of data.orders.data){const original=old.orders.data.find(o=>o.id===row.id);ok(original&&JSON.stringify(original)===JSON.stringify(row),'original state time and source parity '+row.id);}const large=await get({...query,per_page:100});ok(JSON.stringify(large.orders.data)===JSON.stringify(data.orders.data),'actual known period25/100');const searched=await get({...query,search:chosen.reference,state:chosen.state});ok(searched.orders.data.some(r=>r.id===chosen.id),'period combines actual search and state');const far=await get({...query,page:100000});ok(far.orders.data.length===0,'far page no fallback');for(const bad of [{from:day},{to:day},{from:'2026-11-11',to:'2026-11-10'},{...query,tenant_id:2}]){const r=await s.get(path+new URLSearchParams(bad));ok(r.status===422,'invalid period/context refused '+JSON.stringify(bad));}const tech=await session('sgf:workshop_record','workshop'),assigned=await get(query,tech);ok(assigned.orders.data.every(o=>o.technician_id===tech.identity.user.id),'period preserves technician assignment');const other=await session('sgf:commercial_prepare','commercial');let r=await other.get(path+new URLSearchParams(query));ok([403,409].includes(r.status),'period cannot cross module');ok(workshopPageCsv(data,query).includes(chosen.reference)&&workshopPageCsv(data,query).includes('NAO E FECHO DIARIO'),'CSV actual page and explicit current basis');
const root=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')).root+'/private/receipt-composition-cc50a276c10c',manifest=JSON.parse(fs.readFileSync(root+'/app/public/build/manifest.json'));for(const e of Object.values(manifest).filter(v=>v.isEntry||v.file.includes('WorkshopOrderList'))){r=await fetch('http://127.0.0.1:8085/build/'+e.file);const bytes=Buffer.from(await r.arrayBuffer());ok(r.status===200&&/javascript/.test(r.headers.get('content-type'))&&crypto.createHash('sha256').update(bytes).digest('hex')===crypto.createHash('sha256').update(fs.readFileSync(root+'/app/public/build/'+e.file)).digest('hex'),'actual JS delivery '+e.file);}const file=root+'/workshop-period-http-20261110.json';fs.writeFileSync(root+'/workshop-period-sample-private.json',JSON.stringify(data));fs.writeFileSync(file,JSON.stringify({passed:true,checks,business_commands:0,new_rights:0,browser_visual_review:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));