test(ai): erp-ai 从零增至 34 个单元测试 — 覆盖 DTO/error/prompt/sanitization
- 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:
@@ -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, "异常: 偏高");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user