@@ -730,4 +730,133 @@ mod tests {
730730 let _ = std:: fs:: remove_file ( & symlink_path) ;
731731 let _ = std:: fs:: remove_file ( & target_file) ;
732732 }
733+
734+ // ==================== resolve_dot_venv tests ====================
735+
736+ #[ test]
737+ fn test_resolve_dot_venv_no_dot_venv ( ) {
738+ // If .venv does not exist, return None
739+ let temp_dir = std:: env:: temp_dir ( ) ;
740+ let test_dir = temp_dir. join ( "pet_test_no_dot_venv" ) ;
741+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
742+ std:: fs:: create_dir_all ( & test_dir) . expect ( "Failed to create test dir" ) ;
743+
744+ assert_eq ! ( resolve_dot_venv( & test_dir) , None ) ;
745+
746+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
747+ }
748+
749+ #[ test]
750+ fn test_resolve_dot_venv_directory ( ) {
751+ // If .venv is a directory, return its path
752+ let temp_dir = std:: env:: temp_dir ( ) ;
753+ let test_dir = temp_dir. join ( "pet_test_dot_venv_dir" ) ;
754+ let dot_venv = test_dir. join ( ".venv" ) ;
755+
756+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
757+ std:: fs:: create_dir_all ( & dot_venv) . expect ( "Failed to create .venv dir" ) ;
758+
759+ let result = resolve_dot_venv ( & test_dir) ;
760+ assert_eq ! ( result, Some ( dot_venv) ) ;
761+
762+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
763+ }
764+
765+ #[ test]
766+ fn test_resolve_dot_venv_file_absolute_path ( ) {
767+ // If .venv is a file containing an absolute path to an existing directory, return it
768+ let temp_dir = std:: env:: temp_dir ( ) ;
769+ let test_dir = temp_dir. join ( "pet_test_dot_venv_file_abs" ) ;
770+ let target_venv = temp_dir. join ( "pet_test_dot_venv_target_abs" ) ;
771+
772+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
773+ let _ = std:: fs:: remove_dir_all ( & target_venv) ;
774+ std:: fs:: create_dir_all ( & test_dir) . expect ( "Failed to create test dir" ) ;
775+ std:: fs:: create_dir_all ( & target_venv) . expect ( "Failed to create target venv dir" ) ;
776+
777+ let dot_venv_file = test_dir. join ( ".venv" ) ;
778+ std:: fs:: write ( & dot_venv_file, target_venv. to_string_lossy ( ) . as_ref ( ) )
779+ . expect ( "Failed to write .venv file" ) ;
780+
781+ let result = resolve_dot_venv ( & test_dir) ;
782+ assert_eq ! ( result, Some ( target_venv. clone( ) ) ) ;
783+
784+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
785+ let _ = std:: fs:: remove_dir_all ( & target_venv) ;
786+ }
787+
788+ #[ test]
789+ fn test_resolve_dot_venv_file_relative_path ( ) {
790+ // If .venv is a file containing a relative path, resolve it against the dir
791+ let temp_dir = std:: env:: temp_dir ( ) ;
792+ let test_dir = temp_dir. join ( "pet_test_dot_venv_file_rel" ) ;
793+ let target_venv = test_dir. join ( "my_venv" ) ;
794+
795+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
796+ std:: fs:: create_dir_all ( & target_venv) . expect ( "Failed to create target venv dir" ) ;
797+
798+ let dot_venv_file = test_dir. join ( ".venv" ) ;
799+ std:: fs:: write ( & dot_venv_file, "my_venv" ) . expect ( "Failed to write .venv file" ) ;
800+
801+ let result = resolve_dot_venv ( & test_dir) ;
802+ assert_eq ! ( result, Some ( target_venv. clone( ) ) ) ;
803+
804+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
805+ }
806+
807+ #[ test]
808+ fn test_resolve_dot_venv_file_nonexistent_target ( ) {
809+ // If .venv is a file pointing to a non-existent directory, return None
810+ let temp_dir = std:: env:: temp_dir ( ) ;
811+ let test_dir = temp_dir. join ( "pet_test_dot_venv_file_missing" ) ;
812+
813+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
814+ std:: fs:: create_dir_all ( & test_dir) . expect ( "Failed to create test dir" ) ;
815+
816+ let dot_venv_file = test_dir. join ( ".venv" ) ;
817+ std:: fs:: write ( & dot_venv_file, "/this/path/does/not/exist" )
818+ . expect ( "Failed to write .venv file" ) ;
819+
820+ assert_eq ! ( resolve_dot_venv( & test_dir) , None ) ;
821+
822+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
823+ }
824+
825+ #[ test]
826+ fn test_resolve_dot_venv_file_whitespace_trimmed ( ) {
827+ // Whitespace around the path should be trimmed
828+ let temp_dir = std:: env:: temp_dir ( ) ;
829+ let test_dir = temp_dir. join ( "pet_test_dot_venv_whitespace" ) ;
830+ let target_venv = test_dir. join ( "ws_venv" ) ;
831+
832+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
833+ std:: fs:: create_dir_all ( & target_venv) . expect ( "Failed to create target venv dir" ) ;
834+
835+ let dot_venv_file = test_dir. join ( ".venv" ) ;
836+ std:: fs:: write ( & dot_venv_file, " ws_venv \n " ) . expect ( "Failed to write .venv file" ) ;
837+
838+ let result = resolve_dot_venv ( & test_dir) ;
839+ assert_eq ! ( result, Some ( target_venv. clone( ) ) ) ;
840+
841+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
842+ }
843+
844+ #[ test]
845+ fn test_resolve_dot_venv_file_points_to_file_not_dir ( ) {
846+ // If .venv file points to a path that exists but is a file (not a dir), return None
847+ let temp_dir = std:: env:: temp_dir ( ) ;
848+ let test_dir = temp_dir. join ( "pet_test_dot_venv_target_is_file" ) ;
849+ let target_file = test_dir. join ( "not_a_dir" ) ;
850+
851+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
852+ std:: fs:: create_dir_all ( & test_dir) . expect ( "Failed to create test dir" ) ;
853+ std:: fs:: write ( & target_file, "I am a file" ) . expect ( "Failed to create target file" ) ;
854+
855+ let dot_venv_file = test_dir. join ( ".venv" ) ;
856+ std:: fs:: write ( & dot_venv_file, "not_a_dir" ) . expect ( "Failed to write .venv file" ) ;
857+
858+ assert_eq ! ( resolve_dot_venv( & test_dir) , None ) ;
859+
860+ let _ = std:: fs:: remove_dir_all ( & test_dir) ;
861+ }
733862}
0 commit comments