Test coverage and headless nvim bug fixes

This commit is contained in:
Riz Ashraf committed 2026-09-27 08:10:09 +01:00
1 parent bffc8896f1
commit 4bae4e9c08
9 files changed
+316 -58

No files matched your search

+103 -25
View File
@@ -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);
}