#![allow(
clippy::missing_docs_in_private_items,
reason = "test helpers and fixtures do not need doc comments"
)]
use super::*;
fn unique_dir(tag: &str) -> std::path::PathBuf {
std::env::temp_dir().join(format!("moadim-agents-{tag}-{}", uuid::Uuid::new_v4()))
}
#[test]
fn available_agents_in_falls_back_when_dir_has_no_toml() {
let dir = unique_dir("empty-readable");
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("notes.txt"), "ignore me").unwrap();
assert_eq!(
available_agents_in(&dir),
vec![
"claude".to_string(),
"codex".to_string(),
"hermes".to_string(),
"pi".to_string()
]
);
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn codex_default_config_enables_sandbox_network_access() {
let cmd: AgentCommand =
toml::from_str(super::codex::CONFIG).expect("codex default config must be valid TOML");
assert_eq!(cmd.command, "codex");
assert!(
cmd.args
.iter()
.any(|arg| arg == "sandbox_workspace_write.network_access=true"),
"codex default args must enable sandbox network access, got {:?}",
cmd.args
);
}
#[test]
fn hermes_default_config_uses_oneshot_prompt_argument() {
let cmd: AgentCommand =
toml::from_str(super::hermes::CONFIG).expect("hermes default config must be valid TOML");
assert_eq!(cmd.command, "hermes");
assert_eq!(
cmd.args,
vec![
"-z".to_string(),
"{prompt}".to_string(),
"--ignore-rules".to_string()
]
);
}
#[test]
fn load_agent_command_parses_a_valid_config() {
let agent_name = "load-agent-valid-zzz";
std::fs::create_dir_all(crate::paths::agents_dir()).unwrap();
let cfg = crate::paths::agent_toml_path(agent_name);
std::fs::write(&cfg, "command = \"claude\"\nargs = [\"--help\"]\n").unwrap();
let loaded = load_agent_command(agent_name).unwrap();
assert_eq!(loaded.command, "claude");
assert_eq!(loaded.args, vec!["--help".to_string()]);
std::fs::remove_file(&cfg).unwrap();
}
#[test]
fn load_agent_command_reports_parse_error_for_malformed_config() {
let agent_name = "load-agent-malformed-zzz";
std::fs::create_dir_all(crate::paths::agents_dir()).unwrap();
let cfg = crate::paths::agent_toml_path(agent_name);
std::fs::write(&cfg, "command = [\n").unwrap();
match load_agent_command(agent_name) {
Err(AgentLoadError::Parse(err)) => assert!(!err.is_empty()),
other => panic!("expected Parse error, got {other:?}"),
}
std::fs::remove_file(&cfg).unwrap();
}
#[test]
fn load_agent_command_reports_missing_for_absent_config() {
assert!(matches!(
load_agent_command("load-agent-absent-zzz"),
Err(AgentLoadError::Missing)
));
}
#[test]
fn load_agent_command_reports_unreadable_for_non_not_found_io_error() {
let agent_name = "load-agent-unreadable-zzz";
std::fs::create_dir_all(crate::paths::agents_dir()).unwrap();
let cfg = crate::paths::agent_toml_path(agent_name);
std::fs::create_dir_all(&cfg).unwrap();
match load_agent_command(agent_name) {
Err(AgentLoadError::Unreadable(err)) => assert!(!err.is_empty()),
other => panic!("expected Unreadable error, got {other:?}"),
}
std::fs::remove_dir_all(&cfg).unwrap();
}
#[test]
fn agent_load_error_display_distinguishes_variants() {
assert_eq!(
AgentLoadError::Missing.to_string(),
"agent config not found"
);
assert_eq!(
AgentLoadError::Unreadable("permission denied".to_string()).to_string(),
"unreadable agent config: permission denied"
);
assert_eq!(
AgentLoadError::Parse("boom".to_string()).to_string(),
"malformed agent TOML: boom"
);
}
#[test]
fn ensure_default_agents_seeds_into_override_home() {
let home = unique_dir("ensure-default");
let previous = std::env::var_os("MOADIM_HOME_OVERRIDE");
unsafe {
std::env::set_var("MOADIM_HOME_OVERRIDE", &home);
}
ensure_default_agents();
assert!(crate::paths::agents_dir().join("claude.toml").exists());
unsafe {
match previous {
Some(value) => std::env::set_var("MOADIM_HOME_OVERRIDE", value),
None => std::env::remove_var("MOADIM_HOME_OVERRIDE"),
}
}
let _ = std::fs::remove_dir_all(&home);
}
include!("ensure_default_agents_in_returns_early_when_dir_is_uncreatable_tests.rs");