Skip to content

Commit 0e2d0d0

Browse files
committed
test: add unit tests for pet-windows-registry crate (Fixes #389)
1 parent 2ff10b0 commit 0e2d0d0

1 file changed

Lines changed: 103 additions & 0 deletions

File tree

  • crates/pet-windows-registry/src

crates/pet-windows-registry/src/lib.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)