<?php
register_shutdown_function(static function():void{$error=error_get_last();if($error)file_put_contents(__DIR__.'/private-prepare-error.json',json_encode($error));});
require __DIR__.'/state.php';$label=getenv('PM_CASE');$s=$state();$diff=[];foreach(['staff','user','actor']as $t)foreach($s[$t][0]as $k=>$v)if($v!==$lease['baseline'][$t][0][$k])$diff[$t][$k]=['before_type'=>gettype($lease['baseline'][$t][0][$k]),'after_type'=>gettype($v),'before_sha256'=>$hash($lease['baseline'][$t][0][$k]),'after_sha256'=>$hash($v)];$save('private-reference-diff.json',$diff);$guard($s,true);$rows=$own($s);$staff=$lease['staff_uuid'];$marker=$lease['marker'];
$add=['staff_uuid'=>$staff,'test_content'=>'数据库兼容测试大纲考核 '.$marker."\n中文'完整内容",'test_time'=>'2001-02-03','achievement'=>'优秀12.5','demo'=>'数据库兼容测试备注 '.$marker."\n单引号'原文"];
$updated=['test_content'=>'数据库兼容测试更新 '.$marker."\n更新'完整中文",'test_time'=>'2001-02-04','achievement'=>'良好9.75','demo'=>'数据库兼容测试更新备注 '.$marker."\n备注'全文"];
$spec=['label'=>$label,'method'=>'','params'=>[],'expected'=>[]];$success=static function($message):array{return ['code'=>0,'message'=>$message];};$reject=static function($message):array{return ['code'=>1,'message'=>$message];};
switch($label){
case 'add_initial':case 'add_retry':$check(count($rows)===0,'No existing new row before add');$spec['method']='add';$spec['params']=$add;$spec['expected']=$success('添加成功');break;
case 'add_missing':$spec['method']='add';$spec['params']=$add;unset($spec['params']['staff_uuid']);$spec['params']['test_content'].='_missing';$spec['expected']=$reject('组织uuid不可为空');break;
case 'add_bad_date':$spec['method']='add';$spec['params']=$add;$spec['params']['test_time']='not-a-date';$spec['params']['test_content'].='_bad_date';$spec['expected']=$reject('测试时间格式不正确');break;
case 'add_long_achievement':$spec['method']='add';$spec['params']=$add;$spec['params']['achievement']=str_repeat('9',21);$spec['params']['test_content'].='_long';$spec['expected']=$reject('成绩最大值20个字符');break;
case 'update':case 'update_retry':$check(count($rows)===1,'Exactly one API new own row');$r=$rows[0];$check($r['staff_uuid']===$staff&&preg_match('/^[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}$/D',$r['uuid'])===1&&!in_array((string)$r['id'],['1','2'],true),'Generated own UUID/PK/Staff');$spec['method']='update';$spec['params']=['uuid'=>$r['uuid']]+$updated;$spec['expected']=$success('修改成功');break;
case 'update_missing':$spec['method']='update';$spec['params']=$updated;$spec['expected']=$reject('uuid不可为空');break;
case 'update_absent':$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'syllabus_evaluate WHERE UUID=?',[$lease['absent_uuid']])[0]['cnt']===0,'Absent update UUID');$spec['method']='update';$spec['params']=['uuid'=>$lease['absent_uuid']]+$updated;$spec['expected']=$reject('大纲考核不存在');break;
case 'info_created':case 'info_updated':$check(count($rows)===1,'Own API row for info');$spec['method']='info';$spec['params']=['uuid'=>$rows[0]['uuid']];$spec['expected']=['code'=>0,'message'=>'查询成功','data'=>$info($rows[0])];break;
case 'list_created':case 'list_updated':case 'list_saved':case 'list_restored':case 'list_deleted':$spec['method']='lists';$spec['params']=['staff_uuid'=>$staff,'page'=>'1'];$spec['expected']=$listing($s);break;
case 'save':case 'save_retry':$check(count($s['syllabus_evaluate_ext'])===1&&(string)$s['syllabus_evaluate_ext'][0]['id']==='1','Only exact existing ext UPDATE');$spec['method']='save';$spec['params']=['staff_uuid'=>$staff,'content'=>'数据库兼容测试综合评定更新 '.$marker."\n综合'完整中文第二行"];$spec['expected']=$success('编辑成功');break;
case 'save_restore':$check(count($s['syllabus_evaluate_ext'])===1&&(string)$s['syllabus_evaluate_ext'][0]['id']==='1','Restore exact original ext');$spec['method']='save';$spec['params']=['staff_uuid'=>$staff,'content'=>$lease['baseline']['syllabus_evaluate_ext'][0]['content']];$spec['expected']=$success('编辑成功');break;
case 'save_missing':$spec['method']='save';$spec['params']=['content'=>'数据库兼容测试拒绝 '.$marker];$spec['expected']=$reject('组织uuid不可为空');break;
case 'delete':$check(count($rows)===1,'Only exact API new own row to delete');$r=$rows[0];$check($r['staff_uuid']===$staff&&!in_array((string)$r['id'],['1','2'],true),'Own new Staff/PK before delete');$save('private-deleted-own.json',$r);$spec['method']='delete';$spec['params']=['uuid'=>$r['uuid']];$spec['expected']=$success('删除成功');break;
case 'delete_retry':case 'info_deleted':$r=json_decode(file_get_contents(__DIR__.'/private-deleted-own.json'),true);$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'syllabus_evaluate WHERE UUID=?',[$r['uuid']])[0]['cnt']===0,'Own deleted absent');$spec['method']=$label==='info_deleted'?'info':'delete';$spec['params']=['uuid'=>$r['uuid']];$spec['expected']=$reject($label==='info_deleted'?'大纲考核纪要不存在':'删除失败');break;
case 'delete_missing':$spec['method']='delete';$spec['params']=[];$spec['expected']=$reject('删除失败');break;
default:throw new RuntimeException('Case outside approved whitelist');}
$wirePath=__DIR__.'/private-wire.jsonl';if(is_file($wirePath))foreach(explode("\n",trim(file_get_contents($wirePath)))as $line){$w=json_decode($line,true);$check($w['label']!==$label,'No duplicate executed label');}
$save('private-spec.json',$spec);require $root.'/application/base/Security.php';$a=$s['actor'][0];$token=\app\base\Security::encrypt(implode("\t",[(string)$a['id'],(string)$a['uuid'],(string)$a['account'],'0','','',(string)$a['account']]));
$tests=["pm.test('HTTP200',()=>pm.response.to.have.status(200));","const b=pm.response.json();","pm.test('exact business code and message',()=>{pm.expect(b.code).to.eql(".$spec['expected']['code'].");pm.expect(b.message).to.eql(".json_encode($spec['expected']['message'],JSON_UNESCAPED_UNICODE).");});","pm.test('complete original response fields values and native JSON types',()=>pm.expect(b).to.deep.eql(".json_encode($spec['expected'],JSON_UNESCAPED_UNICODE)."));"];
$item=['id'=>$label,'name'=>$label,'type'=>'http','metaInfo'=>['type'=>'HTTP'],'request'=>['method'=>'POST','header'=>[['key'=>'X-CDX-Case','value'=>$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/syllabusEvaluate/'.$spec['method'],'body'=>['mode'=>'urlencoded','urlencoded'=>array_map(static function($k,$v){return ['key'=>$k,'value'=>(string)$v,'type'=>'text'];},array_keys($spec['params']),array_values($spec['params']))]],'event'=>[['listen'=>'test','script'=>['type'=>'text/javascript','exec'=>$tests]]]];
$save('private-suite.json',['apifoxCli'=>'2.2.8','info'=>['name'=>'SyllabusEvaluate CRUD '.$lane.' '.$label],'item'=>[['name'=>'Bounded own marked record only','item'=>[$item]]]]);echo json_encode(['lane'=>$lane,'case'=>$label,'method'=>$spec['method'],'rows_before'=>count($rows)]),"\n";
