//! Integration Tests for Phase 4.6: Unified Query Handler //! //! Tests single `/query` endpoint that composes all 5 features: //! - Semantic search (entities, edges, hybrid) //! - Temporal filtering //! - Community detection //! - Path finding //! - Faceted search #[cfg(test)] mod tests { /// Test: Unified query defaults #[test] fn test_unified_query_default_search_type() { let search_type = "entities"; assert_eq!(search_type, "entities"); } /// Test: Entity search via unified endpoint #[test] fn test_unified_query_entity_search() { let query = "kubernetes"; let search_type = "entities"; assert!(!query.is_empty()); assert_eq!(search_type, "entities"); } /// Test: Edge search via unified endpoint #[test] fn test_unified_query_edge_search() { let query = "depends on"; let search_type = "edges"; assert!(!query.is_empty()); assert_eq!(search_type, "edges"); } /// Test: Hybrid search via unified endpoint #[test] fn test_unified_query_hybrid_search() { let query = "system design"; let search_type = "hybrid"; assert!(!query.is_empty()); assert_eq!(search_type, "hybrid"); } /// Test: Unified query with entity type filter #[test] fn test_unified_query_with_entity_type() { let entity_type = Some("concept".to_string()); assert!(entity_type.is_some()); assert_eq!(entity_type.as_ref().unwrap(), "concept"); } /// Test: Unified query with relation type filter #[test] fn test_unified_query_with_relation_type() { let relation_type = Some("depends_on".to_string()); assert!(relation_type.is_some()); } /// Test: Unified query with confidence floor #[test] fn test_unified_query_confidence_floor() { let confidence_floor = 0.7; assert!(confidence_floor > 0.5); assert!(confidence_floor < 1.0); } /// Test: Unified query with custom top_k #[test] fn test_unified_query_custom_top_k() { let top_k = 25; assert!(top_k > 10); assert!(top_k <= 100); } /// Test: Unified query with hybrid weights #[test] fn test_unified_query_hybrid_weights() { let semantic_weight = 0.7; let lexical_weight = 0.3; assert!(semantic_weight + lexical_weight <= 1.1); } /// Test: Temporal filtering in unified query #[test] fn test_unified_query_temporal_filtering() { let has_start_time = true; let has_end_time = true; assert!(has_start_time); assert!(has_end_time); } /// Test: Community detection in unified query #[test] fn test_unified_query_with_community_detection() { let detect_communities = true; let min_community_size = 5; assert!(detect_communities); assert!(min_community_size >= 2); } /// Test: Path finding in unified query #[test] fn test_unified_query_with_path_finding() { let find_paths = true; let target_entity_id = "e_monitoring"; let max_path_depth = 4; assert!(find_paths); assert!(!target_entity_id.is_empty()); assert!(max_path_depth <= 10); } /// Test: Facet discovery in unified query #[test] fn test_unified_query_with_facet_discovery() { let discover_facets = true; assert!(discover_facets); } /// Test: Facet filters in unified query #[test] fn test_unified_query_with_facet_filters() { let entity_types = Some(vec!["concept".to_string()]); let confidence_level = Some("high".to_string()); assert!(entity_types.is_some()); assert!(confidence_level.is_some()); } /// Test: Unified query response structure #[test] fn test_unified_query_response_structure() { let query = "test"; let search_type = "entities"; let total_count = 5; let search_time_ms = 150; assert!(!query.is_empty()); assert_eq!(search_type, "entities"); assert!(total_count >= 0); assert!(search_time_ms > 0); } /// Test: Query validation - empty query #[test] fn test_unified_query_validation_empty() { let query = ""; assert!(query.is_empty()); } /// Test: Query validation - query too long #[test] fn test_unified_query_validation_too_long() { let query = "x".repeat(2001); assert!(query.len() > 2000); } /// Test: Query validation - valid query #[test] fn test_unified_query_validation_valid() { let query = "kubernetes system design"; assert!(!query.is_empty()); assert!(query.len() <= 2000); } /// Test: Search type validation - entities #[test] fn test_unified_query_search_type_entities() { let search_type = "entities"; let valid = matches!(search_type, "entities" | "edges" | "hybrid"); assert!(valid); } /// Test: Search type validation - edges #[test] fn test_unified_query_search_type_edges() { let search_type = "edges"; let valid = matches!(search_type, "entities" | "edges" | "hybrid"); assert!(valid); } /// Test: Search type validation - hybrid #[test] fn test_unified_query_search_type_hybrid() { let search_type = "hybrid"; let valid = matches!(search_type, "entities" | "edges" | "hybrid"); assert!(valid); } /// Test: Search type validation - invalid #[test] fn test_unified_query_search_type_invalid() { let search_type = "invalid"; let valid = matches!(search_type, "entities" | "edges" | "hybrid"); assert!(!valid); } /// Test: Confidence floor validation - too low #[test] fn test_unified_query_confidence_floor_too_low() { let confidence_floor = -0.1; assert!(confidence_floor < 0.0); } /// Test: Confidence floor validation - too high #[test] fn test_unified_query_confidence_floor_too_high() { let confidence_floor = 1.5; assert!(confidence_floor > 1.0); } /// Test: Top K validation - too small #[test] fn test_unified_query_top_k_too_small() { let top_k = 0; assert_eq!(top_k, 0); } /// Test: Top K validation - too large #[test] fn test_unified_query_top_k_too_large() { let top_k = 200; assert!(top_k > 100); } /// Test: Top K validation - valid #[test] fn test_unified_query_top_k_valid() { let top_k = 25; assert!(top_k > 0 && top_k <= 100); } /// Test: Temporal validation - start after end #[test] fn test_unified_query_temporal_invalid() { use chrono::Utc; let now = Utc::now(); let start_after_end = now > now; assert!(!start_after_end); } /// Test: Max path depth validation - invalid #[test] fn test_unified_query_max_path_depth_invalid() { let max_path_depth = 15; assert!(max_path_depth > 10); } /// Test: Max path depth validation - valid #[test] fn test_unified_query_max_path_depth_valid() { let max_path_depth = 5; assert!(max_path_depth > 0 && max_path_depth <= 10); } /// Test: K hops validation - valid #[test] fn test_unified_query_k_hops_valid() { let k_hops = 3; assert!(k_hops > 0 && k_hops <= 5); } /// Test: Min community size validation - valid #[test] fn test_unified_query_min_community_size_valid() { let min_community_size = 10; assert!(min_community_size >= 2 && min_community_size <= 1000); } /// Test: Unified query composes entity + temporal #[test] fn test_unified_query_entity_temporal_composition() { let search_type = "entities"; let has_temporal = true; assert_eq!(search_type, "entities"); assert!(has_temporal); } /// Test: Unified query composes edge + temporal #[test] fn test_unified_query_edge_temporal_composition() { let search_type = "edges"; let has_temporal = true; assert_eq!(search_type, "edges"); assert!(has_temporal); } /// Test: Unified query composes hybrid + temporal #[test] fn test_unified_query_hybrid_temporal_composition() { let search_type = "hybrid"; let has_temporal = true; assert_eq!(search_type, "hybrid"); assert!(has_temporal); } /// Test: Unified query composes entity + community #[test] fn test_unified_query_entity_community_composition() { let search_type = "entities"; let detect_communities = true; assert_eq!(search_type, "entities"); assert!(detect_communities); } /// Test: Unified query composes entity + paths #[test] fn test_unified_query_entity_paths_composition() { let search_type = "entities"; let find_paths = true; assert_eq!(search_type, "entities"); assert!(find_paths); } /// Test: Unified query composes entity + facets #[test] fn test_unified_query_entity_facets_composition() { let search_type = "entities"; let discover_facets = true; assert_eq!(search_type, "entities"); assert!(discover_facets); } /// Test: Unified query composes all features #[test] fn test_unified_query_all_features_composition() { let search_type = "entities"; let has_temporal = true; let detect_communities = true; let find_paths = true; let discover_facets = true; assert_eq!(search_type, "entities"); assert!(has_temporal); assert!(detect_communities); assert!(find_paths); assert!(discover_facets); } /// Test: Unified endpoint single request vs 3 separate (efficiency) #[test] fn test_unified_query_efficiency_single_embed() { // Unified endpoint embeds query once, reuses for all search types // Separate endpoints would embed 3 times let embedding_count_unified = 1; let embedding_count_separate = 3; assert!(embedding_count_unified < embedding_count_separate); } /// Test: Unified query routing to entity search #[test] fn test_unified_query_routes_to_entity() { let search_type = "entities"; let correct_route = search_type == "entities"; assert!(correct_route); } /// Test: Unified query routing to edge search #[test] fn test_unified_query_routes_to_edge() { let search_type = "edges"; let correct_route = search_type == "edges"; assert!(correct_route); } /// Test: Unified query routing to hybrid search #[test] fn test_unified_query_routes_to_hybrid() { let search_type = "hybrid"; let correct_route = search_type == "hybrid"; assert!(correct_route); } /// Test: Backward compatibility with semantic/entities endpoint #[test] fn test_unified_query_backward_compat_entities() { // Semantic/entities endpoint still works independently let old_endpoint = "/memory/query/semantic/entities"; let has_endpoint = !old_endpoint.is_empty(); assert!(has_endpoint); } /// Test: Backward compatibility with semantic/edges endpoint #[test] fn test_unified_query_backward_compat_edges() { let old_endpoint = "/memory/query/semantic/edges"; let has_endpoint = !old_endpoint.is_empty(); assert!(has_endpoint); } /// Test: Backward compatibility with hybrid endpoint #[test] fn test_unified_query_backward_compat_hybrid() { let old_endpoint = "/memory/query/hybrid"; let has_endpoint = !old_endpoint.is_empty(); assert!(has_endpoint); } }