test(ai): erp-ai 从零增至 34 个单元测试 — 覆盖 DTO/error/prompt/sanitization
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- dto.rs: 8 个测试(AnalysisType 映射、serde round-trip、SSE 事件、默认值)
- error.rs: 10 个测试(AiError 全部 10 个变体 → AppError 映射)
- prompt: 8 个测试(变量替换、嵌套对象、数组迭代、条件、严格模式缺失变量)
- sanitization: 8 个测试(4 种 DTO 脱敏通过、PII 字段检测、空数据边界)
This commit is contained in:
iven
2026-04-28 18:17:19 +08:00
parent dde6b09017
commit 50e63530d9
4 changed files with 435 additions and 0 deletions

View File

@@ -23,3 +23,86 @@ impl PromptRenderer {
.map_err(|e| AiError::TemplateError(format!("模板渲染失败: {e}")))
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
fn renderer() -> PromptRenderer {
PromptRenderer::new()
}
#[test]
fn render_simple_variable() {
let r = renderer();
let result = r.render("你好 {{name}}", &json!({"name": "患者"})).unwrap();
assert_eq!(result, "你好 患者");
}
#[test]
fn render_multiple_variables() {
let r = renderer();
let result = r.render(
"{{age_group}} {{sex}} 化验报告",
&json!({"age_group": "中年", "sex": "男性"}),
)
.unwrap();
assert_eq!(result, "中年 男性 化验报告");
}
#[test]
fn render_with_nested_object() {
let r = renderer();
let data = json!({
"report": { "date": "2026-05-01", "department": "内科" }
});
let result = r.render("科室: {{report.department}},日期: {{report.date}}", &data).unwrap();
assert_eq!(result, "科室: 内科,日期: 2026-05-01");
}
#[test]
fn render_with_array_iteration() {
let r = renderer();
let data = json!({"items": ["WBC", "HGB", "PLT"]});
let result = r.render("指标: {{#each items}}{{this}}, {{/each}}", &data).unwrap();
assert_eq!(result, "指标: WBC, HGB, PLT, ");
}
#[test]
fn render_missing_variable_in_strict_mode_errors() {
let r = renderer();
let result = r.render("你好 {{missing_var}}", &json!({}));
assert!(result.is_err());
match result.unwrap_err() {
AiError::TemplateError(msg) => assert!(msg.contains("missing_var")),
other => panic!("期望 TemplateError得到 {:?}", other),
}
}
#[test]
fn render_empty_template() {
let r = renderer();
let result = r.render("", &json!({})).unwrap();
assert_eq!(result, "");
}
#[test]
fn render_template_with_no_variables() {
let r = renderer();
let result = r.render("这是一段固定文本", &json!({})).unwrap();
assert_eq!(result, "这是一段固定文本");
}
#[test]
fn render_with_conditional() {
let r = renderer();
let data = json!({"is_abnormal": true, "value": "偏高"});
let result = r.render(
"{{#if is_abnormal}}异常: {{value}}{{else}}正常{{/if}}",
&data,
)
.unwrap();
assert_eq!(result, "异常: 偏高");
}
}