优化: AI Chat全栈多批审查修复与架构清理(risk_level清理/路由解耦/工具渲染/测试补测/死代码)
This commit is contained in:
@@ -177,3 +177,84 @@ pub fn object_schema(properties: Vec<(&str, &str, bool)>) -> Value {
|
||||
"required": required,
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
/// 构造一个空参恒返 Ok 的 handler(注册测试用·不实际执行)
|
||||
fn dummy_handler() -> AiToolHandler {
|
||||
Box::new(|_args: Value| {
|
||||
Box::pin(async { Ok(serde_json::json!({ "ok": true })) })
|
||||
as Pin<Box<dyn Future<Output = anyhow::Result<Value>> + Send>>
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn risk_level_serde_lowercase() {
|
||||
// serde rename_all="lowercase": Low→"low" / Medium→"medium" / High→"high"
|
||||
assert_eq!(serde_json::to_string(&RiskLevel::Low).unwrap(), "\"low\"");
|
||||
assert_eq!(serde_json::to_string(&RiskLevel::Medium).unwrap(), "\"medium\"");
|
||||
assert_eq!(serde_json::to_string(&RiskLevel::High).unwrap(), "\"high\"");
|
||||
assert_eq!(
|
||||
serde_json::from_str::<RiskLevel>("\"high\"").unwrap(),
|
||||
RiskLevel::High
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_and_get_tool() {
|
||||
let mut reg = AiToolRegistry::new();
|
||||
assert!(reg.is_empty());
|
||||
reg.register(
|
||||
"list_tasks",
|
||||
"列出任务",
|
||||
object_schema(vec![]),
|
||||
RiskLevel::Low,
|
||||
dummy_handler(),
|
||||
);
|
||||
assert!(!reg.is_empty());
|
||||
assert_eq!(reg.len(), 1);
|
||||
assert_eq!(reg.get("list_tasks").unwrap().risk_level, RiskLevel::Low);
|
||||
assert!(reg.get("nonexistent").is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_same_name_overwrites() {
|
||||
// 同名二次注册覆盖(HashMap insert 语义)·非新增·后注册的 risk_level 胜出
|
||||
let mut reg = AiToolRegistry::new();
|
||||
reg.register("t", "v1", object_schema(vec![]), RiskLevel::Low, dummy_handler());
|
||||
reg.register("t", "v2", object_schema(vec![]), RiskLevel::High, dummy_handler());
|
||||
assert_eq!(reg.len(), 1);
|
||||
assert_eq!(reg.get("t").unwrap().risk_level, RiskLevel::High);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn tool_definitions_and_names() {
|
||||
let mut reg = AiToolRegistry::new();
|
||||
reg.register("a", "desc a", object_schema(vec![]), RiskLevel::Low, dummy_handler());
|
||||
reg.register("b", "desc b", object_schema(vec![]), RiskLevel::Medium, dummy_handler());
|
||||
assert_eq!(reg.tool_definitions().len(), 2);
|
||||
let names = reg.tool_names();
|
||||
assert_eq!(names.len(), 2);
|
||||
assert!(names.contains(&"a".to_string()));
|
||||
assert!(names.contains(&"b".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_is_empty() {
|
||||
let reg = AiToolRegistry::default();
|
||||
assert!(reg.is_empty());
|
||||
assert_eq!(reg.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_schema_collects_required() {
|
||||
let schema = object_schema(vec![("name", "string", true), ("age", "integer", false)]);
|
||||
assert_eq!(schema["type"], "object");
|
||||
assert_eq!(schema["properties"]["name"]["type"], "string");
|
||||
let required = schema["required"].as_array().unwrap();
|
||||
assert_eq!(required.len(), 1);
|
||||
assert_eq!(required[0], "name");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user