Files
SGF/scripts/sgf-analysis-boundaries.php
T
2026-11-11 09:00:17 +02:00

8 lines
3.3 KiB
PHP

<?php
use Illuminate\Support\Facades\{DB,Crypt};use App\Shared\Context\CompanyContext;
require __DIR__.'/sgf-analysis-proof-bootstrap.php';$before=$host->table('an_criteria')->count();$metric='cash_expense_share';$host->beginTransaction();try{
$d=$criterionData($metric);$d['evidence']='Literal%_! metadata reference for history pagination.';[$p]=$analysisCommand(13,$criterionInput('prepare',$metric,0,$d));$template=(array)$host->table('an_criteria')->find($p['id']);unset($template['id']);$previous=$p['id'];for($i=1;$i<=126;$i++){$template['previous_id']=$previous;$template['version']=$i+1;$previous=$host->table('an_criteria')->insertGetId($template);}$selectAnalysis(17);$a=$analysis->listing(17,['view'=>'history','metric'=>$metric,'per_page'=>25]);$all=[];for($page=1;$page<=$a['records']['last_page'];$page++)$all=array_merge($all,$analysis->listing(17,['view'=>'history','metric'=>$metric,'per_page'=>25,'page'=>$page])['records']['data']);$ok(count($all)===127&&count(array_unique(array_column($all,'id')))===127,'127 criterion metadata versions paginated25');$a=$analysis->listing(17,['view'=>'history','metric'=>$metric,'per_page'=>100]);$a2=$analysis->listing(17,['view'=>'history','metric'=>$metric,'per_page'=>100,'page'=>2]);$ok(count($a['records']['data'])===100&&count($a2['records']['data'])===27,'pages100/27 same history universe');$ok($analysis->listing(17,['search'=>'%_!'])['records']['total']===1,'literal search on latest criterion evidence');$reject(fn()=>$analysis->listing(17,['per_page'=>500]),422,'unbounded page refused');$reject(fn()=>$analysis->listing(17,['view'=>'history']),422,'history requires explicit metric');
$cut=$analysisPreview(13,$criterionInput('prepare',$metric,127,$criterionData($metric)));$selectAnalysis(13,'changed-generation');$reject(fn()=>$analysis->confirm(13,$cut['preview']),409,'changed generation invalidates preview');$selectAnalysis(13);$c=json_decode(Crypt::decryptString($cut['preview']),true);$c['observed']=time()-601;$reject(fn()=>$analysis->confirm(13,Crypt::encryptString(json_encode($c))),409,'expired preview refused');request()->attributes->set('sgf_module','accounting');$reject(fn()=>$analysis->listing(13,[]),403,'wrong module refused');$selectAnalysis(13);$reject(function()use($analysis){app(CompanyContext::class)->selectFor(13,1,2,1);return $analysis->listing(13,[]);},403,'wrong unit refused');$selectAnalysis(13);
$attempt=function($fn)use($host){$host->beginTransaction();try{$fn();return false;}catch(Illuminate\Database\QueryException){return true;}finally{$host->rollBack();}};$ok($attempt(fn()=>$host->table('an_criteria')->where('id',$previous)->update(['reason'=>'Attempted alteration of immutable QA criteria'])),'SQL criteria append-only');$bad=$template;$bad['previous_id']=$previous;$bad['version']=128;$bad['actor_id']=17;$bad['prepared_by']=17;$ok($attempt(fn()=>$host->table('an_criteria')->insert($bad)),'SQL unprivileged writer refused');
}finally{$host->rollBack();}$ok($host->table('an_criteria')->count()===$before,'all metadata fixtures rolled back');file_put_contents($work.'/analysis-boundaries.json',json_encode(['passed'=>true,'checks'=>$checks,'metadata_fixtures'=>127,'origin_simulated_in_harness'=>true,'rolled_back'=>true],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/analysis-boundaries.json']).PHP_EOL;