//! Integration Tests for Phase 5.1: Entity Linking //! //! Tests entity linking capabilities: //! - Mention linking to existing entities //! - Alias detection //! - Entity merge suggestions //! - Coreference clustering #[cfg(test)] mod tests { /// Test: Mention link structure #[test] fn test_mention_link_basic() { let mention_text = "Kubernetes"; let entity_id = "e1"; let confidence = 0.95; assert!(!mention_text.is_empty()); assert_eq!(entity_id, "e1"); assert!(confidence > 0.9); } /// Test: Mention link with offsets #[test] fn test_mention_link_offsets() { let start = 0; let end = 10; assert_eq!(end - start, 10); } /// Test: Link reason - semantic #[test] fn test_link_reason_semantic() { let reason = "SemanticMatch"; assert_eq!(reason, "SemanticMatch"); } /// Test: Link reason - lexical #[test] fn test_link_reason_lexical() { let reason = "LexicalMatch"; assert_eq!(reason, "LexicalMatch"); } /// Test: Link reason - alias #[test] fn test_link_reason_alias() { let reason = "AliasMatch"; assert_eq!(reason, "AliasMatch"); } /// Test: Link reason - acronym #[test] fn test_link_reason_acronym() { let reason = "AcronymMatch"; assert_eq!(reason, "AcronymMatch"); } /// Test: Link reason - partial #[test] fn test_link_reason_partial() { let reason = "PartialMatch"; assert_eq!(reason, "PartialMatch"); } /// Test: Alias suggestion structure #[test] fn test_alias_suggestion_basic() { let canonical = "Kubernetes"; let alias = "k8s"; let confidence = 0.95; assert_eq!(canonical, "Kubernetes"); assert_eq!(alias, "k8s"); assert!(confidence > 0.9); } /// Test: Alias with frequency #[test] fn test_alias_with_frequency() { let frequency = 5; let confidence = 0.95; assert!(frequency > 0); assert!(confidence > 0.5); } /// Test: Merge suggestion structure #[test] fn test_merge_suggestion_basic() { let entity1 = "Kubernetes"; let entity2 = "K8s"; let confidence = 0.85; assert_ne!(entity1, entity2); assert!(confidence > 0.8); } /// Test: Merge suggestion with reasons #[test] fn test_merge_suggestion_reasons() { let reasons = vec!["Acronym match".to_string()]; assert_eq!(reasons.len(), 1); } /// Test: Merge suggestion multiple reasons #[test] fn test_merge_suggestion_multiple_reasons() { let reasons = vec![ "Acronym match".to_string(), "Common relations".to_string(), ]; assert_eq!(reasons.len(), 2); } /// Test: Coreference cluster structure #[test] fn test_coreference_cluster_basic() { let entity_id = "e1"; let mention_count = 3; assert!(!entity_id.is_empty()); assert!(mention_count > 0); } /// Test: Coreference cluster mentions #[test] fn test_coreference_cluster_mentions() { let mentions = vec!["Kubernetes".to_string(), "k8s".to_string(), "K8s".to_string()]; assert_eq!(mentions.len(), 3); } /// Test: Coreference cluster confidence #[test] fn test_coreference_cluster_confidence() { let confidence = 0.85; assert!(confidence >= 0.0 && confidence <= 1.0); } /// Test: Entity linker initialization #[test] fn test_entity_linker_pool() { let pool_exists = true; assert!(pool_exists); } /// Test: Mention extraction from text #[test] fn test_mention_extraction_capitalized() { let text = "Kubernetes is a platform"; let mention = "Kubernetes"; assert!(text.contains(mention)); } /// Test: Mention extraction multiword #[test] fn test_mention_extraction_multiword() { let text = "Google Cloud Platform provides services"; let mention = "Cloud"; assert!(text.contains(mention)); } /// Test: Acronym detection k8s #[test] fn test_acronym_k8s() { let acronym = "k8s"; let full = "Kubernetes"; assert_ne!(acronym, full); assert!(full.to_lowercase().starts_with("k")); } /// Test: String similarity exact match #[test] fn test_similarity_exact() { let s1 = "Kubernetes"; let s2 = "Kubernetes"; assert_eq!(s1, s2); } /// Test: String similarity case insensitive #[test] fn test_similarity_case_insensitive() { let s1 = "Kubernetes"; let s2 = "kubernetes"; assert_eq!(s1.to_lowercase(), s2.to_lowercase()); } /// Test: String similarity substring #[test] fn test_similarity_substring() { let s1 = "Kubernetes"; let s2 = "Kubernetes Platform"; assert!(s2.contains(s1)); } /// Test: Edit distance same #[test] fn test_edit_distance_same() { let s1 = "test"; let s2 = "test"; assert_eq!(s1, s2); } /// Test: Edit distance one change #[test] fn test_edit_distance_one_char() { let s1 = "test"; let s2 = "text"; assert_ne!(s1, s2); assert!(s1.len() == s2.len()); } /// Test: Edit distance typo #[test] fn test_edit_distance_typo() { let s1 = "Kubernetes"; let s2 = "Kubenetes"; assert_ne!(s1, s2); } /// Test: Link entities request validation #[test] fn test_link_entities_request_valid() { let project = "poimen"; let text = "Kubernetes is great"; assert!(!project.is_empty()); assert!(!text.is_empty()); assert!(text.len() < 10000); } /// Test: Link entities request empty text #[test] fn test_link_entities_request_empty_text() { let text = ""; assert!(text.is_empty()); } /// Test: Link entities request too long #[test] fn test_link_entities_request_too_long() { let text = "x".repeat(10001); assert!(text.len() > 10000); } /// Test: Detect aliases request valid #[test] fn test_detect_aliases_request_valid() { let entity_id = "e1"; let entity_name = "Kubernetes"; let samples = vec!["k8s is great".to_string()]; assert!(!entity_id.is_empty()); assert!(!entity_name.is_empty()); assert!(!samples.is_empty()); } /// Test: Detect aliases empty samples #[test] fn test_detect_aliases_empty_samples() { let samples: Vec = vec![]; assert!(samples.is_empty()); } /// Test: Suggest merges threshold valid #[test] fn test_suggest_merges_threshold_valid() { let threshold = 0.8; assert!(threshold >= 0.0 && threshold <= 1.0); } /// Test: Suggest merges threshold too low #[test] fn test_suggest_merges_threshold_too_low() { let threshold = -0.1; assert!(threshold < 0.0); } /// Test: Suggest merges threshold too high #[test] fn test_suggest_merges_threshold_too_high() { let threshold = 1.5; assert!(threshold > 1.0); } /// Test: Coreference detection request valid #[test] fn test_coreferences_request_valid() { let texts = vec!["Kubernetes is great".to_string()]; assert!(!texts.is_empty()); } /// Test: Coreference detection empty texts #[test] fn test_coreferences_request_empty() { let texts: Vec = vec![]; assert!(texts.is_empty()); } /// Test: Link success rate calculation #[test] fn test_link_success_rate() { let linked = 8; let unlinked = 2; let total = linked + unlinked; let rate = linked as f32 / total as f32; assert_eq!(rate, 0.8); } /// Test: Link success rate all linked #[test] fn test_link_success_rate_all() { let linked = 10; let total = 10; let rate = linked as f32 / total as f32; assert_eq!(rate, 1.0); } /// Test: Link success rate none linked #[test] fn test_link_success_rate_none() { let linked = 0; let total = 10; let rate = if total > 0 { linked as f32 / total as f32 } else { 0.0 }; assert_eq!(rate, 0.0); } /// Test: Mention link response structure #[test] fn test_link_response_structure() { let links_count = 5; let unlinked_count = 2; let total = links_count + unlinked_count; assert_eq!(total, 7); } /// Test: Alias response structure #[test] fn test_alias_response_structure() { let alias_count = 3; let entity_name = "Kubernetes"; assert!(alias_count > 0); assert!(!entity_name.is_empty()); } /// Test: Merge response structure #[test] fn test_merge_response_structure() { let suggestion_count = 5; let project = "poimen"; assert!(suggestion_count > 0); assert_eq!(project, "poimen"); } /// Test: Coreference response structure #[test] fn test_coreference_response_structure() { let cluster_count = 3; let total_mentions = 12; assert!(cluster_count > 0); assert!(total_mentions > 0); } /// Test: Multiple mentions in single text #[test] fn test_multiple_mentions_composition() { let entities = vec!["Kubernetes", "Docker", "Prometheus"]; let mention_count = entities.len(); assert_eq!(mention_count, 3); } /// Test: Linking with high confidence #[test] fn test_linking_high_confidence() { let confidence = 0.95; let threshold = 0.9; assert!(confidence > threshold); } /// Test: Linking below confidence threshold #[test] fn test_linking_low_confidence() { let confidence = 0.65; let threshold = 0.7; assert!(confidence < threshold); } /// Test: Merge candidate filtering by threshold #[test] fn test_merge_threshold_filtering() { let similarity = 0.75; let threshold = 0.8; assert!(similarity < threshold); } /// Test: Coreference from multiple texts #[test] fn test_coreference_multiple_texts() { let texts = vec![ "Kubernetes is great".to_string(), "k8s simplifies deployment".to_string(), "Kubernetes powers modern infrastructure".to_string(), ]; assert_eq!(texts.len(), 3); } /// Test: Serialization of mention link #[test] fn test_mention_link_serializable() { let mention_text = "Kubernetes"; let json_text = "\"Kubernetes\""; assert!(json_text.contains(mention_text)); } /// Test: Serialization of alias suggestion #[test] fn test_alias_suggestion_serializable() { let canonical = "Kubernetes"; let alias = "k8s"; assert_ne!(canonical, alias); } /// Test: Serialization of merge suggestion #[test] fn test_merge_suggestion_serializable() { let entity1 = "Kubernetes"; let entity2 = "K8s"; assert_ne!(entity1, entity2); } /// Test: Rate limiting applies to synthesis #[test] fn test_synthesis_rate_limiting() { let max_per_hour = 100; let requests = 50; assert!(requests < max_per_hour); } /// Test: Processing time tracking #[test] fn test_process_time_tracked() { let process_time_ms = 150; assert!(process_time_ms > 0); } /// Test: Entity linking with mixed case #[test] fn test_entity_linking_mixed_case() { let canonical = "Kubernetes"; let mention = "KUBERNETES"; assert_eq!(canonical.to_lowercase(), mention.to_lowercase()); } /// Test: Alias detection frequency threshold #[test] fn test_alias_frequency_threshold() { let frequency = 2; let min_frequency = 1; assert!(frequency > min_frequency); } }