#![allow(
clippy::missing_docs_in_private_items,
reason = "test helpers and fixtures do not need doc comments"
)]
#[cfg(target_os = "linux")]
use super::*;
#[cfg(target_os = "linux")]
#[test]
fn unit_carries_exec_start_and_install_section() {
let unit = render_unit(std::path::Path::new("/opt/moadim/bin/moadim"));
assert!(unit.contains("ExecStart=/opt/moadim/bin/moadim --interactive"));
assert!(unit.contains("[Install]"));
assert!(unit.contains("WantedBy=default.target"));
assert!(unit.contains("Restart=on-failure"));
assert!(!unit.contains("Restart=always"));
}
#[cfg(target_os = "linux")]
#[test]
fn unit_path_is_under_systemd_user() {
let path = unit_path().unwrap();
assert!(path.ends_with("systemd/user/moadim.service"));
}
#[cfg(target_os = "linux")]
#[test]
fn unit_path_errors_when_config_dir_is_unknown() {
assert!(unit_path_from_config_dir(None).is_err());
let path =
unit_path_from_config_dir(Some(std::path::PathBuf::from("/home/u/.config"))).unwrap();
assert!(path.ends_with("systemd/user/moadim.service"));
}
#[cfg(target_os = "linux")]
#[test]
fn systemctl_bin_never_resolves_to_real_systemctl_in_test_builds() {
let previous = std::env::var_os("MOADIM_SYSTEMCTL_BIN");
unsafe {
std::env::remove_var("MOADIM_SYSTEMCTL_BIN");
}
let bin = systemctl_bin();
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_SYSTEMCTL_BIN", value),
None => std::env::remove_var("MOADIM_SYSTEMCTL_BIN"),
}
}
assert_ne!(
bin, "systemctl",
"test build must not fall back to the real systemctl"
);
assert!(
!std::path::Path::new(&bin).exists(),
"the test-build systemctl guard path must not exist so the spawn fails: {bin}"
);
}
#[cfg(target_os = "linux")]
#[test]
fn write_unit_skips_dir_creation_when_paths_have_no_parent() {
let no_parent = std::path::Path::new("");
assert!(write_unit(no_parent, no_parent).is_err());
}
#[cfg(target_os = "linux")]
#[test]
fn write_unit_errors_when_dir_creation_blocked() {
let base = std::env::temp_dir().join(format!("moadim-wu-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&base).unwrap();
std::fs::write(base.join("systemd"), "block").unwrap();
let unit = base.join("systemd/user/moadim.service");
assert!(write_unit(&unit, std::path::Path::new("/usr/local/bin/moadim")).is_err());
let _ = std::fs::remove_dir_all(&base);
}
#[cfg(target_os = "linux")]
#[test]
fn install_errors_when_write_unit_fails() {
let base = std::env::temp_dir().join(format!("moadim-inst-wu-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&base).unwrap();
std::fs::write(base.join("systemd"), "block").unwrap();
let prev_xdg = std::env::var_os("XDG_CONFIG_HOME");
unsafe {
std::env::set_var("XDG_CONFIG_HOME", &base);
}
let result = install();
unsafe {
match prev_xdg {
Some(val) => std::env::set_var("XDG_CONFIG_HOME", val),
None => std::env::remove_var("XDG_CONFIG_HOME"),
}
}
assert!(result.is_err(), "install must fail when write_unit fails");
let _ = std::fs::remove_dir_all(&base);
}
#[cfg(target_os = "linux")]
#[test]
fn install_errors_when_enable_unit_fails() {
use std::os::unix::fs::PermissionsExt as _;
let base = std::env::temp_dir().join(format!("moadim-inst-eu-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&base).unwrap();
let shim = base.join("systemctl");
std::fs::write(&shim, "#!/bin/sh\nexit 1\n").unwrap();
std::fs::set_permissions(&shim, std::fs::Permissions::from_mode(0o755)).unwrap();
let prev_xdg = std::env::var_os("XDG_CONFIG_HOME");
let prev_systemctl = std::env::var_os("MOADIM_SYSTEMCTL_BIN");
unsafe {
std::env::set_var("XDG_CONFIG_HOME", &base);
std::env::set_var("MOADIM_SYSTEMCTL_BIN", &shim);
}
let result = install();
unsafe {
match prev_xdg {
Some(val) => std::env::set_var("XDG_CONFIG_HOME", val),
None => std::env::remove_var("XDG_CONFIG_HOME"),
}
match prev_systemctl {
Some(val) => std::env::set_var("MOADIM_SYSTEMCTL_BIN", val),
None => std::env::remove_var("MOADIM_SYSTEMCTL_BIN"),
}
}
assert!(
result.is_err(),
"install must fail when systemctl daemon-reload fails"
);
let _ = std::fs::remove_dir_all(&base);
}
include!("uninstall_errors_when_remove_unit_fails_tests.rs");