#![allow(
clippy::missing_docs_in_private_items,
reason = "test helpers and fixtures do not need doc comments"
)]
use super::*;
fn with_path(value: &std::path::Path, body: impl FnOnce()) {
let saved = std::env::var_os("PATH");
unsafe {
std::env::set_var("PATH", value);
}
body();
unsafe {
match saved {
Some(prev) => std::env::set_var("PATH", prev),
None => std::env::remove_var("PATH"),
}
}
}
#[test]
fn tmux_available_in_true_when_fake_tmux_present() {
let dir = std::env::temp_dir().join(format!("moadim-tmux-present-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let tmux = dir.join("tmux");
std::fs::write(&tmux, "#!/bin/sh\n").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt as _;
std::fs::set_permissions(&tmux, std::fs::Permissions::from_mode(0o755)).unwrap();
}
assert!(tmux_available_in(&dir.to_string_lossy()));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn tmux_available_in_false_when_dir_has_no_tmux() {
let dir = std::env::temp_dir().join(format!("moadim-tmux-missing-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
assert!(!tmux_available_in(&dir.to_string_lossy()));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn tmux_available_reads_live_path_present() {
let dir = std::env::temp_dir().join(format!("moadim-tmux-live-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let tmux = dir.join("tmux");
std::fs::write(&tmux, "#!/bin/sh\n").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt as _;
std::fs::set_permissions(&tmux, std::fs::Permissions::from_mode(0o755)).unwrap();
}
with_path(&dir, || assert!(tmux_available()));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn tmux_available_false_when_path_unset() {
let saved = std::env::var_os("PATH");
unsafe {
std::env::remove_var("PATH");
}
assert!(!tmux_available());
unsafe {
if let Some(prev) = saved {
std::env::set_var("PATH", prev);
}
}
}
#[test]
fn agent_command_available_in_true_when_fake_command_present() {
let dir =
std::env::temp_dir().join(format!("moadim-agentcmd-present-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let bin = dir.join("fake-agent-cmd");
std::fs::write(&bin, "#!/bin/sh\n").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt as _;
std::fs::set_permissions(&bin, std::fs::Permissions::from_mode(0o755)).unwrap();
}
assert!(agent_command_available_in(
&dir.to_string_lossy(),
"fake-agent-cmd"
));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn resolve_tmux_bin_from_prefers_path_over_fallbacks() {
let dir =
std::env::temp_dir().join(format!("moadim-resolve-tmux-path-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("tmux"), "#!/bin/sh\n").unwrap();
let dir_str = dir.to_string_lossy().into_owned();
let resolved = resolve_tmux_bin_from(&dir_str, &["/definitely/not/here".to_string()]);
assert_eq!(resolved, format!("{dir_str}/tmux"));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn agent_command_available_in_false_when_dir_has_no_command() {
let dir =
std::env::temp_dir().join(format!("moadim-agentcmd-missing-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
assert!(!agent_command_available_in(
&dir.to_string_lossy(),
"fake-agent-cmd"
));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn resolve_tmux_bin_from_falls_back_to_first_matching_fallback_dir() {
let base =
std::env::temp_dir().join(format!("moadim-resolve-tmux-fb-{}", uuid::Uuid::new_v4()));
let missing = base.join("missing");
let present = base.join("present");
std::fs::create_dir_all(&present).unwrap();
std::fs::write(present.join("tmux"), "#!/bin/sh\n").unwrap();
let resolved = resolve_tmux_bin_from(
"",
&[
missing.to_string_lossy().into_owned(),
present.to_string_lossy().into_owned(),
],
);
assert_eq!(resolved, format!("{}/tmux", present.to_string_lossy()));
let _ = std::fs::remove_dir_all(&base);
}
#[test]
fn resolve_tmux_bin_from_returns_bare_name_when_nowhere_found() {
let resolved = resolve_tmux_bin_from("", &["/definitely/not/here".to_string()]);
assert_eq!(resolved, "tmux");
}
#[test]
fn tmux_fallback_dirs_are_anchored_under_home() {
let dirs = tmux_fallback_dirs("/home/u");
assert!(dirs.contains(&"/opt/homebrew/bin".to_string()));
assert!(dirs.contains(&"/usr/local/bin".to_string()));
assert!(dirs.contains(&"/home/u/.local/bin".to_string()));
}
#[test]
fn resolve_tmux_bin_reads_live_path_and_home() {
let dir =
std::env::temp_dir().join(format!("moadim-resolve-tmux-live-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("tmux"), "#!/bin/sh\n").unwrap();
let dir_str = dir.to_string_lossy().into_owned();
with_path(&dir, || {
assert_eq!(resolve_tmux_bin(), format!("{dir_str}/tmux"));
});
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn agent_command_available_reads_live_path_present() {
let dir = std::env::temp_dir().join(format!("moadim-agentcmd-live-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let bin = dir.join("fake-agent-cmd");
std::fs::write(&bin, "#!/bin/sh\n").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt as _;
std::fs::set_permissions(&bin, std::fs::Permissions::from_mode(0o755)).unwrap();
}
with_path(&dir, || assert!(agent_command_available("fake-agent-cmd")));
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn agent_command_available_false_when_path_unset() {
let saved = std::env::var_os("PATH");
unsafe {
std::env::remove_var("PATH");
}
assert!(!agent_command_available("definitely-not-a-real-binary-xyz"));
unsafe {
if let Some(prev) = saved {
std::env::set_var("PATH", prev);
}
}
}
#[test]
fn resolve_tmux_bin_falls_back_to_root_home_when_home_unset() {
let saved = std::env::var_os("HOME");
unsafe {
std::env::remove_var("HOME");
}
let _ = resolve_tmux_bin();
unsafe {
match saved {
Some(prev) => std::env::set_var("HOME", prev),
None => std::env::remove_var("HOME"),
}
}
}
#[test]
fn setup_step_interpreter_returns_first_token() {
assert_eq!(
setup_step_interpreter("python3 -c 'import os' \"$WB\""),
Some("python3")
);
}
#[test]
fn setup_step_interpreter_none_for_blank_setup() {
assert_eq!(setup_step_interpreter(" "), None);
assert_eq!(setup_step_interpreter(""), None);
}
#[test]
fn setup_step_available_true_when_no_setup_step() {
assert!(setup_step_available(None));
}
#[test]
fn setup_step_available_true_when_interpreter_on_path() {
let dir =
std::env::temp_dir().join(format!("moadim-setupstep-present-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&dir).unwrap();
let bin = dir.join("fake-interpreter");
std::fs::write(&bin, "#!/bin/sh\n").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt as _;
std::fs::set_permissions(&bin, std::fs::Permissions::from_mode(0o755)).unwrap();
}
with_path(&dir, || {
assert!(setup_step_available(Some(
"fake-interpreter -c 'x' \"$WB\""
)));
});
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn setup_step_available_false_when_interpreter_missing() {
let empty_dir =
std::env::temp_dir().join(format!("moadim-setupstep-missing-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&empty_dir).unwrap();
with_path(&empty_dir, || {
assert!(!setup_step_available(Some(
"definitely-not-a-real-binary-xyz -c 'x'"
)));
});
let _ = std::fs::remove_dir_all(&empty_dir);
}
#[test]
fn bin_dir_returns_none_when_path_unset() {
let saved = std::env::var_os("PATH");
unsafe {
std::env::remove_var("PATH");
}
assert!(bin_dir("definitely-not-a-real-binary-xyz").is_none());
unsafe {
if let Some(prev) = saved {
std::env::set_var("PATH", prev);
}
}
}