Files
zyt/server/tests/DiagnosisAiAnalysisParserTest.php
2026-08-14 14:37:30 +08:00

82 lines
2.9 KiB
PHP

<?php
declare(strict_types=1);
require dirname(__DIR__) . '/vendor/autoload.php';
use app\adminapi\logic\tcm\DiagnosisAiLogic;
function analysisParserExpect(bool $condition, string $message): void
{
if (!$condition) {
fwrite(STDERR, "FAIL: {$message}\n");
exit(1);
}
}
$parse = (new ReflectionClass(DiagnosisAiLogic::class))->getMethod('parseAnalysisResponse');
$validPayload = [
'diagnosis_advice' => '倾向气阴两虚,仍需结合舌脉复核。',
'risk_assessment' => [
['label' => '血糖控制不足风险', 'level' => 'high'],
['label' => '信息缺失导致误判风险', 'level' => 'medium'],
],
'treatment_advice' => '复核血糖记录与并发症筛查,再由医师确定方案。',
];
$json = json_encode($validPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
analysisParserExpect(is_string($json), 'fixture JSON encodes');
$parsed = $parse->invoke(null, $json);
analysisParserExpect($parsed === $validPayload, 'plain JSON parses without changing contract');
$fenced = "说明文字\n```json\n{$json}\n```\n后续文字";
analysisParserExpect($parse->invoke(null, $fenced) === $validPayload, 'fenced JSON with surrounding text parses');
$wrapped = json_encode(['data' => $json], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
analysisParserExpect(
is_string($wrapped) && $parse->invoke(null, $wrapped) === $validPayload,
'common string wrapper parses'
);
$invalidLevel = $validPayload;
$invalidLevel['risk_assessment'][0]['level'] = 'urgent';
analysisParserExpect(
$parse->invoke(null, json_encode($invalidLevel, JSON_UNESCAPED_UNICODE)) === null,
'unknown risk enum is rejected'
);
$tooManyRisks = $validPayload;
$tooManyRisks['risk_assessment'] = array_fill(0, 9, ['label' => '风险', 'level' => 'low']);
analysisParserExpect(
$parse->invoke(null, json_encode($tooManyRisks, JSON_UNESCAPED_UNICODE)) === null,
'more than eight risks is rejected'
);
$overlongAdvice = $validPayload;
$overlongAdvice['diagnosis_advice'] = str_repeat('诊', 1201);
analysisParserExpect(
$parse->invoke(null, json_encode($overlongAdvice, JSON_UNESCAPED_UNICODE)) === null,
'overlong advice is rejected rather than truncated'
);
$overlongLabel = $validPayload;
$overlongLabel['risk_assessment'][0]['label'] = str_repeat('险', 121);
analysisParserExpect(
$parse->invoke(null, json_encode($overlongLabel, JSON_UNESCAPED_UNICODE)) === null,
'overlong risk label is rejected'
);
$wrongType = $validPayload;
$wrongType['risk_assessment'] = 'low';
analysisParserExpect(
$parse->invoke(null, json_encode($wrongType, JSON_UNESCAPED_UNICODE)) === null,
'non-array risk assessment is rejected'
);
analysisParserExpect($parse->invoke(null, 'not json') === null, 'non-JSON response fails safely');
analysisParserExpect(
$parse->invoke(null, str_repeat('x', 32769)) === null,
'oversized upstream response fails safely'
);
echo "Diagnosis AI analysis parser: OK\n";