Test coverage and headless nvim bug fixes
This commit is contained in:
1 parent
bffc8896f1
commit
4bae4e9c08
9 files changed
+316
-58
No files matched your search
@@ -1,5 +1,5 @@
|
||||
use serde_json::{Value, json};
|
||||
use std::io::{BufRead, BufReader, Write};
|
||||
use std::io::{BufRead, BufReader, Write, Read};
|
||||
use std::process::{Command, Stdio};
|
||||
|
||||
fn send_message(stdin: &mut std::process::ChildStdin, msg: Value) {
|
||||
@@ -24,7 +24,14 @@ fn test_mcp_initialization_and_tools_list() {
|
||||
nvim_exe.pop();
|
||||
nvim_exe.push("mcp-memory-win-nvim.exe");
|
||||
|
||||
let temp_dir = std::env::temp_dir().join("win-nvim-test");
|
||||
std::fs::create_dir_all(&temp_dir).unwrap();
|
||||
let temp_gemini = temp_dir.join(".gemini");
|
||||
std::fs::create_dir_all(&temp_gemini).unwrap();
|
||||
|
||||
let mut child = Command::new(&nvim_exe)
|
||||
.env("USERPROFILE", temp_dir.to_str().unwrap())
|
||||
.env("HOME", temp_dir.to_str().unwrap())
|
||||
.stdin(Stdio::piped())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped())
|
||||
@@ -94,35 +101,106 @@ fn test_mcp_initialization_and_tools_list() {
|
||||
let has_get_active_buffer = tools.iter().any(|t| t["name"] == "nvim_get_active_buffer");
|
||||
assert!(has_get_active_buffer, "Missing nvim_get_active_buffer tool");
|
||||
|
||||
// 3. Test negative scenario: tools/call when Neovim is not running
|
||||
// Since Neovim is not guaranteed to be running on the test agent's system,
|
||||
// calling a Neovim-specific tool should gracefully return a JSON-RPC error.
|
||||
let call_req = json!({
|
||||
let tool_names = vec![
|
||||
"nvim_goto_line",
|
||||
"nvim_get_active_buffer",
|
||||
"nvim_get_cursor",
|
||||
"nvim_get_visual_selection",
|
||||
"nvim_set_diagnostics",
|
||||
"nvim_set_extmark",
|
||||
"nvim_list_buffers",
|
||||
"nvim_list_windows",
|
||||
"nvim_get_active_window",
|
||||
"nvim_set_active_window",
|
||||
"nvim_get_diagnostics",
|
||||
"nvim_open_file",
|
||||
"nvim_open_buffer",
|
||||
"nvim_close_buffer",
|
||||
"nvim_close_window",
|
||||
"nvim_split_window",
|
||||
"nvim_reload_buffer",
|
||||
"nvim_save_buffer",
|
||||
"nvim_set_quickfix",
|
||||
"nvim_highlight_lines",
|
||||
"nvim_get_messages",
|
||||
"nvim_get_viewport",
|
||||
"nvim_read_file",
|
||||
"nvim_search_file",
|
||||
"nvim_execute_lua",
|
||||
"nvim_get_server_info",
|
||||
"unknown_tool",
|
||||
];
|
||||
|
||||
for (i, tool_name) in tool_names.iter().enumerate() {
|
||||
let req_id = i + 100;
|
||||
let call_req = json!({
|
||||
"jsonrpc": "2.0",
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": tool_name,
|
||||
"arguments": {
|
||||
"file": "test.txt",
|
||||
"line": 10,
|
||||
"code": "return 1",
|
||||
"lua_code": "return 1",
|
||||
"message": "test msg",
|
||||
"text": "test",
|
||||
"hl_group": "Error",
|
||||
"win_id": 1,
|
||||
"buf_id": 1,
|
||||
"name": "test",
|
||||
"start_line": 1,
|
||||
"end_line": 2,
|
||||
"force": true,
|
||||
"group": "test",
|
||||
"pattern": "foo"
|
||||
}
|
||||
},
|
||||
"id": req_id
|
||||
});
|
||||
|
||||
send_message(&mut stdin, call_req);
|
||||
let call_resp = read_message(&mut stdout).expect("Failed to read tools/call response");
|
||||
println!("Response for {}: {}", tool_name, serde_json::to_string(&call_resp).unwrap());
|
||||
assert_eq!(call_resp["jsonrpc"], "2.0");
|
||||
assert_eq!(call_resp["id"], req_id);
|
||||
}
|
||||
|
||||
for (i, tool_name) in tool_names.iter().enumerate() {
|
||||
let req_id = i + 200;
|
||||
let call_req = json!({
|
||||
"jsonrpc": "2.0",
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": tool_name,
|
||||
"arguments": {}
|
||||
},
|
||||
"id": req_id
|
||||
});
|
||||
|
||||
send_message(&mut stdin, call_req);
|
||||
let call_resp = read_message(&mut stdout).expect("Failed to read tools/call response");
|
||||
assert_eq!(call_resp["jsonrpc"], "2.0");
|
||||
assert_eq!(call_resp["id"], req_id);
|
||||
}
|
||||
|
||||
let call_req_no_id = json!({
|
||||
"jsonrpc": "2.0",
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": "nvim_get_active_buffer",
|
||||
"name": "nvim_goto_line",
|
||||
"arguments": {}
|
||||
},
|
||||
"id": 3
|
||||
}
|
||||
});
|
||||
send_message(&mut stdin, call_req_no_id);
|
||||
|
||||
send_message(&mut stdin, call_req);
|
||||
|
||||
let call_resp = read_message(&mut stdout).expect("Failed to read tools/call response");
|
||||
|
||||
assert_eq!(call_resp["jsonrpc"], "2.0");
|
||||
assert_eq!(call_resp["id"], 3);
|
||||
|
||||
if let Some(error) = call_resp.get("error") {
|
||||
assert_eq!(error["code"], -32603); // Internal Error
|
||||
} else {
|
||||
assert!(
|
||||
call_resp.get("result").is_some(),
|
||||
"Expected either an error (if Neovim is not running) or a result (if it is)"
|
||||
);
|
||||
drop(stdin);
|
||||
let mut stderr_output = String::new();
|
||||
if let Some(mut stderr) = child.stderr.take() {
|
||||
let _ = stderr.read_to_string(&mut stderr_output);
|
||||
println!("Child STDERR: {}", stderr_output);
|
||||
}
|
||||
|
||||
child.kill().expect("Failed to kill child");
|
||||
child.wait().expect("Failed to wait on child");
|
||||
|
||||
let status = child.wait().expect("Failed to wait on child");
|
||||
assert!(status.success(), "Child process did not exit successfully. Stderr: {}", stderr_output);
|
||||
}
|
||||
Reference in new issue
Block a user