#![cfg(unix)]
use std::os::unix::fs::symlink;
use std::process::Command;
use tempfile::TempDir;
#[test]
fn it_exits_126_when_real_git_is_found_but_unexecutable() {
let bin = env!("CARGO_BIN_EXE_git-prism");
let tmp = TempDir::new().unwrap();
let shim_dir = tmp.path().join("shimbin");
let real_dir = tmp.path().join("realbin");
std::fs::create_dir_all(&shim_dir).unwrap();
std::fs::create_dir_all(&real_dir).unwrap();
let shim_git = shim_dir.join("git");
symlink(bin, &shim_git).unwrap();
std::fs::create_dir(real_dir.join("git")).unwrap();
let path = format!("{}:{}", shim_dir.display(), real_dir.display());
let status = Command::new(&shim_git)
.env("GIT_PRISM_INSIDE_SHIM", "1")
.env("PATH", &path)
.arg("status")
.status()
.unwrap();
assert_eq!(
status.code(),
Some(126),
"found-but-unexecutable real git must yield exit 126, not 127"
);
}
#[test]
fn shim_status_reports_broken_for_dangling_symlink() {
let bin = env!("CARGO_BIN_EXE_git-prism");
let home = TempDir::new().unwrap();
let shim_dir = home.path().join(".local/share/git-prism/bin");
std::fs::create_dir_all(&shim_dir).unwrap();
symlink(
home.path().join("nonexistent-target-xyz"),
shim_dir.join("git"),
)
.unwrap();
let out = Command::new(bin)
.env("HOME", home.path())
.args(["shim", "status"])
.output()
.unwrap();
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("broken"),
"dangling symlink must be reported as broken; got: {stdout}"
);
assert!(
!stdout.contains("shim: installed"),
"dangling symlink must NOT be reported as installed; got: {stdout}"
);
}