Files
Investidor-V2/tests/frontend/consumer-opportunity-inheritance.test.mjs
T

39 lines
2.7 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { inheritCompatibleFields } from '../../resources/js/lib/context-inheritance.ts';
import { buildProjectDossierRows } from '../../resources/js/lib/project-dossier.ts';
test('changing only the treated opportunity refreshes inherited geography and preserves deliberate data',()=>{
const scope='dossier:QA:land';
const first={project_reference:'Investimento conjunto',purpose:'Segunda oportunidade',parcels:[{province_id:'gaza'}]};
const initial=inheritCompatibleFields(scope,{},first,null);
const values={...initial.patch,context_reuse:initial.metadata,purpose:'Edição deliberada',parcels:[{province_id:'gaza',area:'23',place_description:'Local declarado'}]};
const next=inheritCompatibleFields(scope,values,{...first,purpose:'Novo resumo da segunda',parcels:[{province_id:'manica'}]},initial.metadata);
assert.equal(next.patch.parcels[0].province_id,'manica');
assert.equal(next.patch.parcels[0].district_id,'');
assert.equal(next.patch.parcels[0].area,'23');
assert.equal(next.patch.parcels[0].place_description,'Local declarado');
assert.equal('purpose' in next.patch,false);
assert.ok(next.conflicts.includes('purpose'));
// The land form merges this geographic proposal into the existing parcel;
// area and the declared place are not part of the geographic replacement.
const merged={...values.parcels[0],...next.patch.parcels[0]};
assert.equal(merged.area,'23');assert.equal(merged.place_description,'Local declarado');
});
test('a deliberate site in a second-opportunity request remains a conflict instead of being replaced',()=>{
const scope='dossier:QA:desk';
const source={territory_id:'gaza',description:'Resumo específico'};
const initial=inheritCompatibleFields(scope,{},source,null);
const next=inheritCompatibleFields(scope,{...initial.patch,territory_id:'local-deliberado'},{...source,territory_id:'manica'},initial.metadata);
assert.equal('territory_id' in next.patch,false);
assert.ok(next.conflicts.includes('territory_id'));
});
test('report keeps each park attached to its own opportunity after only the second changes',()=>{
const choices=[{opportunity:{key:'opportunity:1',title:'Primeira'},territory:{title:'Sofala'},park:{title:'Parque Sofala'}},{opportunity:{key:'opportunity:2',title:'Segunda'},territory:{title:'Manica'},park:{title:'Parque Manica'}}];
const rows=buildProjectDossierRows({context_applicability_snapshot:JSON.stringify({version:1,opportunity_choices:choices})});
const parks=rows.filter(r=>r[1]==='Zona/parque da oportunidade');
assert.deepEqual(parks.map(r=>[r[2],r[3]]),[['Parque Sofala','Primeira; opportunity:1'],['Parque Manica','Segunda; opportunity:2']]);
});