feat(mcp): implement Prompts capability, Resources, and clean up daemon architecture

This commit is contained in:
Riz Ashraf committed 2026-09-22 21:41:17 +01:00
1 parent 9b9b403ef2
commit 251757f8fc
29 files changed
+1276 -182

No files matched your search

+86
View File
@@ -160,3 +160,89 @@ impl McpTool for GetEnvironmentDetailsHandler {
Ok(data.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
use serde_json::json;
#[tokio::test]
async fn test_env_fingerprint() {
let dir = tempdir().unwrap();
let state = Arc::new(MemoryState::new(dir.path().to_str().unwrap()));
let update_handler = UpdateEnvFingerprintHandler;
let args = json!({
"namespace": "global",
"tool_versions": {
"rustc": "1.70.0"
}
});
let res = update_handler.execute(args, state.clone()).await.unwrap();
assert_eq!(res, "Env fingerprint updated");
let read_handler = ReadEnvFingerprintHandler;
let res2 = read_handler.execute(json!({"namespace": "global"}), state.clone()).await.unwrap();
assert!(res2.contains("rustc"));
assert!(res2.contains("1.70.0"));
}
#[tokio::test]
async fn test_env_details() {
let dir = tempdir().unwrap();
let state = Arc::new(MemoryState::new(dir.path().to_str().unwrap()));
// Ensure namespace is present in test setup
state.environments.modify(|e| {
e.push(crate::models::EnvironmentDetail {
namespace: "global".to_string(),
name: "test".to_string(),
url: "http://localhost".to_string(),
description: "Test env".to_string(),
requires_vpn: false,
updated_at: crate::handlers::utils::now_secs(),
});
});
let handler = GetEnvironmentDetailsHandler;
let res = handler.execute(json!({"namespace": "global"}), state.clone()).await.unwrap();
assert!(res.contains("global"));
}
#[tokio::test]
async fn test_env_requirements_and_registration() {
let dir = tempdir().unwrap();
let state = Arc::new(MemoryState::new(dir.path().to_str().unwrap()));
let req_handler = LogEnvRequirementHandler;
let args_req = json!({
"key": "vpn",
"description": "Requires VPN",
"is_secret": false,
"requirement": "Needs specific VPN",
"context": "For database access",
"namespace": "global"
});
let res1 = req_handler.execute(args_req, state.clone()).await.unwrap();
assert_eq!(res1, "Env requirement logged");
let reg_handler = RegisterEnvironmentHandler;
let args_reg = json!({
"name": "prod",
"url": "https://prod.local",
"description": "Production",
"requires_vpn": true,
"namespace": "global"
});
let res2 = reg_handler.execute(args_reg, state.clone()).await.unwrap();
assert_eq!(res2, "Environment registered");
let get_handler = GetEnvironmentDetailsHandler;
let res3 = get_handler.execute(json!({"namespace": "global"}), state.clone()).await.unwrap();
assert!(res3.contains("prod.local"));
assert!(res3.len() > 0);
}
}