Skip to content

Commit a83fc3e

Browse files
committed
test: expand pixi locator coverage (Fixes #389)
1 parent e9e15dc commit a83fc3e

1 file changed

Lines changed: 112 additions & 0 deletions

File tree

crates/pet-pixi/src/lib.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,4 +229,116 @@ mod tests {
229229

230230
assert!(locator.try_from(&env).is_none());
231231
}
232+
233+
// ── is_pixi_env edge cases ────────────────────────────────────
234+
235+
#[test]
236+
fn is_pixi_env_rejects_conda_meta_without_pixi_marker() {
237+
let temp_dir = TempDir::new().unwrap();
238+
let prefix = temp_dir.path().join("conda-env");
239+
fs::create_dir_all(prefix.join("conda-meta")).unwrap();
240+
// conda-meta exists but no pixi marker file
241+
assert!(!is_pixi_env(&prefix));
242+
}
243+
244+
#[test]
245+
fn is_pixi_env_rejects_path_without_conda_meta() {
246+
let temp_dir = TempDir::new().unwrap();
247+
let prefix = temp_dir.path().join("plain-dir");
248+
fs::create_dir_all(&prefix).unwrap();
249+
assert!(!is_pixi_env(&prefix));
250+
}
251+
252+
// ── get_pixi_prefix edge cases ────────────────────────────────
253+
254+
#[test]
255+
fn get_pixi_prefix_returns_none_for_non_bin_parent_without_pixi() {
256+
// Executable is in a directory that is neither a pixi env itself
257+
// nor named "bin"/"Scripts", so prefix cannot be derived.
258+
let temp_dir = TempDir::new().unwrap();
259+
let lib_dir = temp_dir.path().join("lib");
260+
fs::create_dir_all(&lib_dir).unwrap();
261+
let executable = lib_dir.join("python");
262+
fs::write(&executable, b"").unwrap();
263+
264+
let env = PythonEnv::new(executable, None, None);
265+
assert!(get_pixi_prefix(&env).is_none());
266+
}
267+
268+
#[test]
269+
fn get_pixi_prefix_returns_none_when_bin_parent_is_not_pixi() {
270+
// Executable is in bin/ but the parent of bin/ is not a pixi env.
271+
let temp_dir = TempDir::new().unwrap();
272+
let prefix = temp_dir.path().join("not-pixi");
273+
let bin_dir = prefix.join("bin");
274+
fs::create_dir_all(&bin_dir).unwrap();
275+
let executable = bin_dir.join("python");
276+
fs::write(&executable, b"").unwrap();
277+
278+
let env = PythonEnv::new(executable, None, None);
279+
assert!(get_pixi_prefix(&env).is_none());
280+
}
281+
282+
#[test]
283+
fn get_pixi_prefix_prefers_explicit_prefix_over_executable_derivation() {
284+
// When env.prefix is set, it should be returned directly
285+
// even if the executable is in a different location.
286+
let temp_dir = TempDir::new().unwrap();
287+
let explicit_prefix = temp_dir.path().join("explicit");
288+
fs::create_dir_all(&explicit_prefix).unwrap();
289+
290+
let env = PythonEnv::new(
291+
temp_dir.path().join("somewhere-else").join("python"),
292+
Some(explicit_prefix.clone()),
293+
None,
294+
);
295+
296+
let result = get_pixi_prefix(&env);
297+
assert_eq!(result, Some(explicit_prefix));
298+
}
299+
300+
// ── try_from field validation ─────────────────────────────────
301+
302+
#[test]
303+
fn try_from_populates_name_from_prefix_directory() {
304+
let temp_dir = TempDir::new().unwrap();
305+
// Use a custom directory name to verify name extraction
306+
let prefix = temp_dir.path().join("my-custom-env");
307+
fs::create_dir_all(prefix.join("conda-meta")).unwrap();
308+
fs::write(prefix.join("conda-meta").join("pixi"), b"").unwrap();
309+
let bin_dir = prefix.join(if cfg!(windows) { "Scripts" } else { "bin" });
310+
fs::create_dir_all(&bin_dir).unwrap();
311+
let executable = bin_dir.join(if cfg!(windows) {
312+
"python.exe"
313+
} else {
314+
"python"
315+
});
316+
fs::write(&executable, b"").unwrap();
317+
318+
let locator = Pixi::new();
319+
let env = PythonEnv::new(executable, Some(prefix), None);
320+
321+
let pixi_env = locator.try_from(&env).unwrap();
322+
assert_eq!(pixi_env.name, Some("my-custom-env".to_string()));
323+
}
324+
325+
#[test]
326+
fn try_from_rejects_when_explicit_prefix_is_not_pixi() {
327+
// env.prefix is set but it's not a pixi env (no conda-meta/pixi)
328+
let temp_dir = TempDir::new().unwrap();
329+
let prefix = temp_dir.path().join("not-pixi");
330+
fs::create_dir_all(&prefix).unwrap();
331+
332+
let executable = prefix.join(if cfg!(windows) {
333+
"python.exe"
334+
} else {
335+
"python"
336+
});
337+
fs::write(&executable, b"").unwrap();
338+
339+
let locator = Pixi::new();
340+
let env = PythonEnv::new(executable, Some(prefix), None);
341+
342+
assert!(locator.try_from(&env).is_none());
343+
}
232344
}

0 commit comments

Comments
 (0)