hover_test.rs
1 use ecolog_lsp::analysis::document::DocumentManager; 2 use ecolog_lsp::analysis::query::QueryEngine; 3 use ecolog_lsp::languages::LanguageRegistry; 4 use std::sync::Arc; 5 use tower_lsp::lsp_types::{Position, Url}; 6 7 async fn setup_manager() -> DocumentManager { 8 let query_engine = Arc::new(QueryEngine::new()); 9 let mut registry = LanguageRegistry::new(); 10 registry.register(Arc::new(ecolog_lsp::languages::javascript::JavaScript)); 11 registry.register(Arc::new(ecolog_lsp::languages::typescript::TypeScript)); 12 registry.register(Arc::new(ecolog_lsp::languages::python::Python)); 13 let languages = Arc::new(registry); 14 DocumentManager::new(query_engine, languages.clone()) 15 } 16 17 #[tokio::test] 18 async fn test_hover_direct_access() { 19 let doc_manager = setup_manager().await; 20 let uri = Url::parse("file:///test.js").unwrap(); 21 let content = r#" 22 const api = process.env.API_KEY; 23 "#; 24 doc_manager 25 .open(uri.clone(), "javascript".into(), content.to_string(), 1) 26 .await; 27 28 let ref1 = doc_manager.get_env_reference_cloned(&uri, Position::new(1, 26)); 29 assert!(ref1.is_some(), "Should find reference for direct access"); 30 assert_eq!(ref1.unwrap().name, "API_KEY"); 31 } 32 33 #[tokio::test] 34 async fn test_hover_object_alias() { 35 let doc_manager = setup_manager().await; 36 let uri = Url::parse("file:///test.js").unwrap(); 37 let content = r#" 38 const env = process.env; 39 const secret = env.SECRET; 40 "#; 41 doc_manager 42 .open(uri.clone(), "javascript".into(), content.to_string(), 1) 43 .await; 44 45 let ref1 = doc_manager.get_env_reference_cloned(&uri, Position::new(2, 22)); 46 assert!(ref1.is_some(), "Should find reference via object alias"); 47 assert_eq!(ref1.unwrap().name, "SECRET"); 48 } 49 50 #[tokio::test] 51 async fn test_hover_subscript_access() { 52 let doc_manager = setup_manager().await; 53 let uri = Url::parse("file:///test.js").unwrap(); 54 let content = r#" 55 const env = process.env; 56 const db = env["DATABASE_URL"]; 57 "#; 58 doc_manager 59 .open(uri.clone(), "javascript".into(), content.to_string(), 1) 60 .await; 61 62 let ref1 = doc_manager.get_env_reference_cloned(&uri, Position::new(2, 20)); 63 assert!(ref1.is_some(), "Should find reference via subscript access"); 64 assert_eq!(ref1.unwrap().name, "DATABASE_URL"); 65 } 66 67 #[tokio::test] 68 async fn test_repro_integration_js_single_line() { 69 let doc_manager = setup_manager().await; 70 let uri = Url::parse("file:///test.js").unwrap(); 71 let content = "const a = process.env.DB_URL;"; 72 doc_manager 73 .open(uri.clone(), "javascript".into(), content.to_string(), 0) 74 .await; 75 76 let ref1 = doc_manager.get_env_reference_cloned(&uri, Position::new(0, 22)); 77 assert!( 78 ref1.is_some(), 79 "Should find reference for single line direct access" 80 ); 81 assert_eq!(ref1.unwrap().name, "DB_URL"); 82 }