Files
zyt/server/tests/DiagnosisAiAnalysisParserTest.php
T
2026-10-08 18:03:11 +08:00

99 lines
3.5 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');
foreach (['diagnosis_ad', 'diagnosis_adive'] as $alias) {
$misspelled = $validPayload;
$misspelled[$alias] = $misspelled['diagnosis_advice'];
unset($misspelled['diagnosis_advice']);
analysisParserExpect(
$parse->invoke(null, json_encode($misspelled, JSON_UNESCAPED_UNICODE)) === $validPayload,
"observed {$alias} typo maps to canonical diagnosis field"
);
}
$ambiguous = $validPayload;
$ambiguous['diagnosis_ad'] = '另一段诊断';
analysisParserExpect(
$parse->invoke(null, json_encode($ambiguous, JSON_UNESCAPED_UNICODE)) === null,
'conflicting diagnosis fields are rejected'
);
$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";