45 lines
3.4 KiB
Python
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))
|