diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs index 8a39c95ef..bf0d8103e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs @@ -279,21 +279,32 @@ mod tests { for line in &lines { assert!(!line.contains('\n'), "{line}"); } - // 落盘边界按真实口径核验:应用日志的整行脱敏既不能吃掉身份字段,也不能靠换行拆行。 - let persisted = crate::sanitize_diagnostic_message(&lines.join(" "), None); - assert!(persisted.contains("eventId=error-1-1"), "{persisted}"); - assert!(persisted.contains("code=turn-idle-timeout"), "{persisted}"); + // 落盘边界按真实口径核验:应用日志逐行脱敏、逐行截断,两行不会先拼在一起。 + let persisted = lines + .iter() + .map(|line| crate::sanitize_diagnostic_message(line, None)) + .collect::>(); + for line in &persisted { + assert!(!line.contains("token=secret"), "{line}"); + assert!(line.chars().count() <= 2_048, "{line}"); + } + let identity = &persisted[0]; + assert!(identity.contains("eventId=error-1-1"), "{identity}"); + assert!(identity.contains("code=turn-idle-timeout"), "{identity}"); assert!( - persisted.contains("detailRef=.agent/runtime/errors/error-1-1.json"), - "{persisted}" + identity.contains("detailRef=.agent/runtime/errors/error-1-1.json"), + "{identity}" ); - assert!(persisted.contains("summary=本轮没有收到完成事件 附带换行")); - assert!(persisted.contains("detail= 第二行诊断")); assert!( - !persisted.contains("token=secret") && !persisted.contains("Bearer secret"), - "{persisted}" + identity.contains("summary=本轮没有收到完成事件 附带换行"), + "{identity}" ); - assert!(persisted.chars().count() <= 2_048, "{persisted}"); + let detail = &persisted[1]; + assert!( + detail.contains("detail= 第二行诊断"), + "{detail}" + ); + assert!(!detail.contains("Bearer secret"), "{detail}"); } #[test]