@@ -94,9 +94,16 @@ def test_mock_versions_folder(temp_finder):
9494 patch ("os.scandir" ) as scandir_mock , \
9595 patch .object (DetailFinder , "get_install_details" ) as details_mock :
9696
97+ assert os .path .exists is exists_mock
98+
9799 return_val = PythonInstall .from_str (version = out_ver , executable = out_executable , managed_by = "pyenv" )
98100 details_mock .return_value = return_val
99- exists_mock .return_value = True
101+
102+ def false_on_venv_check (pth ):
103+ # Need to return False on the venv check, but True on all other exists checks
104+ return False if pth .endswith ("pyvenv.cfg" ) else True
105+
106+ exists_mock .side_effect = false_on_venv_check
100107 scandir_mock .return_value = iter ([mock_dir_entry ])
101108
102109 python_versions = list (get_pyenv_pythons (versions_folder = versions_folder , finder = temp_finder ))
@@ -106,6 +113,40 @@ def test_mock_versions_folder(temp_finder):
106113 assert python_versions == [return_val ]
107114
108115
116+ def test_mock_folder_skip_venv (temp_finder ):
117+ # If the venv check returns true, make sure the folder is skipped
118+ mock_dir_entry = Mock (os .DirEntry )
119+
120+ out_ver = "3.12.1"
121+ if sys .platform == "win32" :
122+ versions_folder = os .path .join ("c:" , "fake" , "versions" )
123+ out_executable = os .path .join (versions_folder , out_ver , "python.exe" )
124+ else :
125+ versions_folder = "~/fake/versions"
126+ out_executable = os .path .join (versions_folder , out_ver , "bin/python" )
127+
128+ mock_dir_entry .name = out_ver
129+ mock_dir_entry .path = os .path .join (versions_folder , out_ver )
130+
131+ with patch ("os.path.exists" ) as exists_mock , \
132+ patch ("os.scandir" ) as scandir_mock , \
133+ patch .object (DetailFinder , "get_install_details" ) as details_mock :
134+
135+ assert os .path .exists is exists_mock
136+
137+ return_val = PythonInstall .from_str (version = out_ver , executable = out_executable , managed_by = "pyenv" )
138+ details_mock .return_value = return_val
139+
140+ exists_mock .return_value = True
141+ scandir_mock .return_value = iter ([mock_dir_entry ])
142+
143+ python_versions = list (get_pyenv_pythons (versions_folder = versions_folder , finder = temp_finder ))
144+
145+ details_mock .assert_not_called ()
146+
147+ assert python_versions == []
148+
149+
109150@pytest .mark .skipif (sys .platform != "win32" , reason = "Test for Windows only" )
110151def test_fs_versions_win (fs , temp_finder ):
111152 # Test with folders in fake file system
@@ -125,7 +166,15 @@ def test_fs_versions_win(fs, temp_finder):
125166
126167 details_mock .assert_called_once_with (py_exe , managed_by = "pyenv" )
127168
128- assert versions == [PythonInstall .from_str (version = "3.12.1" , executable = py_exe , managed_by = "pyenv" )]
169+ assert versions == [return_val ]
170+
171+ # Check presence of a 'pyvenv.cfg' ignores the folder
172+ details_mock .reset_mock ()
173+ fs .create_file (os .path .join (py_folder , "pyvenv.cfg" ))
174+
175+ versions = list (get_pyenv_pythons (tmpdir , finder = temp_finder ))
176+ details_mock .assert_not_called ()
177+ assert versions == []
129178
130179
131180@pytest .mark .skipif (sys .platform == "win32" , reason = "Test for non-Windows only" )
@@ -148,7 +197,15 @@ def test_fs_versions_nix(fs, temp_finder):
148197 versions = list (get_pyenv_pythons (tmpdir , finder = temp_finder ))
149198 details_mock .assert_called_once_with (py_exe , managed_by = "pyenv" )
150199
151- assert versions == [PythonInstall .from_str (version = "3.12.1" , executable = py_exe , managed_by = "pyenv" )]
200+ assert versions == [return_val ]
201+
202+ details_mock .reset_mock ()
203+
204+ # Test the same folder is ignored if a 'pyvenv.cfg' file is discovered
205+ fs .create_file (os .path .join (py_folder , "pyvenv.cfg" ))
206+ versions = list (get_pyenv_pythons (tmpdir , finder = temp_finder ))
207+ details_mock .assert_not_called ()
208+ assert versions == []
152209
153210
154211@pytest .mark .skipif (sys .platform == "win32" , reason = "Test for non-Windows only" )
0 commit comments