zackstrap 1.6.2

A CLI tool to bootstrap project configuration files
Documentation
use assert_cmd::Command;
use predicates::prelude::*;

#[test]
fn test_cli_help() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--help");
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("zackstrap"));
}

#[test]
fn test_cli_version() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--version");
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("zackstrap"));
}

#[test]
fn test_cli_list_command() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("list");
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("Available configuration files"))
        .stdout(predicate::str::contains("Available templates"))
        .stdout(predicate::str::contains("Available commands"));
}

#[test]
fn test_cli_basic_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("basic");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("basic project configuration"));
}

#[test]
fn test_cli_basic_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("basic")
        .arg("--template")
        .arg("google");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: google"));
}

#[test]
fn test_cli_ruby_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("ruby");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Ruby project configuration"));
}

#[test]
fn test_cli_ruby_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("ruby")
        .arg("--template")
        .arg("rails");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: rails"));
}

#[test]
fn test_cli_python_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("python");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Python project configuration"));
}

#[test]
fn test_cli_python_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("python")
        .arg("--template")
        .arg("django");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: django"));
}

#[test]
fn test_cli_node_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("node");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Node.js project configuration"));
}

#[test]
fn test_cli_node_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("node")
        .arg("--template")
        .arg("react");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: react"));
}

#[test]
fn test_cli_go_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("go");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Go project configuration"));
}

#[test]
fn test_cli_go_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("go")
        .arg("--template")
        .arg("web");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: web"));
}

#[test]
fn test_cli_rust_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("rust");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Rust project configuration"));
}

#[test]
fn test_cli_rust_command_with_template() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("rust")
        .arg("--template")
        .arg("cli");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("template: cli"));
}

#[test]
fn test_cli_auto_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("auto");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"));
}

#[test]
fn test_cli_interactive_command() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("interactive");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"))
        .stdout(predicate::str::contains("Interactive configuration setup"));
}

#[test]
fn test_cli_force_flag() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--force")
        .arg("--dry-run")
        .arg("basic");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"));
}

#[test]
fn test_cli_dry_run_flag() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("basic");

    cmd.assert()
        .success()
        .stdout(predicate::str::contains("DRY RUN"));
}

#[test]
fn test_cli_target_directory() {
    let temp_dir = assert_fs::TempDir::new().unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg(temp_dir.path())
        .arg("--dry-run")
        .arg("basic");

    cmd.assert().success();
}

#[test]
fn test_cli_invalid_directory() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target")
        .arg("/nonexistent/directory")
        .arg("basic");

    cmd.assert().failure();
}

#[test]
fn test_cli_file_as_target() {
    let temp_file = assert_fs::NamedTempFile::new("test.txt").unwrap();
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("--target").arg(temp_file.path()).arg("basic");

    cmd.assert().failure();
}

#[test]
fn test_cli_no_subcommand() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.assert().failure();
}

#[test]
fn test_cli_invalid_subcommand() {
    let mut cmd = Command::from_std(std::process::Command::new(assert_cmd::cargo::cargo_bin!(
        "zackstrap"
    )));
    cmd.arg("invalid");

    cmd.assert().failure();
}