import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts'; import assert from 'node:assert/strict'; test('legacy draft without a compatible source keeps its shape and identity',()=>{ const legacy={activity_id:'legacy-activity',infrastructure_needs:['energia']}; assert.equal(inheritSimulatorFields(legacy),legacy); assert.equal(Object.hasOwn(inheritSimulatorFields(legacy),'compatible_fields_snapshot'),false); }); import test from 'node:test'; import { inheritCompatibleFields, inheritSimulatorFields } from '../../resources/js/lib/context-inheritance.ts'; import { serializeBusinessPlanSnapshot } from '../../resources/js/lib/business-financial-plan.ts'; import { monthlySalesFromDraft } from '../../resources/js/lib/monthly-iva.ts'; import { restoreSimulationDraft, partitionSimulationDraft } from '../../resources/js/lib/simulation-form.ts'; test('inherited source updates follow through recovery while local edits and deliberate clears survive',()=>{ const first=inheritCompatibleFields('dossier:A:simulator',{}, {currency:'MZN',project_title:'A'}, null); const saved={...first.patch,context_reuse:first.metadata}; const changed=inheritCompatibleFields('dossier:A:simulator',saved,{currency:'USD',project_title:'A2'},saved.context_reuse); assert.deepEqual(changed.patch,{currency:'USD',project_title:'A2'}); const edited=inheritCompatibleFields('dossier:A:simulator',{...saved,currency:'EUR',project_title:''},{currency:'USD',project_title:'A2'},saved.context_reuse); assert.deepEqual(edited.patch,{});assert.deepEqual(edited.conflicts,['currency','project_title']); const recovered=JSON.parse(JSON.stringify({...saved,currency:'EUR',project_title:''})); assert.deepEqual(inheritCompatibleFields('dossier:A:simulator',recovered,{currency:'USD',project_title:'A2'},recovered.context_reuse).patch,{}); assert.ok(!first.metadata.includes('MZN'));assert.ok(!first.metadata.includes('project_title":"A')); }); test('a different dossier cannot take ownership of existing values using another dossier metadata',()=>{ const first=inheritCompatibleFields('dossier:A:simulator',{}, {currency:'MZN'}, null); const second=inheritCompatibleFields('dossier:B:simulator',first.patch,{currency:'USD'},first.metadata); assert.deepEqual(second.patch,{});assert.deepEqual(second.conflicts,['currency']); }); test('a local geographic override protects the entire hierarchy',()=>{ const first=inheritCompatibleFields('A',{}, {province_id:'p1',district_id:'d1'},null); const update=inheritCompatibleFields('A',{...first.patch,province_id:'p-local'},{province_id:'p2',district_id:'d2'},first.metadata); assert.deepEqual(update.patch,{}); }); test('compatible currency and date reuse survives backend partition and new session recovery without invented tax scope',()=>{ const initial=inheritSimulatorFields({currency:'USD',expected_start_date:'2026-03-01',purpose:'simulate_only'}); assert.equal(initial.fiscal_currency,'USD');assert.equal(initial.published_iva_currency,'USD');assert.equal(initial.opportunity_currency,'USD'); assert.equal(JSON.parse(initial.monthly_iva_settings).start,'2026-03');assert.equal(JSON.parse(initial.monthly_iva_settings).declared,false); assert.equal(initial.published_iva_date,undefined); assert.equal(inheritSimulatorFields({expected_start_date:'2026-01-01',monthly_iva_settings:'[invalid stored input'}).monthly_iva_settings,'[invalid stored input'); const saved=partitionSimulationDraft(initial,true);const recovered=restoreSimulationDraft(saved.economic_snapshot,saved.personal_snapshot); assert.equal(recovered.published_iva_currency,'USD');assert.strictEqual(inheritSimulatorFields(recovered),recovered); const changed=inheritSimulatorFields({...recovered,currency:'EUR'});assert.equal(changed.fiscal_currency,'EUR'); const override=inheritSimulatorFields({...changed,fiscal_currency:'MZN',published_iva_currency:''});assert.equal(override.fiscal_currency,'MZN');assert.equal(override.published_iva_currency,''); }); test('land consumer reuses geography inside an empty parcel and preserves all other parcel data',()=>{ const first=inheritCompatibleFields('land', {parcels:[{area:'12',province_id:''},{area:'20',province_id:'other'}]}, {parcels:[{province_id:'P',district_id:'D'}]},null); assert.equal(first.patch.parcels[0].area,'12');assert.equal(first.patch.parcels[0].district_id,'D');assert.equal(first.patch.parcels[1].province_id,'other'); const changed=inheritCompatibleFields('land',{parcels:[{...first.patch.parcels[0],area:'13'},first.patch.parcels[1]]},{parcels:[{province_id:'P2'}]},first.metadata); assert.equal(changed.patch.parcels[0].area,'13');assert.equal(changed.patch.parcels[0].district_id,''); }); test('clearing an inherited zone reference clears only the inherited value, preserving a deliberate override',()=>{ const first=inheritCompatibleFields('A',{}, {special_zone_id:'zone'},null); assert.equal(inheritCompatibleFields('A',first.patch,{special_zone_id:''},first.metadata).patch.special_zone_id,''); assert.deepEqual(inheritCompatibleFields('A',{special_zone_id:'local'},{special_zone_id:''},first.metadata).patch,{}); }); test('conflicting saved sales currency is explained instead of relabelled or converted',()=>{ const fields=['openingCash','monthlyCollections','monthlyVariableCostPayments','monthlyInventoryPurchases','monthlyOperatingExpenses','monthlyOperatingPayments','monthlyPayrollExpense','monthlyPayrollPayments','assetInvestment','inventory','receivables','payables','equity','shareholderLoans','bankLoanProceeds','grants','assetDepreciation','monthlyInterestExpense','monthlyInterestPayment','monthlyPrincipalRepayment']; const plan={...Object.fromEntries(fields.map(key=>[key,'0'])),currency:'MZN',periods:4,depreciationLifeMonths:60,products:[{label:'QA',monthlyUnits:'1',unitPrice:'100',unitVariableCost:'0'}]}; assert.throws(()=>monthlySalesFromDraft({currency:'USD',business_plan_snapshot:serializeBusinessPlanSnapshot(plan)}),/projecção de vendas está em MZN.*projecto está em USD/); }); test('report preserves consulted zone version and makes unsupported benefit explicit without inventing a fiscal result',()=>{ const context={version:1,context_revision:3,zone:{title:'Referência QA',version:7,href:'/zonas/qa'},fields:{currency:'USD'}}; const draft={project_title:'QA',currency:'USD',context_applicability_snapshot:JSON.stringify(context)}; const saved=JSON.stringify(draft);const report=createProjectDossierReport(draft,{selectedSections:new Set(['sources'])}); assert.match(JSON.stringify(report),/Referência QA, versão 7/);assert.match(JSON.stringify(report),/Benefício fiscal da zona indeterminado/);assert.equal(JSON.stringify(draft),saved); });