use assert_cmd::Command;
use predicates::prelude::*;
#[test]
fn test_cli_binary_exists_and_runs() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
cmd.arg("--version")
.assert()
.success()
.stdout(predicate::str::contains("ggen"));
}
#[test]
fn test_help_displays_auto_discovered_commands() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("--help").assert().success();
output
.stdout(predicate::str::contains("ai"))
.stdout(predicate::str::contains("audit"))
.stdout(predicate::str::contains("ci"))
.stdout(predicate::str::contains("doctor"))
.stdout(predicate::str::contains("graph"))
.stdout(predicate::str::contains("hook"))
.stdout(predicate::str::contains("lifecycle"))
.stdout(predicate::str::contains("market"))
.stdout(predicate::str::contains("project"))
.stdout(predicate::str::contains("shell"))
.stdout(predicate::str::contains("template"));
}
#[test]
fn test_doctor_command_routes_correctly() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("doctor").arg("--help").assert().success();
output.stdout(predicate::str::contains("Check system prerequisites"));
}
#[test]
fn test_template_command_routes_correctly() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("template").arg("--help").assert().success();
output.stdout(predicate::str::contains("Template management"));
}
#[test]
fn test_market_command_routes_correctly() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("market").arg("--help").assert().success();
output.stdout(predicate::str::contains("Marketplace operations"));
}
#[test]
fn test_invalid_command_shows_error() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("nonexistent").assert().failure();
output.stderr(predicate::str::contains("error"));
}
#[test]
fn test_global_flags_work_before_command() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
cmd.arg("--debug")
.arg("true")
.arg("doctor")
.arg("--help")
.assert()
.success();
}
#[test]
fn test_otel_flags_are_recognized() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("--help").assert().success();
output
.stdout(predicate::str::contains("--enable-otel"))
.stdout(predicate::str::contains("--otel-endpoint"));
}
#[test]
fn test_config_flag_is_recognized() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("--help").assert().success();
output.stdout(predicate::str::contains("--config"));
}
#[test]
fn test_manifest_path_flag_is_recognized() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("--help").assert().success();
output.stdout(predicate::str::contains("--manifest-path"));
}
#[test]
fn test_commands_execute_with_real_binary() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
cmd.arg("doctor").assert().code(predicate::in_iter([0, 1]));
}
#[test]
fn test_help_progressive_command_exists() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("help-me").arg("--help").assert().success();
output.stdout(predicate::str::contains("personalized help"));
}
#[test]
fn test_auto_discovery_finds_all_command_modules() {
let mut cmd = Command::cargo_bin("ggen").unwrap();
let output = cmd.arg("--help").assert().success();
let stdout = String::from_utf8(output.get_output().stdout.clone()).unwrap();
let command_count = [
"ai",
"audit",
"ci",
"doctor",
"graph",
"help-me",
"hook",
"lifecycle",
"market",
"project",
"shell",
"template",
]
.iter()
.filter(|&cmd_name| stdout.contains(cmd_name))
.count();
assert!(
command_count >= 10,
"Expected at least 10 commands, found {}",
command_count
);
}