use std::process::Command;
use tempfile::TempDir;
fn get_pmat_binary() -> String {
let mut path = std::env::current_exe().unwrap();
path.pop(); if path.ends_with("deps") {
path.pop();
}
path.push("pmat");
path.to_string_lossy().to_string()
}
#[test]
#[ignore] fn test_scaffold_agent_dry_run() {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"agent",
"--name",
"test_agent",
"--template",
"basic",
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Dry run"));
assert!(stderr.contains("test_agent"));
}
#[test]
#[ignore] fn test_scaffold_agent_list_templates() {
let output = Command::new(get_pmat_binary())
.args(["scaffold", "list-templates"])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Available Agent Templates") || stderr.contains("Templates"));
}
#[test]
#[ignore] fn test_scaffold_agent_invalid_template() {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"agent",
"--name",
"test",
"--template",
"nonexistent",
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(!output.status.success());
}
#[test]
#[ignore] fn test_scaffold_agent_with_features() {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"agent",
"--name",
"featured_agent",
"--template",
"basic",
"--features",
"logging,metrics",
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("featured_agent"));
}
#[test]
#[ignore] fn test_scaffold_agent_quality_levels() {
for quality in &["standard", "strict", "extreme"] {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"agent",
"--name",
"quality_test",
"--template",
"basic",
"--quality",
quality,
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(output.status.success(), "Failed for quality: {}", quality);
}
}
#[test]
#[ignore] fn test_scaffold_wasm_dry_run() {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"wasm",
"--name",
"test_wasm",
"--framework",
"wasm-labs",
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Dry run"));
assert!(stderr.contains("test_wasm"));
}
#[test]
#[ignore] fn test_scaffold_wasm_frameworks() {
for framework in &["wasm-labs", "pure-wasm"] {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"wasm",
"--name",
"fw_test",
"--framework",
framework,
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(
output.status.success(),
"Failed for framework: {}",
framework
);
}
}
#[test]
#[ignore] fn test_scaffold_wasm_invalid_framework() {
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"wasm",
"--name",
"test",
"--framework",
"invalid-framework",
"--dry-run",
])
.output()
.expect("Failed to execute command");
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Unknown WASM framework"));
assert!(stderr.contains("Suggestions"));
}
#[test]
#[ignore] fn test_maintain_health_no_project() {
let temp_dir = TempDir::new().unwrap();
let output = Command::new(get_pmat_binary())
.args(["maintain", "health", "--quick"])
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute command");
assert!(output.status.success());
}
#[test]
#[ignore] fn test_maintain_health_quick_flag() {
let output = Command::new(get_pmat_binary())
.args(["maintain", "health", "--quick"])
.current_dir(std::env::current_dir().unwrap())
.output()
.expect("Failed to execute command");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Health Report") || stderr.contains("Build"));
}
#[test]
#[ignore] fn test_maintain_health_individual_checks() {
let output = Command::new(get_pmat_binary())
.args(["maintain", "health", "--check-build"])
.current_dir(std::env::current_dir().unwrap())
.output()
.expect("Failed to execute command");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Health") || stderr.contains("Build"));
}
#[test]
#[ignore] fn test_maintain_roadmap_missing_file() {
let temp_dir = TempDir::new().unwrap();
let output = Command::new(get_pmat_binary())
.args(["maintain", "roadmap"])
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute command");
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("ROADMAP.md"));
assert!(stderr.contains("Suggestions") || stderr.contains("not found"));
}
#[test]
#[ignore] fn test_maintain_roadmap_with_file() {
let output = Command::new(get_pmat_binary())
.args(["maintain", "roadmap"])
.current_dir(std::env::current_dir().unwrap())
.output()
.expect("Failed to execute command");
assert!(output.status.success());
}
#[test]
#[ignore] fn test_hooks_status() {
let temp_dir = TempDir::new().unwrap();
Command::new("git")
.args(["init"])
.current_dir(temp_dir.path())
.output()
.expect("Failed to init git");
let output = Command::new(get_pmat_binary())
.args(["hooks", "status"])
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute command");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("Hook") || stdout.contains("installed") || stdout.contains("not installed")
);
}
#[test]
#[ignore] fn test_version_flag() {
let output = Command::new(get_pmat_binary())
.args(["--version"])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("pmat") || stdout.contains("version"));
}
#[test]
#[ignore] fn test_help_flag() {
let output = Command::new(get_pmat_binary())
.args(["--help"])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("Usage") || stdout.contains("USAGE"));
}
#[test]
#[ignore] fn test_scaffold_help() {
let output = Command::new(get_pmat_binary())
.args(["scaffold", "--help"])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("scaffold") || stdout.contains("agent"));
}
#[test]
#[ignore] fn test_maintain_help() {
let output = Command::new(get_pmat_binary())
.args(["maintain", "--help"])
.output()
.expect("Failed to execute command");
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("maintain") || stdout.contains("roadmap"));
}
#[test]
#[ignore] fn test_error_messages_are_helpful() {
let temp_dir = TempDir::new().unwrap();
let test_path = temp_dir.path().join("existing_dir");
std::fs::create_dir(&test_path).unwrap();
let output = Command::new(get_pmat_binary())
.args([
"scaffold",
"agent",
"--name",
"existing_dir",
"--template",
"basic",
])
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute command");
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Suggestions") || stderr.contains("--force"));
}
#[test]
#[ignore] fn test_invalid_command_suggestions() {
let output = Command::new(get_pmat_binary())
.args(["scafold"]) .output()
.expect("Failed to execute command");
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("scaffold") || stderr.contains("Did you mean") || stderr.contains("help")
);
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
#[ignore] fn test_scaffold_names_are_validated(name in "[a-z_][a-z0-9_]{0,20}") {
let output = std::process::Command::new(super::get_pmat_binary())
.args(["scaffold", "agent", "--name", &name, "--template", "basic", "--dry-run"])
.output()
.expect("Failed to execute");
prop_assert!(output.status.success());
}
}
}