<?php
require __DIR__.'/db.php';$pre=json_decode(file_get_contents(__DIR__.'/private-preflight.json'),true);$check($pre['safe'],'Preflight first');
$day=$lane==='B'?'DATE(CREATE_TIME)':'CAST(CREATE_TIME AS DATE)';$sql='SELECT '.$day.' AS AUDIT_DAY,EVENT_CODE,COUNT(*) AS CNT FROM '.$p.'security_audit_log WHERE STORE_ID=10001 AND IS_DELETE=0 AND CREATE_TIME IS NOT NULL GROUP BY '.$day.',EVENT_CODE HAVING COUNT(*) BETWEEN 3 AND 100 ORDER BY AUDIT_DAY ASC,EVENT_CODE ASC';
$groups=$q($lane==='B'?$sql.' LIMIT 1':'SELECT * FROM ('.$sql.') WHERE ROWNUM<=1');
$check(count($groups)===1,'No bounded nonempty historical scope');$scope=['date'=>substr($groups[0]['audit_day'],0,10),'event_code'=>$groups[0]['event_code']];$save('private-scope.json',$scope);
require __DIR__.'/oracle.php';$rows=$source();$check(count($rows)>=3,'Historical scope >=3');$check($actor===$actorNow(),'Actor unchanged');$save('private-baseline.json',['source'=>$rows,'actor'=>$actor]);
$lock=[];foreach(['p/controller/SecurityAudit.php','common/service/SecurityAuditService.php','common/service/BaseService.php','base/AdminController.php','common.php']as $file)$lock[$file]=hash_file('sha256',__DIR__.'/source/application/'.$file);$save('private-source-lock.json',$lock);
$spec=[['label'=>'history_page1','params'=>$scope+['page'=>1,'page_size'=>2]],['label'=>'history_page2','params'=>$scope+['page'=>2,'page_size'=>2]],['label'=>'no_match','params'=>$scope+['page'=>1,'pageSize'=>2,'keyword'=>'CDXSECABSENT'.bin2hex(random_bytes(8))]]];
foreach($spec as &$s){$s['params']['start_date']=$s['params']['date'];$s['params']['end_date']=$s['params']['date'];unset($s['params']['date']);}unset($s);
require_once $root.'/application/base/Security.php';$a=$actor;$token=\app\base\Security::encrypt(implode("\t",[(string)$a['id'],(string)$a['uuid'],(string)$a['account'],'0','','',(string)$a['account']]));
$items=[];foreach($spec as $s){$items[]=['id'=>$s['label'],'name'=>$s['label'],'type'=>'http','metaInfo'=>['type'=>'HTTP'],'request'=>['method'=>'POST','header'=>[['key'=>'X-CDX-Case','value'=>$s['label']],['key'=>'token','value'=>$token],['key'=>'Content-Type','value'=>'application/x-www-form-urlencoded']],'url'=>'http://127.0.0.1:'.($lane==='B'?18321:18322).'/p/securityAudit/lists','body'=>['mode'=>'urlencoded','urlencoded'=>array_map(static function($k,$v){return ['key'=>$k,'value'=>(string)$v,'type'=>'text'];},array_keys($s['params']),array_values($s['params']))]],'event'=>[['listen'=>'test','script'=>['type'=>'text/javascript','exec'=>["pm.test('HTTP200',()=>pm.response.to.have.status(200));","const b=pm.response.json();","pm.test('business code0',()=>pm.expect(b.code).to.eql(0));","pm.test('list envelope',()=>{pm.expect(b.data.data).to.be.an('array');pm.expect(b.data.per_page).to.eql(2);});","pm.test('18 fields and MySQL seconds',()=>b.data.data.forEach(r=>{pm.expect(Object.keys(r)).to.have.lengthOf(18);pm.expect(r.created_at).to.match(/^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/);}));"]]]]];}
$save('private-spec.json',$spec);$save('private-suite.json',['apifoxCli'=>'2.2.8','info'=>['name'=>'SecurityAudit '.$lane],'item'=>[['name'=>'Frozen historical source','item'=>$items]]]);echo json_encode(['lane'=>$lane,'cases'=>3,'scope_count'=>count($rows),'scope_sha256'=>$hash($scope),'source_sha256'=>$hash($rows),'source_lock'=>$lock]),"\n";
