@@ -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