use super::*;
#[test]
fn reads_file_via_tool_call() {
let project = project_root();
let state = make_state(&project);
let payload = call_tool(&state, "read_file", json!({ "relative_path": "hello.txt" }));
assert_eq!(payload["success"], json!(true));
assert_eq!(payload["backend_used"], json!("filesystem"));
}
#[test]
fn returns_symbols_via_tool_call() {
let project = project_root();
fs::write(
project.as_path().join("sample.py"),
"class Foo:\n def bar(self):\n pass\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(
&state,
"get_symbols_overview",
json!({ "path": "sample.py" }),
);
assert_eq!(payload["success"], json!(true));
}
#[test]
fn reports_symbol_index_stats() {
let project = project_root();
fs::write(
project.as_path().join("stats_test.py"),
"def alpha():\n pass\ndef beta():\n pass\n",
)
.unwrap();
let state = make_state(&project);
call_tool(&state, "refresh_symbol_index", json!({}));
let payload = call_tool(&state, "get_current_config", json!({}));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_ranked_context_via_tool_call() {
let project = project_root();
fs::write(
project.as_path().join("rank.py"),
"def search_users(query):\n pass\ndef delete_user(uid):\n pass\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(
&state,
"get_ranked_context",
json!({ "query": "search users" }),
);
assert_eq!(payload["success"], json!(true));
assert_eq!(
payload["data"]["retrieval"]["semantic_query"],
json!("search users")
);
assert_eq!(
payload["data"]["retrieval"]["lexical_query"],
json!("search users")
);
}
#[test]
fn returns_ranked_context_without_semantic_when_requested() {
let project = project_root();
fs::write(
project.as_path().join("rank_no_semantic.py"),
"def search_users(query):\n pass\ndef delete_user(uid):\n pass\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(
&state,
"get_ranked_context",
json!({ "query": "search users", "disable_semantic": true }),
);
assert_eq!(payload["success"], json!(true));
assert_eq!(
payload["data"]["retrieval"]["semantic_enabled"],
json!(false)
);
}
#[test]
fn returns_blast_radius_via_tool_call() {
let project = project_root();
fs::create_dir_all(project.as_path().join("pkg")).unwrap();
fs::write(project.as_path().join("pkg/core.py"), "X = 1\n").unwrap();
fs::write(
project.as_path().join("pkg/util.py"),
"from pkg.core import X\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(
&state,
"get_impact_analysis",
json!({ "file_path": "pkg/core.py" }),
);
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_importers_via_tool_call() {
let project = project_root();
fs::create_dir_all(project.as_path().join("lib")).unwrap();
fs::write(project.as_path().join("lib/base.py"), "BASE = 42\n").unwrap();
fs::write(
project.as_path().join("lib/derived.py"),
"from lib.base import BASE\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(
&state,
"find_importers",
json!({ "file_path": "lib/base.py" }),
);
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_symbol_importance_via_tool_call() {
let project = project_root();
fs::create_dir_all(project.as_path().join("importance_pkg")).unwrap();
fs::write(
project.as_path().join("importance_pkg/hub.py"),
"HUB = True\n",
)
.unwrap();
fs::write(
project.as_path().join("importance_pkg/spoke_a.py"),
"from importance_pkg.hub import HUB\n",
)
.unwrap();
fs::write(
project.as_path().join("importance_pkg/spoke_b.py"),
"from importance_pkg.hub import HUB\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "get_symbol_importance", json!({ "top_n": 5 }));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_dead_code_via_tool_call() {
let project = project_root();
fs::create_dir_all(project.as_path().join("dc_pkg")).unwrap();
fs::write(project.as_path().join("dc_pkg/used.py"), "X = 1\n").unwrap();
fs::write(project.as_path().join("dc_pkg/orphan.py"), "Y = 2\n").unwrap();
fs::write(
project.as_path().join("dc_pkg/consumer.py"),
"from dc_pkg.used import X\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "find_dead_code", json!({ "max_results": 10 }));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_annotations_via_tool_call() {
let project = project_root();
fs::write(
project.as_path().join("annotated.py"),
"# TODO: fix this\n# FIXME: broken\ndef ok():\n pass\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "find_annotations", json!({}));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_tests_via_tool_call() {
let project = project_root();
fs::write(
project.as_path().join("test_sample.py"),
"def test_one():\n assert True\ndef test_two():\n assert True\n",
)
.unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "find_tests", json!({}));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_complexity_via_tool_call() {
let project = project_root();
fs::write(project.as_path().join("complex.py"), "def decide(x):\n if x > 0:\n if x > 10:\n return 'big'\n return 'small'\n return 'neg'\n").unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "get_complexity", json!({ "path": "complex.py" }));
assert_eq!(payload["success"], json!(true));
}
#[test]
fn returns_changed_files_via_tool_call() {
let project = project_root();
run_git(&project, &["init"]);
run_git(&project, &["add", "."]);
run_git(
&project,
&[
"-c",
"user.email=test@test.com",
"-c",
"user.name=Test",
"commit",
"-m",
"init",
],
);
fs::write(project.as_path().join("new_file.py"), "X = 1\n").unwrap();
let state = make_state(&project);
let payload = call_tool(&state, "get_changed_files", json!({}));
assert_eq!(payload["success"], json!(true));
}