33from unittest .mock import AsyncMock , MagicMock , patch
44
55import pytest
6+ from lsprotocol .types import WorkspaceFolder
67from pygls .exceptions import JsonRpcInternalError , JsonRpcInvalidRequest
78from pygls .server import LanguageServer
89
@@ -20,6 +21,7 @@ def mock_language_server():
2021 ls .progress .create_async = AsyncMock ()
2122 ls .progress .begin = MagicMock ()
2223 ls .progress .end = MagicMock ()
24+ ls .workspace = MagicMock ()
2325 return ls
2426
2527
@@ -92,7 +94,6 @@ async def test_execute_command_query_default_proj_root(
9294 patch ("builtins.open" , MagicMock ()) as mock_open ,
9395 ):
9496 global DEFAULT_PROJECT_ROOT
95-
9697 mock_config .project_root = None
9798 mock_parse_cli_args .return_value = mock_config
9899 mock_get_query_result_files .return_value = ["/test/file.txt" ]
@@ -115,6 +116,46 @@ async def test_execute_command_query_default_proj_root(
115116 mock_language_server .progress .end .assert_called ()
116117
117118
119+ @pytest .mark .asyncio
120+ async def test_execute_command_query_workspace_dir (mock_language_server , mock_config ):
121+ workspace_folder = WorkspaceFolder (uri = "file:///dummy_dir" , name = "dummy_dir" )
122+ with (
123+ patch (
124+ "vectorcode.lsp_main.parse_cli_args" , new_callable = AsyncMock
125+ ) as mock_parse_cli_args ,
126+ patch ("vectorcode.lsp_main.ClientManager" ),
127+ patch ("vectorcode.lsp_main.get_collection" , new_callable = AsyncMock ),
128+ patch (
129+ "vectorcode.lsp_main.build_query_results" , new_callable = AsyncMock
130+ ) as mock_get_query_result_files ,
131+ patch ("os.path.isfile" , return_value = True ),
132+ patch ("os.path.isdir" , return_value = True ),
133+ patch ("builtins.open" , MagicMock ()) as mock_open ,
134+ ):
135+ mock_language_server .workspace = MagicMock ()
136+ mock_language_server .workspace .folders = {"dummy_dir" : workspace_folder }
137+ mock_config .project_root = None
138+ mock_parse_cli_args .return_value = mock_config
139+ mock_get_query_result_files .return_value = ["/test/file.txt" ]
140+
141+ # Configure the MagicMock object to return a string when read() is called
142+ mock_file = MagicMock ()
143+ mock_file .__enter__ .return_value .read .return_value = "{}" # Return valid JSON
144+ mock_open .return_value = mock_file
145+
146+ # Mock the merge_from method
147+ mock_config .merge_from = AsyncMock (return_value = mock_config )
148+
149+ result = await execute_command (mock_language_server , ["query" , "test" ])
150+
151+ assert isinstance (result , list )
152+ mock_language_server .progress .begin .assert_called ()
153+ mock_language_server .progress .end .assert_called ()
154+ assert (
155+ mock_get_query_result_files .call_args .args [1 ].project_root == "/dummy_dir"
156+ )
157+
158+
118159@pytest .mark .asyncio
119160async def test_execute_command_ls (mock_language_server , mock_config ):
120161 mock_config .action = CliAction .ls
0 commit comments