@@ -555,4 +555,107 @@ mod tests {
555555 "find() must populate the cache after walking both hives" ,
556556 ) ;
557557 }
558+
559+ #[ test]
560+ fn test_try_from_returns_none_for_plain_env_without_cache ( ) {
561+ // A non-virtualenv, non-conda env returns None when no matching
562+ // executable is found in the registry. On Unix the registry lookup
563+ // is compiled out, so this always returns None after the guards.
564+ let temp_dir = TempDir :: new ( ) . unwrap ( ) ;
565+ let prefix = temp_dir. path ( ) . to_path_buf ( ) ;
566+ let executable = prefix. join ( if cfg ! ( windows) {
567+ "python.exe"
568+ } else {
569+ "python"
570+ } ) ;
571+ fs:: create_dir_all ( & prefix) . unwrap ( ) ;
572+ fs:: write ( & executable, b"" ) . unwrap ( ) ;
573+ let env = PythonEnv :: new ( executable, Some ( prefix) , None ) ;
574+ let locator = create_locator ( ) ;
575+
576+ assert ! ( locator. try_from( & env) . is_none( ) ) ;
577+ }
578+
579+ #[ test]
580+ fn test_sync_full_when_source_has_none_cache ( ) {
581+ let shared = create_locator ( ) ;
582+ let refreshed = create_locator ( ) ;
583+
584+ shared
585+ . search_result
586+ . lock ( )
587+ . unwrap ( )
588+ . replace ( wrap_cached ( LocatorResult {
589+ managers : vec ! [ ] ,
590+ environments : vec ! [ PythonEnvironment {
591+ name: Some ( "existing" . to_string( ) ) ,
592+ ..Default :: default ( )
593+ } ] ,
594+ } ) ) ;
595+
596+ shared. sync_refresh_state_from ( & refreshed, & RefreshStateSyncScope :: Full ) ;
597+
598+ assert ! ( shared. search_result. lock( ) . unwrap( ) . is_none( ) ) ;
599+ }
600+
601+ #[ test]
602+ fn test_sync_is_idempotent ( ) {
603+ let shared = create_locator ( ) ;
604+ let refreshed = create_locator ( ) ;
605+
606+ refreshed
607+ . search_result
608+ . lock ( )
609+ . unwrap ( )
610+ . replace ( wrap_cached ( LocatorResult {
611+ managers : vec ! [ ] ,
612+ environments : vec ! [ PythonEnvironment {
613+ name: Some ( "fresh" . to_string( ) ) ,
614+ ..Default :: default ( )
615+ } ] ,
616+ } ) ) ;
617+
618+ shared. sync_refresh_state_from ( & refreshed, & RefreshStateSyncScope :: Full ) ;
619+ shared. sync_refresh_state_from ( & refreshed, & RefreshStateSyncScope :: Full ) ;
620+
621+ let result = shared. search_result . lock ( ) . unwrap ( ) . clone ( ) . unwrap ( ) ;
622+ assert_eq ! ( result. result. environments. len( ) , 1 ) ;
623+ assert_eq ! ( result. result. environments[ 0 ] . name. as_deref( ) , Some ( "fresh" ) ) ;
624+ }
625+
626+ #[ test]
627+ fn test_global_filtered_conda_kind_syncs ( ) {
628+ let shared = create_locator ( ) ;
629+ let refreshed = create_locator ( ) ;
630+
631+ shared
632+ . search_result
633+ . lock ( )
634+ . unwrap ( )
635+ . replace ( wrap_cached ( LocatorResult {
636+ managers : vec ! [ ] ,
637+ environments : vec ! [ PythonEnvironment {
638+ name: Some ( "stale" . to_string( ) ) ,
639+ ..Default :: default ( )
640+ } ] ,
641+ } ) ) ;
642+ refreshed
643+ . search_result
644+ . lock ( )
645+ . unwrap ( )
646+ . replace ( wrap_cached ( LocatorResult {
647+ managers : vec ! [ ] ,
648+ environments : vec ! [ PythonEnvironment {
649+ name: Some ( "fresh" . to_string( ) ) ,
650+ ..Default :: default ( )
651+ } ] ,
652+ } ) ) ;
653+
654+ shared. sync_refresh_state_from (
655+ & refreshed,
656+ & RefreshStateSyncScope :: GlobalFiltered ( PythonEnvironmentKind :: Conda ) ,
657+ ) ;
658+ let result = shared. search_result . lock ( ) . unwrap ( ) . clone ( ) . unwrap ( ) ;
659+ assert_eq ! ( result. result. environments[ 0 ] . name. as_deref( ) , Some ( "fresh" ) ) ;
660+ }
558661}
0 commit comments