use std::path::PathBuf;
use std::process::Command;
fn crate_root() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
}
fn lev_command(tmp_home: &std::path::Path) -> Command {
let mut cmd = Command::new(env!("CARGO_BIN_EXE_lev"));
cmd.env("HOME", tmp_home)
.env("USERPROFILE", tmp_home)
.env("LEVIATH_HOME", tmp_home)
.env("LEVIATH_CONFIG_PATH", tmp_home.join("config.toml"))
.env("LEVIATH_SKIP_DOTENV", "1")
.env("LEVIATH_RUNS_DIR", tmp_home.join("runs"))
.env("LEVIATH_DASHBOARD_LOG_PATH", tmp_home.join("dashboard.log"))
.env_remove("ANTHROPIC_API_KEY")
.env_remove("OPENAI_API_KEY")
.env_remove("GOOGLE_API_KEY")
.env_remove("OPENROUTER_API_KEY")
.current_dir(tmp_home);
cmd
}
#[test]
fn version_flag_prints_version_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.arg("--version")
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("lev"),
"unexpected --version output: {stdout}"
);
}
#[test]
fn list_subcommand_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.arg("list")
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn verbose_flag_selects_debug_log_level_and_still_dispatches() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.arg("--verbose")
.arg("list")
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn models_list_subcommand_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.args(["models", "list"])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(!stdout.is_empty());
}
#[test]
fn validate_subcommand_dispatches_and_exits_zero_for_valid_manifest() {
let tmp = tempfile::tempdir().unwrap();
let manifest = crate_root()
.join("agents")
.join("coder")
.join("agent.leviath");
assert!(manifest.exists(), "fixture manifest missing: {manifest:?}");
let output = lev_command(tmp.path())
.args(["validate", manifest.to_str().unwrap()])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("valid"),
"unexpected validate output: {stdout}"
);
}
#[test]
fn create_subcommand_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.args(["create", "my-new-agent"])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(tmp.path().join("my-new-agent/agent.leviath").exists());
}
#[test]
fn setup_non_interactive_subcommand_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let output = lev_command(tmp.path())
.args([
"setup",
"--non-interactive",
"--anthropic-key",
"sk-ant-fake-test-key",
])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let saved = std::fs::read_to_string(tmp.path().join("config.toml")).unwrap();
assert!(saved.contains("sk-ant-fake-test-key"));
}
#[test]
fn add_subcommand_installs_from_local_directory_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let coder_agent = crate_root().join("agents").join("coder");
assert!(
coder_agent.exists(),
"fixture agent missing: {coder_agent:?}"
);
let output = lev_command(tmp.path())
.args(["add", coder_agent.to_str().unwrap()])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(
tmp.path()
.join(".leviath")
.join("agents")
.join("coder")
.join("agent.leviath")
.exists()
);
}
#[test]
fn remove_subcommand_removes_installed_agent_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let coder_agent = crate_root().join("agents").join("coder");
let add_output = lev_command(tmp.path())
.args(["add", coder_agent.to_str().unwrap()])
.output()
.expect("failed to spawn lev binary");
assert!(
add_output.status.success(),
"add stderr: {}",
String::from_utf8_lossy(&add_output.stderr)
);
let installed_dir = tmp.path().join(".leviath").join("agents").join("coder");
assert!(installed_dir.exists());
let remove_output = lev_command(tmp.path())
.args(["remove", "coder"])
.output()
.expect("failed to spawn lev binary");
assert!(
remove_output.status.success(),
"remove stderr: {}",
String::from_utf8_lossy(&remove_output.stderr)
);
assert!(!installed_dir.exists());
}
#[test]
fn test_subcommand_dry_run_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let coder_agent = crate_root().join("agents").join("coder");
let output = lev_command(tmp.path())
.args(["test", coder_agent.to_str().unwrap(), "--dry-run"])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn pack_subcommand_dispatches_and_exits_zero() {
let tmp = tempfile::tempdir().unwrap();
let coder_agent = crate_root().join("agents").join("coder");
let output_bundle = tmp.path().join("out.leviath-bundle");
let output = lev_command(tmp.path())
.args([
"pack",
coder_agent.to_str().unwrap(),
"--output",
output_bundle.to_str().unwrap(),
])
.output()
.expect("failed to spawn lev binary");
assert!(
output.status.success(),
"stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_bundle.exists());
}