use crate::cli_acceptance::helpers::cli_test_runner::{
CliTestRunner, OutputFormat, TestValidators,
};
use anyhow::Result;
use std::time::Duration;
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_refactor_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["refactor", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Refactor code"));
let result = runner.run_success(["refactor", "auto", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Automatic refactoring"));
let result = runner.run_success(["refactor", "auto", "--file", "src/main.rs"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_quality_gate_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["quality-gate", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Quality gate"));
let result = runner.run_success(["quality-gate", "--file", "src/main.rs"])?;
TestValidators::assert_performance(&result, Duration::from_secs(20))?;
let result = runner.run_success([
"quality-gate",
"--file",
"src/main.rs",
"--profile",
"standard",
])?;
TestValidators::assert_performance(&result, Duration::from_secs(20))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_tdg_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["tdg", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Technical Debt Grading"));
let result = runner.run_success(["tdg", "src/main.rs"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
let result = runner.run_success(["tdg", "src/main.rs", "--include-components"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
let result = runner.run_success(["tdg", "dashboard", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("dashboard"));
let result = runner.run_success(["tdg", "storage", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("storage"));
Ok(())
}
#[tokio::test]
async fn test_qdd_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["qdd", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Quality-Driven Development"));
let result = runner.run_success(["qdd", "create", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Create"));
let result = runner.run_success(["qdd", "validate", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Validate"));
let result = runner.run_success(["qdd", "refactor", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Refactor"));
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_report_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["report", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Generate reports"));
let result = runner.run_success(["report", "src/"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
let result = runner.run_success(["report", "src/", "--format", "json"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
TestValidators::assert_output_format(&result, OutputFormat::Json)?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_serve_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["serve", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Start server"));
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_context_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["context", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Context"));
let result = runner.run_success(["context", "src/main.rs"])?;
TestValidators::assert_performance(&result, Duration::from_secs(20))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_demo_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["demo", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Demo"));
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_enforce_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["enforce", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Enforce"));
let result = runner.run_success(["enforce", "complexity", "src/main.rs"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_roadmap_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["roadmap", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Roadmap"));
let result = runner.run_success(["roadmap", "generate"])?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
Ok(())
}
#[tokio::test]
async fn test_test_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["test", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Test"));
let result = runner.run_command(["test", "."])?;
TestValidators::assert_performance(&result, Duration::from_secs(60))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_memory_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["memory", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Memory"));
let result = runner.run_success(["memory", "status"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_cache_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["cache", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Cache"));
let result = runner.run_success(["cache", "status"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
let result = runner.run_success(["cache", "clear"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_telemetry_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["telemetry", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Telemetry"));
let result = runner.run_success(["telemetry", "status"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_config_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["config", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Configuration"));
let result = runner.run_success(["config", "show"])?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_agent_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["agent", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("Agent"));
let result = runner.run_success(["agent", "start", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("start"));
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_mcp_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["mcp", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("MCP"));
let result = runner.run_success(["mcp", "serve", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("serve"));
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_pdmt_todos_command() -> Result<()> {
let runner = CliTestRunner::new()?;
let result = runner.run_success(["pdmt-todos", "--help"])?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
assert!(result.stdout_text.contains("PDMT"));
let result = runner.run_success([
"pdmt-todos",
"Test requirement",
"--granularity",
"medium",
"--seed",
"42",
])?;
TestValidators::assert_performance(&result, Duration::from_secs(10))?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_command_flag_combinations() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let result = runner.run_success(["analyze", "complexity", "src/main.rs", "--verbose"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
let result = runner.run_success(["analyze", "complexity", "src/main.rs", "--debug"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
let result = runner.run_success(["analyze", "complexity", "src/main.rs", "--mode", "cli"])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
let result = runner.run_success([
"analyze",
"complexity",
"src/main.rs",
"--format",
"json",
"--verbose",
])?;
TestValidators::assert_performance(&result, Duration::from_secs(15))?;
TestValidators::assert_output_format(&result, OutputFormat::Json)?;
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_command_output_consistency() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let json_commands = [
vec!["analyze", "complexity", "src/main.rs", "--format", "json"],
vec!["report", "src/", "--format", "json"],
vec!["tdg", "src/main.rs", "--format", "json"],
];
for cmd in &json_commands {
let result = runner.run_success(cmd)?;
TestValidators::assert_performance(&result, Duration::from_secs(30))?;
if result.stdout_text.trim().starts_with('{') || result.stdout_text.trim().starts_with('[')
{
TestValidators::assert_output_format(&result, OutputFormat::Json)?;
}
}
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_cross_command_error_handling() -> Result<()> {
let runner = CliTestRunner::new()?;
let commands_requiring_files = [
vec!["analyze", "complexity"],
vec!["quality-gate", "--file"],
vec!["refactor", "auto", "--file"],
vec!["tdg"],
];
for cmd in &commands_requiring_files {
let mut test_cmd = cmd.clone();
test_cmd.push("nonexistent_file.rs");
let result = runner.run_failure(&test_cmd)?;
TestValidators::assert_performance(&result, Duration::from_secs(5))?;
assert!(
result.stderr_text.contains("file")
|| result.stderr_text.contains("found")
|| result.stderr_text.contains("exist"),
"Command {:?} should provide meaningful error for nonexistent file",
cmd
);
}
Ok(())
}
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_cross_command_performance() -> Result<()> {
let runner = CliTestRunner::new()?;
let project_path = runner.create_sample_project()?;
std::env::set_current_dir(&project_path)?;
let quick_commands = [
vec!["--version"],
vec!["--help"],
vec!["analyze", "complexity", "--help"],
vec!["tdg", "--help"],
];
for cmd in &quick_commands {
let result = runner.run_success(cmd)?;
TestValidators::assert_performance(&result, Duration::from_secs(2))?;
}
let analysis_commands = [
vec!["analyze", "complexity", "src/main.rs"],
vec!["tdg", "src/main.rs"],
vec!["quality-gate", "--file", "src/main.rs"],
];
for cmd in &analysis_commands {
let result = runner.run_success(cmd)?;
TestValidators::assert_performance(&result, Duration::from_secs(20))?;
}
Ok(())
}
#[cfg(test)]
mod integration_tests {
use super::*;
#[tokio::test]
#[ignore = "CLI acceptance test - requires binary"]
async fn test_full_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(["analyze", "complexity", "src/main.rs"])?;
assert!(result.exit_code == 0);
let result = runner.run_success(["tdg", "src/main.rs"])?;
assert!(result.exit_code == 0);
let result = runner.run_success(["quality-gate", "--file", "src/main.rs"])?;
assert!(result.exit_code == 0);
let result = runner.run_success(["report", "src/"])?;
assert!(result.exit_code == 0);
Ok(())
}
}