Files
SGF/scripts/workshop-material-cycle-ui-check.mjs
2026-11-02 20:29:34 +02:00

13 lines
2.2 KiB
JavaScript

import assert from 'node:assert/strict';import fs from 'node:fs/promises';import crypto from 'node:crypto';
import React from 'react';import {renderToStaticMarkup} from 'react-dom/server';import {createServer} from 'vite';
const server=await createServer({configFile:false,server:{middlewareMode:true,watch:null},appType:'custom',optimizeDeps:{noDiscovery:true}});
try {
const {WorkshopStockImpact}=await server.ssrLoadModule('/resources/js/WorkshopStockWorkspace.jsx');
const base={physical_before:'5000',physical_after:'5000',quantity_milli:'0',linked_quantity_milli:'2000',unallocated_before:'5000',unallocated_after:'3000',existing_movement_id:42,stock_item_id:1,warehouse_id:11,source_version:1};
const render=impact=>renderToStaticMarkup(React.createElement(WorkshopStockImpact,{impact}));
const allocation=render({...base,mode:'allocate_existing_delivery'});assert(allocation.includes('5,000 → 5,000'));assert(allocation.includes('Quantidade não associada: 5,000 → 3,000'));
const returned=render({...base,mode:'return_existing_delivery',physical_after:'8000',return_quantity_milli:'3000',unallocated_before:'3000',unallocated_after:'0'});assert(returned.includes('5,000 → 8,000'));assert(returned.includes('Entrada por devolução: 3,000, da entrega #42'));
const source=await fs.readFile('resources/js/WorkshopStockWorkspace.jsx','utf8');assert(source.includes('name="received_in_warehouse" required'));assert(source.includes('required defaultValue=""'));assert(source.includes('proposal_page=${proposalPage}&status=${status}'));assert(source.includes('Confirmo a recepção física'));
await fs.writeFile('docs/proofs/workshop-material-cycle-ui-20261102.json',JSON.stringify({kind:'static_impact_render_and_source_checks',allocation_zero_effect:true,remaining_quantity_visible:true,return_positive_effect_visible:true,physical_receiving_checkbox_required_in_source:true,explicit_treatment_choice_in_source:true,history_controls_and_query_in_source:true,source_sha256:crypto.createHash('sha256').update(source).digest('hex'),backend_requests:0,browser_interactions_tested:false,visual_review:false},null,2)+'\n');console.log('Material cycle impact render and source checks passed; visual review pending.');
} finally {await server.close();}