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

21 lines
3.5 KiB
PHP

<?php
// Negative semantic branches use real snapshots in memory only; no database mutations.
use App\Models\Opportunity;
use App\Services\OpportunityCanonicalContract;
use App\Services\OpportunityManagement;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
$dir=dirname(__DIR__).'/storage/app/private/investmoz-v2/portal-audit';
$plan=json_decode(file_get_contents($dir.'/portal-stability-latest.json'),true,512,JSON_THROW_ON_ERROR);
putenv('STABILITY_QA_MODE=consumers');$app=require $plan['source'].'/tools/portal-stability-runtime.php';
$cases=[30=>['funding_sought',1,'canonical.investment_breakdown'],31=>['real_estate.use_license_document_id',null,'canonical.real_estate.use_license_document_id'],32=>['land_rights.parcels.0.geometry',['type'=>'MultiPolygon','coordinates'=>[]],'canonical.land_rights.parcels.0.geometry'],33=>['business_transaction.asking_price',0,'canonical.business_transaction.asking_price'],34=>['business_transaction.governance_rights',null,'canonical.business_transaction.governance_rights'],35=>['business_transaction.franchise_terms.brand','','canonical.business_transaction.franchise_terms.brand']];
$proof=DB::transaction(function()use($cases){DB::statement('SET TRANSACTION READ ONLY');$rows=[];
foreach($cases as $id=>[$field,$invalid,$expected]){$r=Opportunity::findOrFail($id);$payload=app(OpportunityManagement::class)->values($r)['canonical'];$copy=clone $r;Arr::set($payload,$field,$invalid);$draft=json_decode($copy->management_draft,true,512,JSON_THROW_ON_ERROR);$draft['canonical']=$payload;$copy->management_draft=json_encode($draft,JSON_THROW_ON_ERROR);$errors=[];
try{app(OpportunityCanonicalContract::class)->validateSubmission($copy);}catch(ValidationException $e){$errors=$e->errors();}
throw_unless(isset($errors[$expected]),RuntimeException::class,'Expected field rejection absent: '.$r->opportunity_category.' '.$expected);
$rows[]=['id'=>$id,'category'=>$r->opportunity_category,'invalid_field'=>$field,'expected_error'=>$expected,'observed_error'=>$errors[$expected],'in_memory_only'=>true];}
foreach(['rent','rent_periodicity']as$field){$r=Opportunity::findOrFail(31);$copy=clone $r;$draft=json_decode($copy->management_draft,true,512,JSON_THROW_ON_ERROR);$draft['canonical']['real_estate']['transaction_type']='lease';$draft['canonical']['real_estate']['rent']=$field==='rent'?0:100;$draft['canonical']['real_estate']['rent_periodicity']=$field==='rent_periodicity'?null:'monthly';$copy->management_draft=json_encode($draft,JSON_THROW_ON_ERROR);$errors=[];try{app(OpportunityCanonicalContract::class)->validateSubmission($copy);}catch(ValidationException $e){$errors=$e->errors();}$expected='canonical.real_estate.'.$field;throw_unless(isset($errors[$expected])&&!isset($errors['canonical.real_estate.price']),RuntimeException::class,'Lease error must identify the affected field.');$rows[]=['id'=>31,'category'=>'real_estate','modality'=>'lease','invalid_field'=>$field,'expected_error'=>$expected,'observed_error'=>$errors[$expected],'in_memory_only'=>true,'visual_lease_not_implied'=>true];}
return ['at'=>gmdate('c'),'result'=>'passed','target'=>DB::selectOne('select current_database() as database,inet_server_port() as port'),'cases'=>$rows,'active_writes'=>0,'interface_not_implied'=>true];});
file_put_contents($dir.'/functional-category-semantics-qa-20261011.json',json_encode($proof,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR));echo json_encode($proof,JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR).PHP_EOL;