Files
Investidor-V2/tools/portal-country-c110-verify.py
T
nala 287e991486
tests / ci (push) Waiting to run
oportunidades 7
2026-10-13 11:40:29 +02:00

45 lines
3.4 KiB
Python

from pathlib import Path
from collections import Counter
import csv,json,hashlib,zipfile
csv.field_size_limit(20_000_000)
ROOT=Path(__file__).resolve().parent.parent
PRIVATE=ROOT/'storage/app/private/investmoz-v2/portal-audit'
DOC=ROOT/'docs/investmoz/v2/auditoria-portal'
OUT=ROOT/'outputs/investmoz-country02-c110-20261011'
read=lambda p:json.loads(Path(p).read_text(encoding='utf-8-sig'))
sha=lambda p:hashlib.sha256(Path(p).read_bytes()).hexdigest()
packet=read(PRIVATE/'country-c110-results-20261011/csv-edits.json')
results=[]
for edit in packet['files']:
file=DOC/edit['filename'];rows=list(csv.reader(file.open(encoding='utf-8-sig',newline='')))
assert len(rows)==len(edit['rows'])
patched={p['row']:p['values'] for p in edit['patches']}
for i,row in enumerate(rows):
expected=list(edit['rows'][i])
for field,value in patched.get(i,{}).items():expected[rows[0].index(field)]=value
assert row==expected
assert all(rows[i][rows[0].index('Estado')]==original[rows[0].index('Estado')] for i,original in enumerate(edit['rows']))
results.append({'file':edit['filename'],'changed_requirements':2,'all_other_cells_and_states_preserved':True,'sha256':sha(file)})
requirements=list(csv.DictReader((DOC/'matriz-requisitos.csv').open(encoding='utf-8-sig',newline='')))
assert len(requirements)==len({r['ID'] for r in requirements})==3393
assert sum(int(r['Quantidade de linhas de origem']) for r in requirements)==6845
envelope=read(OUT/'manifesto-pacote.json');manifest=read(OUT/'manifesto-candidata.json')
assert sha(OUT/'manifesto-candidata.json')==envelope['manifesto_candidata_sha256']
assert sha(OUT/envelope['archive'])==envelope['archive_sha256']
with zipfile.ZipFile(OUT/envelope['archive']) as z:
assert len(z.namelist())==envelope['archive_entries']
for name,digest in envelope['verified_members_sha256'].items():assert hashlib.sha256(z.read(name)).hexdigest()==digest
assert not any(any(part in ['.env','vendor','node_modules','database.dump','actors-private.json'] for part in Path(name).parts) for name in z.namelist())
plan=read(PRIVATE/'country-c110-source-latest.json');source=Path(plan['source'])
for name,digest in plan['baseline_live_sources'].items():assert sha(ROOT/name)==digest
stage=read(PRIVATE/'country-c110-production-stage-latest.json')
for name,digest in stage['active_assets'].items():assert sha(ROOT/'public/build'/name)==digest
for name,digest in manifest['files'].items():assert sha(source/name)==digest
old=read(ROOT/'outputs/investmoz-country02-candidate-20261011/manifesto-pacote.json')
assert sha(ROOT/'outputs/investmoz-country02-candidate-20261011'/old['archive'])==old['archive_sha256']
assert sha(ROOT/'outputs/investmoz-country02-candidate-20261011/manifesto-candidata.json')==old['manifesto_candidata_sha256']
summary={'result':'passed','rows':len(requirements),'unique_requirements':3393,'source_occurrences':6845,'states':dict(Counter(r['Estado'] for r in requirements)),'csv_preservation':results,'live_sources_assets_and_old_package_unchanged':True,'new_package_members_verified':envelope['archive_entries'],'code_hash':manifest['code_hash'],'delivery_revision':manifest['delivery_revision'],'C110':'QA demonstrated','C111':'pending; historical encryption unchanged','activation_ready':False,'active_writes':0,'temporary_c110_server_stopped':True}
(OUT/'verificacao-final.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2),encoding='utf-8')
print(json.dumps(summary,ensure_ascii=False))