From ddad7166add394f06325719d972ae1b4c3fce16b Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 5 Jun 2026 15:24:51 -0600 Subject: [PATCH] test: added a few additional tests to the request_context surrounding the skills system --- src/config/request_context.rs | 61 ++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/config/request_context.rs b/src/config/request_context.rs index d068765..99eaed4 100644 --- a/src/config/request_context.rs +++ b/src/config/request_context.rs @@ -3073,11 +3073,12 @@ mod tests { use super::super::mcp_factory::McpFactory; use super::*; use crate::config::AppState; - use crate::function::ToolCall; + use crate::function::{ToolCall, skill}; use crate::mcp::{McpServer, McpServersConfig, McpTransportType}; use crate::utils; use crate::utils::get_env_name; use crate::vault::Vault; + use serde_json::json; use serial_test::serial; use std::env; use std::fs::{create_dir_all, remove_dir_all, write}; @@ -3661,12 +3662,14 @@ mod tests { fn select_functions_suppresses_skill_tools_when_role_skills_enabled_false() { let mut ctx = create_test_ctx(); ctx.tool_scope.functions.append_skill_functions(); + ctx.tool_scope.functions.append_todo_functions(); let mut role = Role::new("r", "---\nskills_enabled: false\n---\np"); - role.set_enabled_tools(Some(vec!["foo".to_string()])); + role.set_enabled_tools(Some(vec!["todo__init".to_string()])); let fns = ctx.select_functions(&role).unwrap(); let names: Vec<&str> = fns.iter().map(|f| f.name.as_str()).collect(); + assert!(names.contains(&"todo__init")); assert!(!names.contains(&"skill__list")); assert!(!names.contains(&"skill__load")); assert!(!names.contains(&"skill__unload")); @@ -3724,6 +3727,57 @@ mod tests { assert!(names.contains(&"skill__unload")); } + #[test] + fn fork_for_branch_clones_skill_registry() { + let mut ctx = create_test_ctx(); + let skill = Skill::new("shared", "---\nauto_unload: false\n---\nbody"); + ctx.skill_registry.insert(skill).unwrap(); + + let fork = ctx.fork_for_branch(); + + assert!( + fork.skill_registry.is_loaded("shared"), + "Parallel branches must share loaded skills with parent" + ); + assert!(ctx.skill_registry.is_loaded("shared")); + } + + #[test] + fn handle_skill_tool_returns_error_when_skills_disabled() { + let mut ctx = create_test_ctx(); + let role = Role::new("r", "---\nskills_enabled: false\n---\np"); + ctx.use_role_obj(role).unwrap(); + + let result = run_async(skill::handle_skill_tool( + &mut ctx, + "skill__list", + &json!({}), + )) + .unwrap(); + + assert!( + result.get("error").is_some(), + "Expected error when skills are disabled, got: {result:?}" + ); + } + + #[test] + fn handle_unload_returns_error_when_skill_not_loaded() { + let mut ctx = create_test_ctx(); + + let result = run_async(skill::handle_skill_tool( + &mut ctx, + "skill__unload", + &json!({"name": "ghost"}), + )) + .unwrap(); + + assert!( + result.get("error").is_some(), + "Expected error when unloading unloaded skill, got: {result:?}" + ); + } + #[test] #[serial] fn select_functions_suppresses_skill_tools_when_agent_skills_enabled_false() { @@ -3994,8 +4048,7 @@ mod tests { let input = Input::from_str(&ctx, "hello", None).unwrap(); let app = Arc::clone(&ctx.app.config); - let tool_result = - ToolResult::new(crate::function::ToolCall::default(), serde_json::json!({})); + let tool_result = ToolResult::new(crate::function::ToolCall::default(), json!({})); ctx.after_chat_completion(app.as_ref(), &input, "", &[tool_result]) .unwrap();