@@ -167,4 +167,105 @@ mod tests {
167167 Some ( "3.11.9" . to_string( ) )
168168 ) ;
169169 }
170+
171+ #[ test]
172+ fn extract_version_from_opt_homebrew_path ( ) {
173+ assert_eq ! (
174+ get_version( & PathBuf :: from(
175+ "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/bin/python3.12"
176+ ) ) ,
177+ Some ( "3.12.3" . to_string( ) )
178+ ) ;
179+ }
180+
181+ #[ test]
182+ fn extract_version_from_usr_local_cellar_path ( ) {
183+ assert_eq ! (
184+ get_version( & PathBuf :: from(
185+ "/usr/local/Cellar/python@3.8/3.8.20/Frameworks/Python.framework/Versions/3.8/bin/python3.8"
186+ ) ) ,
187+ Some ( "3.8.20" . to_string( ) )
188+ ) ;
189+ }
190+
191+ #[ test]
192+ fn extract_version_returns_none_for_path_without_version ( ) {
193+ assert_eq ! ( get_version( & PathBuf :: from( "/usr/bin/python3" ) ) , None ) ;
194+ }
195+
196+ #[ test]
197+ fn get_prefix_always_returns_none ( ) {
198+ assert ! ( get_prefix( & PathBuf :: from(
199+ "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/bin/python3.12"
200+ ) )
201+ . is_none( ) ) ;
202+ assert ! ( get_prefix( & PathBuf :: from(
203+ "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.4/bin/python3.12"
204+ ) )
205+ . is_none( ) ) ;
206+ assert ! ( get_prefix( & PathBuf :: from(
207+ "/usr/local/Cellar/python@3.8/3.8.20/bin/python3.8"
208+ ) )
209+ . is_none( ) ) ;
210+ }
211+
212+ #[ test]
213+ fn get_python_info_returns_correct_kind_and_executable ( ) {
214+ let bin_exe = PathBuf :: from ( "/home/linuxbrew/.linuxbrew/bin/python3.12" ) ;
215+ let resolved_exe =
216+ PathBuf :: from ( "/home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.4/bin/python3.12" ) ;
217+
218+ let env = get_python_info ( & bin_exe, & resolved_exe) . unwrap ( ) ;
219+
220+ assert_eq ! ( env. kind, Some ( PythonEnvironmentKind :: Homebrew ) ) ;
221+ assert_eq ! ( env. executable, Some ( bin_exe. clone( ) ) ) ;
222+ assert_eq ! ( env. version, Some ( "3.12.4" . to_string( ) ) ) ;
223+ assert_eq ! ( env. prefix, None ) ;
224+ // Both bin exe and resolved exe should be in symlinks
225+ let symlinks = env. symlinks . unwrap ( ) ;
226+ assert ! ( symlinks. contains( & bin_exe) ) ;
227+ assert ! ( symlinks. contains( & resolved_exe) ) ;
228+ }
229+
230+ #[ test]
231+ fn get_python_info_returns_none_version_for_unversioned_path ( ) {
232+ let bin_exe = PathBuf :: from ( "/home/linuxbrew/.linuxbrew/bin/python3" ) ;
233+ let resolved_exe = PathBuf :: from ( "/home/linuxbrew/.linuxbrew/bin/python3" ) ;
234+
235+ let env = get_python_info ( & bin_exe, & resolved_exe) . unwrap ( ) ;
236+
237+ assert_eq ! ( env. kind, Some ( PythonEnvironmentKind :: Homebrew ) ) ;
238+ assert_eq ! ( env. version, None ) ;
239+ }
240+
241+ #[ test]
242+ fn get_python_info_for_opt_homebrew_path ( ) {
243+ let bin_exe = PathBuf :: from ( "/opt/homebrew/bin/python3.12" ) ;
244+ let resolved_exe = PathBuf :: from (
245+ "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/bin/python3.12" ,
246+ ) ;
247+
248+ let env = get_python_info ( & bin_exe, & resolved_exe) . unwrap ( ) ;
249+
250+ assert_eq ! ( env. kind, Some ( PythonEnvironmentKind :: Homebrew ) ) ;
251+ assert_eq ! ( env. executable, Some ( bin_exe. clone( ) ) ) ;
252+ assert_eq ! ( env. version, Some ( "3.12.3" . to_string( ) ) ) ;
253+ let symlinks = env. symlinks . unwrap ( ) ;
254+ assert ! ( symlinks. contains( & bin_exe) ) ;
255+ assert ! ( symlinks. contains( & resolved_exe) ) ;
256+ }
257+
258+ #[ test]
259+ fn get_python_info_for_usr_local_cellar_path ( ) {
260+ let bin_exe = PathBuf :: from ( "/usr/local/bin/python3.8" ) ;
261+ let resolved_exe = PathBuf :: from (
262+ "/usr/local/Cellar/python@3.8/3.8.20/Frameworks/Python.framework/Versions/3.8/bin/python3.8" ,
263+ ) ;
264+
265+ let env = get_python_info ( & bin_exe, & resolved_exe) . unwrap ( ) ;
266+
267+ assert_eq ! ( env. kind, Some ( PythonEnvironmentKind :: Homebrew ) ) ;
268+ assert_eq ! ( env. executable, Some ( bin_exe) ) ;
269+ assert_eq ! ( env. version, Some ( "3.8.20" . to_string( ) ) ) ;
270+ }
170271}
0 commit comments