use pmat::agents::registry::AgentRegistry;
use pmat::mcp_integration::server::{McpServer, ServerConfig};
use std::sync::Arc;
use std::time::Duration;
#[test]
fn test_server_config_default() {
let config = ServerConfig::default();
assert_eq!(config.name, "PMAT MCP Server");
assert!(!config.version.is_empty());
assert_eq!(config.bind_address, "127.0.0.1:3000");
assert_eq!(config.max_connections, 100);
assert_eq!(config.request_timeout, Duration::from_secs(30));
assert!(config.enable_logging);
}
#[test]
fn test_server_config_custom() {
let config = ServerConfig {
name: "Custom Server".to_string(),
version: "1.0.0".to_string(),
bind_address: "0.0.0.0:8080".to_string(),
unix_socket: Some("/tmp/test.sock".to_string()),
max_connections: 50,
request_timeout: Duration::from_secs(60),
enable_logging: false,
semantic_enabled: false,
semantic_api_key: None,
semantic_db_path: None,
semantic_workspace: None,
};
assert_eq!(config.name, "Custom Server");
assert_eq!(config.version, "1.0.0");
assert_eq!(config.bind_address, "0.0.0.0:8080");
assert_eq!(config.unix_socket, Some("/tmp/test.sock".to_string()));
assert_eq!(config.max_connections, 50);
assert_eq!(config.request_timeout, Duration::from_secs(60));
assert!(!config.enable_logging);
}
#[test]
fn test_server_config_semantic_disabled_by_default() {
std::env::remove_var("OPENAI_API_KEY");
let config = ServerConfig::default();
if config.semantic_enabled {
assert!(config.semantic_api_key.is_some());
}
}
#[test]
fn test_server_config_clone() {
let config1 = ServerConfig::default();
let config2 = config1.clone();
assert_eq!(config1.name, config2.name);
assert_eq!(config1.version, config2.version);
assert_eq!(config1.bind_address, config2.bind_address);
}
#[test]
fn test_mcp_server_creation() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig::default();
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_mcp_server_creation_custom_config() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig {
name: "Test Server".to_string(),
version: "0.1.0".to_string(),
bind_address: "127.0.0.1:5000".to_string(),
unix_socket: None,
max_connections: 10,
request_timeout: Duration::from_secs(10),
enable_logging: false,
semantic_enabled: false,
semantic_api_key: None,
semantic_db_path: None,
semantic_workspace: None,
};
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_mcp_server_creation_with_logging_enabled() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig {
enable_logging: true,
..ServerConfig::default()
};
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_mcp_server_creation_with_logging_disabled() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig {
enable_logging: false,
..ServerConfig::default()
};
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[tokio::test]
async fn test_register_defaults() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig::default();
let server = McpServer::new(registry, config).unwrap();
let result = server.register_defaults().await;
match result {
Ok(_) => {}
Err(e) => {
let err_str = e.to_string();
assert!(
err_str.contains("tool")
|| err_str.contains("resource")
|| err_str.contains("prompt")
|| err_str.contains("agent")
);
}
}
}
#[tokio::test]
async fn test_register_defaults_idempotent() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig::default();
let server = McpServer::new(registry, config).unwrap();
let result1 = server.register_defaults().await;
let result2 = server.register_defaults().await;
match (result1, result2) {
(Ok(_), Ok(_)) => {}
(Err(_), Err(_)) => {}
_ => {
}
}
}
#[test]
fn test_shutdown() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig::default();
let server = McpServer::new(registry, config).unwrap();
server.shutdown();
}
#[test]
fn test_shutdown_multiple_times() {
let registry = Arc::new(AgentRegistry::new());
let config = ServerConfig::default();
let server = McpServer::new(registry, config).unwrap();
server.shutdown();
server.shutdown();
server.shutdown();
}
#[test]
fn test_server_config_zero_max_connections() {
let config = ServerConfig {
max_connections: 0,
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_very_large_max_connections() {
let config = ServerConfig {
max_connections: usize::MAX,
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_zero_timeout() {
let config = ServerConfig {
request_timeout: Duration::from_secs(0),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_very_long_timeout() {
let config = ServerConfig {
request_timeout: Duration::from_secs(86400), ..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_empty_name() {
let config = ServerConfig {
name: "".to_string(),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_empty_version() {
let config = ServerConfig {
version: "".to_string(),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_invalid_bind_address_format() {
let config = ServerConfig {
bind_address: "not-a-valid-address".to_string(),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_semantic_with_api_key() {
let config = ServerConfig {
semantic_enabled: true,
semantic_api_key: Some("test-key".to_string()),
semantic_db_path: Some("/tmp/test.db".to_string()),
semantic_workspace: Some(std::path::PathBuf::from("/tmp")),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_semantic_without_api_key() {
let config = ServerConfig {
semantic_enabled: true,
semantic_api_key: None,
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_semantic_with_invalid_db_path() {
let config = ServerConfig {
semantic_enabled: true,
semantic_api_key: Some("test-key".to_string()),
semantic_db_path: Some("/nonexistent/path/db.sqlite".to_string()),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_with_unix_socket() {
let config = ServerConfig {
unix_socket: Some("/tmp/pmat.sock".to_string()),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_with_empty_unix_socket() {
let config = ServerConfig {
unix_socket: Some("".to_string()),
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}
#[test]
fn test_server_config_unix_socket_none() {
let config = ServerConfig {
unix_socket: None,
..ServerConfig::default()
};
let registry = Arc::new(AgentRegistry::new());
let result = McpServer::new(registry, config);
assert!(result.is_ok());
}