use serde_json::json;
use std::process::{Child, Command};
use std::time::Duration;
#[tokio::test]
async fn test_debug_summarization_flow() {
if std::env::var("RUN_DEBUG_SUMMARIZATION_TEST")
.map(|v| v != "1" && !v.eq_ignore_ascii_case("true"))
.unwrap_or(true)
{
eprintln!("Skipping: set RUN_DEBUG_SUMMARIZATION_TEST=1 to run this debug test");
return;
}
println!("๐งช Debug Summarization Flow Test");
println!("=================================");
let server_process = start_test_server().await;
tokio::time::sleep(Duration::from_secs(5)).await;
println!("\n๐ Testing search: 'tokio' with role: 'Rust Engineer'");
match test_search_and_debug_summarization("tokio", "Rust Engineer").await {
Ok(documents) => {
println!("๐ Search returned {} documents", documents.len());
for (i, doc) in documents.iter().enumerate().take(3) {
println!("\n๐ Document {}: {}", i + 1, doc.id);
println!(" Title: {}", doc.title);
println!(" Body length: {} chars", doc.body.len());
println!(" Has description: {}", doc.description.is_some());
println!(" Has summarization: {}", doc.summarization.is_some());
if let Some(desc) = &doc.description {
println!(" Description: {}...", &desc[..desc.len().min(100)]);
}
if let Some(summ) = &doc.summarization {
println!(" Summarization: {}...", &summ[..summ.len().min(100)]);
}
let should_summarize = should_generate_ai_summary(doc);
println!(" Should generate AI summary: {}", should_summarize);
if !should_summarize {
if doc.body.trim().len() < 200 {
println!(
" โ Body too short: {} chars < 200",
doc.body.trim().len()
);
}
if let Some(ref description) = doc.description {
if description.len() > 100 && !description.ends_with("...") {
println!(
" โ Already has good description: {} chars",
description.len()
);
}
}
if doc.body.len() > 8000 {
println!(" โ Body too long: {} chars > 8000", doc.body.len());
}
}
}
}
Err(e) => {
println!("โ Search failed: {}", e);
}
}
if let Some(mut process) = server_process {
let _ = process.kill();
let _ = process.wait();
println!("๐งน Test server stopped");
}
}
fn should_generate_ai_summary(document: &terraphim_types::Document) -> bool {
if document.body.trim().len() < 200 {
return false;
}
if let Some(ref description) = document.description {
if description.len() > 100 && !description.ends_with("...") {
return false;
}
}
if document.body.len() > 8000 {
return false;
}
true
}
async fn start_test_server() -> Option<Child> {
println!("๐ Starting test server...");
let server_result = Command::new("cargo")
.args([
"run",
"--release",
"-p",
"terraphim_server",
"--bin",
"terraphim_server",
"--",
"--config",
"terraphim_server/default/combined_roles_config.json",
])
.current_dir(".")
.spawn();
match server_result {
Ok(process) => {
println!("โ
Test server started (PID: {})", process.id());
Some(process)
}
Err(e) => {
println!("โ Failed to start server: {}", e);
None
}
}
}
async fn test_search_and_debug_summarization(
search_term: &str,
role: &str,
) -> Result<Vec<terraphim_types::Document>, Box<dyn std::error::Error>> {
let client = reqwest::Client::new();
let search_payload = json!({
"search_term": search_term,
"role": role
});
let response = client
.post("http://localhost:8000/documents/search")
.header("Content-Type", "application/json")
.json(&search_payload)
.send()
.await?;
if !response.status().is_success() {
return Err(format!("Search request failed with status: {}", response.status()).into());
}
let response_json: serde_json::Value = response.json().await?;
let empty_vec = vec![];
let results = response_json
.get("results")
.unwrap()
.as_array()
.unwrap_or(&empty_vec);
let mut documents = Vec::new();
for result in results.iter() {
if let Ok(doc) = serde_json::from_value::<terraphim_types::Document>(result.clone()) {
documents.push(doc);
}
}
Ok(documents)
}