Files
SGF/scripts/receipt-runtime-contract.php
T
2026-11-04 09:37:20 +02:00

7 lines
2.2 KiB
PHP

<?php
use Illuminate\Support\Facades\DB;
use App\Modules\Purchasing\ReceiptRuntime;
$s=json_decode(file_get_contents(getenv('RECEIPT_COMPOSITION_STATE')),true,64,JSON_THROW_ON_ERROR);$out=$s['root'].'/runtime-contract.json';if(file_exists($out))throw new LogicException('Contract proof preserved');require $s['app'].'/vendor/autoload.php';$app=require $s['app'].'/bootstrap/app.php';$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();$f=json_decode(file_get_contents($s['root'].'/fixture.json'),true);$checks=[];$ok=function($v,$name)use(&$checks){if(!$v)throw new RuntimeException($name);$checks[]=$name;};$runtime=new ReceiptRuntime;$queries=0;DB::listen(function()use(&$queries){$queries++;});
foreach([[false,'budget-testing',404],[true,'production',403]]as[$enabled,$environment,$status]){config(['receipt_qa.enabled'=>$enabled]);$app->instance('env',$environment);$start=$queries;try{$runtime->run('purchasing_receipts.view',fn()=>true);throw new RuntimeException('Guard did not refuse');}catch(Symfony\Component\HttpKernel\Exception\HttpException $e){$ok($e->getStatusCode()===$status&&$queries===$start,'disabled/production guard refuses before database access '.$status);}}
$app->instance('env','budget-testing');config(['receipt_qa.enabled'=>true]);$actor=App\Models\User::findOrFail($f['actor']);auth()->guard()->setUser($actor);request()->setUserResolver(fn()=>$actor);$ctx=app(App\Shared\Context\CompanyContext::class);$ctx->selectFor($actor->id,$f['tenant'],$f['company'],$f['unit']);$default=DB::getDefaultConnection();$guard=auth()->getDefaultDriver();$value=$runtime->run('purchasing_receipts.view',fn()=>app(Tempo\Purchasing\Embedded\Services\ReplenishmentRun::class)===app(Tempo\Purchasing\Embedded\Services\ReplenishmentRun::class));$ok($value===true,'original replenishment execution context keeps native singleton semantics');$ok(DB::getDefaultConnection()===$default&&auth()->getDefaultDriver()===$guard&&app()->environment('budget-testing')&&DB::connection()->transactionLevel()===0,'local composition restores host database auth environment and transaction ownership');file_put_contents($out,json_encode(['passed'=>true,'checks'=>$checks,'business_writes'=>0],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo count($checks)." runtime contract checks passed.\n";