matrixcode-core 0.4.27

MatrixCode Agent Core - Pure logic, no UI
Documentation
//! MCP 核心功能测试

use matrixcode_core::mcp::{McpServerConfig, McpToolRegistry};
use std::sync::Arc;
use tokio::sync::RwLock;

#[tokio::test]
async fn test_registry_basic() {
    let mut registry = McpToolRegistry::new();
    println!("✅ McpToolRegistry 创建成功");

    let config = McpServerConfig::stdio("npx", vec!["-y".into(), "@playwright/mcp@latest".into()]);
    registry.add_server("playwright".into(), config);
    println!("✅ 添加 server 成功");

    let status = registry.server_status().await;
    assert_eq!(status.len(), 1);
    assert!(status.contains_key("playwright"));
    println!("✅ server_status() 工作正常");
}

#[tokio::test]
async fn test_registry_multiple_servers() {
    let mut registry = McpToolRegistry::new();

    registry.add_server(
        "playwright".into(),
        McpServerConfig::stdio("npx", vec!["-y".into(), "@playwright/mcp@latest".into()]),
    );

    registry.add_server(
        "filesystem".into(),
        McpServerConfig::stdio(
            "npx",
            vec![
                "-y".into(),
                "@modelcontextprotocol/server-filesystem".into(),
            ],
        ),
    );

    let status = registry.server_status().await;
    assert_eq!(status.len(), 2);
    println!("✅ 多 server 管理");
}

#[tokio::test]
async fn test_registry_remove_server() {
    let mut registry = McpToolRegistry::new();

    registry.add_server(
        "playwright".into(),
        McpServerConfig::stdio("npx", vec!["-y".into(), "@playwright/mcp@latest".into()]),
    );

    assert_eq!(registry.server_status().await.len(), 1);

    registry.remove_server("playwright").await;

    assert_eq!(registry.server_status().await.len(), 0);
    println!("✅ remove_server() 工作正常");
}

#[tokio::test]
async fn test_registry_wrapped() {
    let registry = Arc::new(RwLock::new(McpToolRegistry::new()));

    {
        let mut reg = registry.write().await;
        reg.add_server(
            "playwright".into(),
            McpServerConfig::stdio("npx", vec!["-y".into(), "@playwright/mcp@latest".into()]),
        );
    }

    {
        let reg = registry.read().await;
        assert_eq!(reg.server_status().await.len(), 1);
        println!("✅ Arc<RwLock<McpToolRegistry>> 包装工作正常");
    }
}

#[tokio::test]
async fn test_cli_arg_parsing() {
    let mut registry = McpToolRegistry::new();

    registry
        .add_from_cli_arg("playwright:npx -y @playwright/mcp@latest")
        .unwrap();
    registry
        .add_from_cli_arg("npx -y @modelcontextprotocol/server-filesystem")
        .unwrap();

    let status = registry.server_status().await;
    assert_eq!(status.len(), 2);
    println!("✅ CLI 参数解析工作正常");
}

#[tokio::test]
async fn test_event_system() {
    use matrixcode_core::event::{AgentEvent, EventType, McpServerInfo};

    let event = AgentEvent::mcp_server_added("test", 5);
    assert_eq!(event.event_type, EventType::McpServerAdded);

    let event = AgentEvent::mcp_server_removed("test");
    assert_eq!(event.event_type, EventType::McpServerRemoved);

    let infos = vec![
        McpServerInfo::new("playwright", true, 10),
        McpServerInfo::new("filesystem", false, 0),
    ];
    let event = AgentEvent::mcp_server_status(infos);
    assert_eq!(event.event_type, EventType::McpServerStatus);

    println!("✅ MCP 事件系统工作正常");
}