use crate::cli::commands::{running_as_root, unit_scope_probe, user_home_from};
use std::path::{Path, PathBuf};
fn with_dirs<F: FnOnce(&Path, &Path)>(f: F) {
let base = tempfile::tempdir().expect("tempdir");
let system_dir = base.path().join("system");
let user_dir = base.path().join("user");
std::fs::create_dir_all(&system_dir).unwrap();
std::fs::create_dir_all(&user_dir).unwrap();
f(&system_dir, &user_dir);
}
fn touch(dir: &Path, name: &str) {
std::fs::File::create(dir.join(name)).unwrap();
}
#[test]
fn system_file_exists_returns_system_scope() {
with_dirs(|sys, usr| {
touch(sys, "opencrabs.service");
assert!(unit_scope_probe("opencrabs", sys, Some(usr)));
});
}
#[test]
fn only_user_file_exists_returns_user_scope() {
with_dirs(|sys, usr| {
touch(usr, "opencrabs.service");
assert!(!unit_scope_probe("opencrabs", sys, Some(usr)));
});
}
#[test]
fn both_exist_system_wins() {
with_dirs(|sys, usr| {
touch(sys, "opencrabs.service");
touch(usr, "opencrabs.service");
assert!(unit_scope_probe("opencrabs", sys, Some(usr)));
});
}
#[test]
fn neither_exists_falls_back_to_running_as_root() {
with_dirs(|sys, usr| {
let expected = running_as_root();
assert_eq!(unit_scope_probe("opencrabs", sys, Some(usr)), expected);
});
}
#[test]
fn no_user_dir_falls_back_to_running_as_root() {
with_dirs(|sys, _usr| {
let expected = running_as_root();
assert_eq!(unit_scope_probe("opencrabs", sys, None), expected);
});
}
#[test]
fn system_file_with_no_user_dir() {
with_dirs(|sys, _usr| {
touch(sys, "opencrabs.service");
assert!(unit_scope_probe("opencrabs", sys, None));
});
}
#[test]
fn profiled_service_name() {
with_dirs(|sys, usr| {
touch(usr, "opencrabs-ops.service");
assert!(!unit_scope_probe("opencrabs-ops", sys, Some(usr)));
});
}
#[test]
fn sudo_user_resolves_to_their_home() {
let fallback = Some(PathBuf::from("/root"));
assert_eq!(
user_home_from(Some("alice"), fallback),
Some(PathBuf::from("/home/alice"))
);
}
#[test]
fn sudo_user_root_uses_fallback() {
let fallback = Some(PathBuf::from("/root"));
assert_eq!(user_home_from(Some("root"), fallback.clone()), fallback);
}
#[test]
fn sudo_user_empty_uses_fallback() {
let fallback = Some(PathBuf::from("/root"));
assert_eq!(user_home_from(Some(""), fallback.clone()), fallback);
}
#[test]
fn no_sudo_user_uses_fallback() {
let fallback = Some(PathBuf::from("/home/bob"));
assert_eq!(user_home_from(None, fallback.clone()), fallback);
}