/ tests / hover_test.rs
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  }