//! Integration tests for server commands (serve and mcp). #[cfg(not(coverage))] use std::process::{Command, Stdio}; #[cfg(not(coverage))] use std::thread; #[cfg(not(coverage))] use std::time::Duration; #[cfg(not(coverage))] #[test] #[ignore] fn test_serve_command_starts() { let status = Command::new("cargo") .args(["build", "--bin", "kreuzberg", "--features", "all"]) .status() .expect("Failed to build binary"); assert!(status.success(), "Failed to build kreuzberg binary"); let mut child = Command::new("./target/debug/kreuzberg") .args(["serve", "-H", "127.0.0.1", "-p", "18000"]) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn() .expect("Failed to start server"); thread::sleep(Duration::from_secs(3)); let mut health_response = ureq::get("http://127.0.0.1:18000/health") .call() .expect("Failed to call health endpoint"); assert_eq!(health_response.status(), 200); let health_json: serde_json::Value = health_response .body_mut() .read_json() .expect("Failed to parse health response"); assert_eq!(health_json["status"], "healthy"); assert!(health_json["version"].is_string()); let mut info_response = ureq::get("http://127.0.0.1:18000/info") .call() .expect("Failed to call info endpoint"); assert_eq!(info_response.status(), 200); let info_json: serde_json::Value = info_response .body_mut() .read_json() .expect("Failed to parse info response"); assert!(info_json["rust_backend"].as_bool().unwrap_or(false)); child.kill().expect("Failed to kill server"); child.wait().expect("Failed to wait for server"); } #[cfg(not(coverage))] #[test] #[ignore] fn test_serve_command_with_config() { use std::fs; let config_content = r#" use_cache = true enable_quality_processing = true [ocr] backend = "tesseract" language = "eng" "#; fs::write("test_config.toml", config_content).expect("Failed to write test config"); let mut child = Command::new("./target/debug/kreuzberg") .args(["serve", "-H", "127.0.0.1", "-p", "18001", "-c", "test_config.toml"]) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn() .expect("Failed to start server"); thread::sleep(Duration::from_secs(3)); let health_response = ureq::get("http://127.0.0.1:18001/health").call(); assert!(health_response.is_ok(), "Server should be running with custom config"); child.kill().expect("Failed to kill server"); child.wait().expect("Failed to wait for server"); fs::remove_file("test_config.toml").ok(); } #[cfg(not(coverage))] #[test] fn test_serve_command_help() { let build_status = Command::new("cargo") .args(["build", "--bin", "kreuzberg", "--features", "all"]) .status() .expect("Failed to build binary"); assert!(build_status.success(), "Failed to build kreuzberg binary"); let binary_path = env!("CARGO_TARGET_TMPDIR") .split("target") .next() .map(|s| format!("{}target/debug/kreuzberg", s)) .unwrap_or_else(|| "../target/debug/kreuzberg".to_string()); let output = Command::new(&binary_path) .args(["serve", "--help"]) .output() .expect("Failed to execute command"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("Start the API server")); assert!(stdout.contains("--host")); assert!(stdout.contains("--port")); assert!(stdout.contains("--config")); } #[cfg(not(coverage))] #[test] fn test_mcp_command_help() { let build_status = Command::new("cargo") .args(["build", "--bin", "kreuzberg", "--features", "all"]) .status() .expect("Failed to build binary"); assert!(build_status.success(), "Failed to build kreuzberg binary"); let binary_path = env!("CARGO_TARGET_TMPDIR") .split("target") .next() .map(|s| format!("{}target/debug/kreuzberg", s)) .unwrap_or_else(|| "../target/debug/kreuzberg".to_string()); let output = Command::new(&binary_path) .args(["mcp", "--help"]) .output() .expect("Failed to execute command"); assert!(output.status.success()); let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("Start the MCP (Model Context Protocol) server")); assert!(stdout.contains("--config")); }