Files
Investidor-V2/tests/frontend/treatment-scope-export.test.mjs

33 lines
3.2 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import JSZip from 'jszip';
import { mkdir, writeFile } from 'node:fs/promises';
import { createProjectDossierReport, createProjectDossierPrintHtml, generateProjectDossierDocx, generateProjectDossierPackage } from '../../resources/js/lib/project-dossier-report.ts';
import { inheritCompatibleFields } from '../../resources/js/lib/context-inheritance.ts';
test('selected second opportunity survives actual Word and ZIP generation and the native print document', async () => {
const snapshot=JSON.stringify({version:1,context_revision:12,consumer_opportunity:'opportunity:309',zone:{title:'Parque Manica',version:3,href:'/parques/manica'},opportunity_choices:[{opportunity:{key:'opportunity:309',title:'Segunda oportunidade Manica'}}],land_preparation:{need:'yes'},path:{steps:[{code:'S10',title:'Terra Manica',applicability:'applicable',state:'preparing'},{code:'S13',title:'Financiamento',applicability:'not_needed_for_preparation',reason:'Sem financiamento externo neste ambito'}]}});
const report=createProjectDossierReport({project_title:'QA segunda oportunidade',context_applicability_snapshot:snapshot},{selectedSections:new Set(['sources'])});
const html=await createProjectDossierPrintHtml(report,[],false);
assert.match(html,/Terra Manica/);assert.match(html,/Sem financiamento externo neste ambito/);assert.match(html,/opportunity:309/);assert.match(html,/Segunda oportunidade Manica/);assert.match(html,/Parque Manica/);assert.doesNotMatch(html,/Sofala/);
const docx=await generateProjectDossierDocx(report,[],true);
const bytes=await docx.arrayBuffer();const word=await JSZip.loadAsync(bytes);
const xml=await word.file('word/document.xml').async('string');
assert.match(xml,/opportunity:309/);assert.match(xml,/Parque Manica/);assert.doesNotMatch(xml,/Sofala/);
const bundle=await generateProjectDossierPackage(docx,[],true);const zip=await JSZip.loadAsync(await bundle.arrayBuffer());
const inner=Object.keys(zip.files).find(name=>name.endsWith('.docx'));assert.ok(inner);
assert.deepEqual(await zip.file(inner).async('uint8array'),new Uint8Array(bytes));
await mkdir('outputs/multi-opportunity-fix-20261023/treatment-exports',{recursive:true});
await writeFile('outputs/multi-opportunity-fix-20261023/treatment-exports/second.docx',new Uint8Array(bytes));
await writeFile('outputs/multi-opportunity-fix-20261023/treatment-exports/second.zip',new Uint8Array(await bundle.arrayBuffer()));
await writeFile('outputs/multi-opportunity-fix-20261023/treatment-exports/second-print.html',html);
});
test('new common contact reuse preserves a deliberate contact and follows inherited contact only',()=>{
const source={email:'qa@example.invalid',phone:'+258840001234'};
const a=inheritCompatibleFields('dossier:qa:land',{email:'edited@example.invalid'},source,'');
assert.equal(a.patch.phone,source.phone);assert.equal(a.patch.email,undefined);
const b=inheritCompatibleFields('dossier:qa:land',{email:'edited@example.invalid',phone:source.phone},{...source,phone:'+258840005678'},a.metadata);
assert.equal(b.patch.phone,'+258840005678');assert.equal(b.patch.email,undefined);
});