#[cfg(test)]
mod search_regression_tests {
use super::*;
use std::collections::HashMap;
use tempfile::TempDir;
async fn create_test_search_engine() -> Result<(SearchEngine, TempDir)> {
let temp_dir = TempDir::new().unwrap();
let index_path = temp_dir.path().to_str().unwrap();
let mut config = SearchConfig::default();
config.index_path = index_path.to_string();
config.enable_lsp = false;
let engine = SearchEngine::new(config).await?;
Ok((engine, temp_dir))
}
#[tokio::test]
async fn test_basic_search_functionality() {
let (engine, _temp_dir) = create_test_search_engine().await.unwrap();
let test_cases = vec![
("struct", "Should find struct definitions"),
("impl", "Should find impl blocks"),
("fn", "Should find function definitions"),
("SearchEngine", "Should find SearchEngine references"),
("pub", "Should find public declarations"),
];
for (query, description) in test_cases {
let request = SearchRequest {
query: query.to_string(),
max_results: 10,
language: None,
enable_lsp: false,
include_context: false,
timeout_ms: 1000,
search_method: Some(SearchMethod::Lexical), };
let response = engine.search(request).await.unwrap();
assert!(
!response.results.is_empty(),
"REGRESSION FAILURE: Query '{}' returned 0 results. {}",
query, description
);
println!("✅ Query '{}': {} results", query, response.results.len());
}
}
#[tokio::test]
async fn test_query_sanitization_preserves_searchable_terms() {
let (engine, _temp_dir) = create_test_search_engine().await.unwrap();
let original_query = "struct SearchEngine impl search";
let sanitized = engine.sanitize_query(original_query);
assert!(
sanitized.contains("struct") || sanitized.contains("SearchEngine") || sanitized.contains("impl"),
"REGRESSION FAILURE: Query sanitization removed all searchable terms: '{}' -> '{}'",
original_query, sanitized
);
let request = SearchRequest {
query: sanitized,
max_results: 10,
language: None,
enable_lsp: false,
include_context: false,
timeout_ms: 1000,
search_method: Some(SearchMethod::Lexical),
};
let response = engine.search(request).await.unwrap();
assert!(
!response.results.is_empty(),
"REGRESSION FAILURE: Sanitized query '{}' returned 0 results", sanitized
);
println!("✅ Sanitized query '{}': {} results", sanitized, response.results.len());
}
#[tokio::test]
async fn test_semantic_reranking_with_results() {
let (engine, _temp_dir) = create_test_search_engine().await.unwrap();
let request = SearchRequest {
query: "function implementation".to_string(),
max_results: 10,
language: None,
enable_lsp: false,
include_context: false,
timeout_ms: 2000,
search_method: Some(SearchMethod::ForceSemantic), };
let response = engine.search(request).await.unwrap();
println!("✅ Semantic search completed: {} results", response.results.len());
assert!(response.metadata.contains_key("semantic_applied") || response.results.is_empty(),
"REGRESSION FAILURE: Semantic search should include metadata or explain empty results");
}
#[tokio::test]
async fn test_index_population_regression() {
let (engine, _temp_dir) = create_test_search_engine().await.unwrap();
let reader = &engine.reader;
let searcher = reader.searcher();
let all_query = tantivy::query::AllQuery;
let top_docs = searcher.search(&all_query, &tantivy::collector::TopDocs::with_limit(1)).unwrap();
assert!(
!top_docs.is_empty(),
"REGRESSION FAILURE: Index should be automatically populated with documents"
);
println!("✅ Index contains {} documents (verified with sample)", top_docs.len());
}
#[tokio::test]
async fn test_real_benchmark_query_patterns() {
let (engine, _temp_dir) = create_test_search_engine().await.unwrap();
let adapted_queries = vec![
"implement search function",
"create struct definition",
"error handling implementation",
"async function pattern",
"configuration management",
];
for query in adapted_queries {
let request = SearchRequest {
query: query.to_string(),
max_results: 5,
language: None,
enable_lsp: false,
include_context: false,
timeout_ms: 1000,
search_method: Some(SearchMethod::Lexical),
};
let response = engine.search(request).await.unwrap();
println!("Query '{}': {} results", query, response.results.len());
assert!(response.metadata.contains_key("execution_time_ms"),
"REGRESSION FAILURE: Search should include execution metadata");
}
}
}
impl SearchEngine {
#[cfg(test)]
pub fn sanitize_query(&self, query: &str) -> String {
self.sanitize_query(query)
}
}