use crate::cli_acceptance::helpers::cli_test_runner::{CliTestRunner, TestValidators};
use anyhow::Result;
use std::time::Duration;
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_version_flag() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["--version"])?;
TestValidators::assert_performance(&result, Duration::from_secs(1))?;
assert!(result.stdout_text.contains("pmat"));
assert!(result.stdout_text.contains("2.79.0"));
let result = runner.run_success(["-V"])?;
TestValidators::assert_performance(&result, Duration::from_secs(1))?;
assert!(result.stdout_text.contains("pmat"));
Ok(())
}
#[tokio::test]
async fn test_help_flag() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result
.stdout_text
.contains("Professional project quantitative"));
assert!(result.stdout_text.contains("Commands:"));
assert!(result.stdout_text.contains("generate"));
assert!(result.stdout_text.contains("analyze"));
let result = runner.run_success(["-h"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Usage:"));
Ok(())
}
#[tokio::test]
async fn test_generate_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["generate", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Generate a single template"));
let result = runner.run_command(["generate"])?;
if result.exit_code != 0 {
assert!(result.stderr_text.contains("Usage") || result.stderr_text.contains("required"));
}
Ok(())
}
#[tokio::test]
async fn test_scaffold_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["scaffold", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Scaffold complete project"));
Ok(())
}
#[tokio::test]
async fn test_list_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["list", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("List available templates"));
let result = runner.run_success(["list"])?;
TestValidators::assert_performance(&result, Duration::from_secs(10))?;
Ok(())
}
#[tokio::test]
async fn test_search_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["search", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Search templates"));
Ok(())
}
#[tokio::test]
async fn test_validate_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["validate", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Validate template parameters"));
Ok(())
}
#[tokio::test]
async fn test_diagnose_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["diagnose", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Run self-diagnostics"));
let result = runner.run_success(["diagnose"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
Ok(())
}
#[tokio::test]
async fn test_global_flags() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["diagnose", "--verbose"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
let result = runner.run_success(["diagnose", "--debug"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
let result = runner.run_success(["diagnose", "--mode", "cli"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_invalid_commands() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_failure(["nonexistent-command"])?;
TestValidators::assert_exit_code(&result, 1)?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stderr_text.contains("error") || result.stderr_text.contains("invalid"));
let result = runner.run_failure(["--invalid-flag"])?;
TestValidators::assert_exit_code(&result, 1)?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
Ok(())
}
#[tokio::test]
async fn test_help_system_consistency() -> Result<()> {
let runner = CliTestRunner::new()?;
let commands = [
"generate",
"scaffold",
"list",
"search",
"validate",
"context",
"analyze",
"qdd",
"demo",
"quality-gate",
"report",
"serve",
"diagnose",
"enforce",
"refactor",
"roadmap",
"test",
"memory",
"cache",
"telemetry",
"config",
"agent",
"tdg",
];
for command in &commands {
let result = runner.run_success([command, "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
assert!(
result.stdout_text.contains("Usage:")
|| result.stdout_text.contains("USAGE:")
|| result.stdout_text.to_lowercase().contains("usage"),
"Command '{}' help does not contain usage information",
command
);
}
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_error_message_quality() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_failure(["analyze", "complexity"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
assert!(
result.stderr_text.contains("required")
|| result.stderr_text.contains("missing")
|| result.stderr_text.contains("Usage"),
"Error message should be user-friendly: {}",
result.stderr_text
);
Ok(())
}
#[tokio::test]
async fn test_performance_quick_commands() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["--version"])?;
TestValidators::assert_performance(&result, Duration::from_secs(1))?;
let result = runner.run_success(["--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(1))?;
let result = runner.run_success(["analyze", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
Ok(())
}
#[cfg(test)]
mod integration_tests {
use super::*;
#[tokio::test]
async fn test_command_workflow() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["diagnose"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
assert!(result.exit_code == 0);
Ok(())
}
#[tokio::test]
async fn test_different_project_types() -> Result<()> {
let runner = CliTestRunner::new()?;
let empty_dir = runner.workspace_path().join("empty_project");
std::fs::create_dir_all(&empty_dir)?;
std::env::set_current_dir(&empty_dir)?;
let result = runner.run_command(["diagnose"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
Ok(())
}
}