use std::sync::Arc;
use terraphim_config::{ConfigBuilder, ConfigState};
use terraphim_file_search::kg_scorer::KgPathScorer;
use terraphim_mcp_server::McpService;
use terraphim_types::{NormalizedTerm, NormalizedTermValue, Thesaurus};
async fn minimal_config_state() -> Arc<ConfigState> {
let mut config = ConfigBuilder::default()
.build()
.expect("default config builds");
let state = ConfigState::new(&mut config)
.await
.expect("ConfigState from default config");
Arc::new(state)
}
fn thesaurus_with_terms(name: &str, terms: &[(u64, &str)]) -> Thesaurus {
let mut t = Thesaurus::new(name.to_string());
for (id, val) in terms {
let key = NormalizedTermValue::from(val.to_string());
let term = NormalizedTerm {
id: *id,
value: NormalizedTermValue::from(val.to_string()),
display_value: None,
url: None,
action: None,
priority: None,
trigger: None,
pinned: false,
};
t.insert(key, term);
}
t
}
#[tokio::test]
async fn find_files_no_scorer_returns_results() {
let config_state = minimal_config_state().await;
let service = McpService::new(config_state);
let workspace = env!("CARGO_MANIFEST_DIR")
.trim_end_matches("crates/terraphim_mcp_server")
.trim_end_matches('/');
let result = service
.find_files("lib.rs".to_string(), Some(workspace.to_string()), Some(5))
.await
.expect("find_files should succeed");
assert!(
!result.is_error.unwrap_or(false),
"expected success, got: {:?}",
result.content
);
assert!(
!result.content.is_empty(),
"expected at least one content item"
);
let summary = result.content[0]
.as_text()
.map(|t| t.text.as_str())
.unwrap_or("");
assert!(
summary.contains("lib.rs") || summary.contains("Found"),
"unexpected summary: {summary}"
);
}
#[tokio::test]
async fn find_files_with_kg_scorer_boosts_matching_paths() {
let config_state = minimal_config_state().await;
let thesaurus = thesaurus_with_terms("test", &[(1, "automata")]);
let scorer = Arc::new(KgPathScorer::new(thesaurus));
let service = McpService::new(config_state).with_kg_scorer(scorer);
let workspace = env!("CARGO_MANIFEST_DIR")
.trim_end_matches("crates/terraphim_mcp_server")
.trim_end_matches('/');
let result = service
.find_files("lib".to_string(), Some(workspace.to_string()), Some(10))
.await
.expect("find_files should succeed");
assert!(
!result.is_error.unwrap_or(false),
"expected success, got: {:?}",
result.content
);
assert!(result.content.len() > 1, "expected results beyond summary");
let has_automata = result.content.iter().any(|c| {
c.as_text()
.map(|t| t.text.contains("automata"))
.unwrap_or(false)
});
assert!(
has_automata,
"expected automata-path file in top results; got: {:?}",
result.content
);
}
#[tokio::test]
async fn find_files_invalid_path_returns_error() {
let config_state = minimal_config_state().await;
let service = McpService::new(config_state);
let result = service
.find_files(
"anything".to_string(),
Some("/tmp/__terraphim_nonexistent_dir_xyz__".to_string()),
None,
)
.await;
assert!(
result.is_err(),
"expected Err for non-existent path, got Ok"
);
}
#[tokio::test]
async fn grep_files_returns_content_matches() {
let config_state = minimal_config_state().await;
let service = McpService::new(config_state);
let workspace = env!("CARGO_MANIFEST_DIR")
.trim_end_matches("crates/terraphim_mcp_server")
.trim_end_matches('/');
let result = service
.grep_files(
"fn new(".to_string(),
Some(workspace.to_string()),
Some(10),
None,
None,
)
.await
.expect("grep_files should succeed");
assert!(
!result.is_error.unwrap_or(false),
"expected success, got: {:?}",
result.content
);
assert!(
!result.content.is_empty(),
"expected at least one content item"
);
let summary = result.content[0]
.as_text()
.map(|t| t.text.as_str())
.unwrap_or("");
assert!(
summary.contains("Found") || summary.contains("match"),
"unexpected summary: {summary}"
);
if result.content.len() > 1 {
let first_match = result.content[1]
.as_text()
.map(|t| t.text.as_str())
.unwrap_or("");
assert!(
first_match.contains(':'),
"expected file:line:content format, got: {first_match}"
);
}
}
#[tokio::test]
async fn grep_files_files_mode_returns_paths() {
let config_state = minimal_config_state().await;
let service = McpService::new(config_state);
let workspace = env!("CARGO_MANIFEST_DIR")
.trim_end_matches("crates/terraphim_mcp_server")
.trim_end_matches('/');
let result = service
.grep_files(
"pub fn".to_string(),
Some(workspace.to_string()),
Some(5),
Some("files".to_string()),
None,
)
.await
.expect("grep_files should succeed");
assert!(
!result.is_error.unwrap_or(false),
"expected success, got: {:?}",
result.content
);
for item in result.content.iter().skip(1) {
if let Some(text) = item.as_text() {
assert!(!text.text.is_empty(), "expected non-empty file path line");
}
}
}