<?php
declare(strict_types=1);
require __DIR__.'/bootstrap.php';require __DIR__.'/StrictWire.php';$p=json_decode(file_get_contents($runtime.'/private-report.json'),true);$rows=$query('SELECT * FROM yoshop_page WHERE store_id IN (2147001521,2147001522) ORDER BY page_id');$before=$snapshot();$tokens=[];$items=[];$oracles=[];
foreach($tenants as $module=>$tenant){$token=bin2hex(random_bytes(24));$tokens[]=$token;$cache->set($token,['user'=>['store_user_id'=>$tenant,'store_id'=>$tenant,'real_name'=>$marker,'user_name'=>$marker,'is_super'=>1],'store_id'=>$tenant,'is_login'=>true],1800);foreach($p['owned'][$module] as $index=>$id){$row=$query('SELECT * FROM yoshop_page WHERE page_id=? AND store_id=?',[$id,$tenant])[0];$model=new \app\common\model\Page;$expected=[];foreach($row as $key=>$value){if(in_array($key,['page_id','page_type','store_id','is_delete'],true))$expected[$key]=(int)$value;elseif(in_array($key,['create_time','update_time'],true))$expected[$key]=date('Y-m-d H:i:s',(int)$value);elseif($key==='page_data')$expected[$key]=$model->getPageDataAttr($value);else $expected[$key]=$value;}$scenario='PILOT_PG_FINAL_'.strtoupper($module).'_DETAIL_'.$index;$data=['detail'=>$expected];$oracles[$scenario]=['original_row'=>$row,'complete_expected_data'=>$data];$items[]=['id'=>$scenario,'name'=>$module.' final exact original row '.$index,'type'=>'http','metaInfo'=>['type'=>'HTTP'],'request'=>['method'=>'GET','url'=>$base.'/'.$module.'/page/detail?pageId='.$id,'header'=>[['key'=>'Host','value'=>$module.'.page-config.invalid'],['key'=>'Access-Token','value'=>$token],['key'=>'Platform','value'=>'POC'],['key'=>'X-Pilot-Scenario','value'=>$scenario]]],'event'=>[['listen'=>'test','script'=>['type'=>'text/javascript','exec'=>["pm.test('HTTP200',function(){pm.response.to.have.status(200);});var b=pm.response.json();","pm.test('Numeric business200',function(){pm.expect(b.status).to.eql(200);});","pm.test('Complete original eight column projection values types containers order',function(){pm.expect(b.data).to.deep.eql(".json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION).");});","pm.test('Retained metadata nonhome and softdeleted',function(){pm.expect(b.data.detail.page_type).to.eql(20);pm.expect(b.data.detail.is_delete).to.eql(1);});"]]]]];}}
$collection=['apifoxCli'=>'2.2.8','info'=>['name'=>'Page完整原表投影只读复验'],'item'=>[['name'=>'四条自有留存页面','item'=>$items]]];file_put_contents($runtime.'/private-final-collection.json',json_encode($collection,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));chmod($runtime.'/private-final-collection.json',0600);$dir=$runtime.'/private-final-cli-report';if(!is_dir($dir))mkdir($dir,0700);$proc=proc_open(['node','/tmp/cdx-apifox-cli-page-2.2.8/bin/cli.js','run',$runtime.'/private-final-collection.json','-r','json','--out-dir',$dir,'--out-file','result','--on-error','continue','--silent'],[0=>['file','/dev/null','r'],1=>['file',$runtime.'/private-final-cli.log','a'],2=>['file',$runtime.'/private-final-cli.log','a']],$pipes);$exit=proc_close($proc);
$fresh=$connect();$now=$fresh->query('SELECT * FROM yoshop_page WHERE store_id IN (2147001521,2147001522) ORDER BY page_id')->fetchAll(PDO::FETCH_ASSOC);foreach($now as &$r)foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($r,$v);$check($now===$rows&&$snapshot()===$before,'Independent fresh full rows before after final CLI unchanged');$cases=[];foreach(file($runtime.'/private-wire.jsonl',FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) as $l){$w=json_decode($l,true);if(!isset($oracles[$w['scenario']]))continue;$body=json_decode($w['raw']);$want=json_decode(json_encode($oracles[$w['scenario']]['complete_expected_data'],JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION));$equal=strictWireEqual($body->data,$want);$body->trace_id='VALID_DYNAMIC_TRACE';$cases[]=['scenario'=>$w['scenario'],'http_status'=>$w['http_status'],'body'=>$body,'original_oracle'=>$oracles[$w['scenario']],'complete_original_equal'=>$equal,'raw_sha256'=>hash('sha256',$w['raw'])];}
$stats=[];foreach(glob($dir.'/*.json') as $f){$r=json_decode(file_get_contents($f),true);if(isset($r['run']))$stats[]=['stats'=>$r['run']['stats'],'failures'=>count($r['run']['failures']),'raw_report_sha256'=>hash_file('sha256',$f)];}foreach($tokens as $token)$cache->delete($token);$cache->clear();$out=['lane'=>$lane,'native_exit'=>$exit,'cases'=>$cases,'cli_reports'=>$stats,'fresh_original_rows_unchanged'=>true,'natural_sha_unchanged'=>true,'tokens_reclaimed'=>true];file_put_contents(__DIR__.'/final-read-'.$lane.'.json',json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION));foreach($collection['item'][0]['item'] as &$item){$item['request']['url']=str_replace($base,'{{base_url}}',$item['request']['url']);$module=strpos($item['id'],'_STORE_')!==false?'store':'terminal';foreach($item['request']['header'] as &$h)if($h['key']==='Access-Token')$h['value']='{{'.$module.'_token}}';unset($h);}unset($item);file_put_contents(__DIR__.'/page-retained-readonly-'.$lane.'.apifox-cli.json',json_encode($collection,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));echo json_encode(['lane'=>$lane,'native_exit'=>$exit,'requests'=>count($cases),'original_equal'=>array_column($cases,'complete_original_equal')]),"\n";
