topcoat-cli 0.11.0

A modular, batteries-included Rust web framework for server-rendered apps.
Documentation
use std::process::{Command, Stdio};

#[test]
fn help_and_version_accept_cargo_and_direct_invocations() {
    for (binary, prefix) in [
        (env!("CARGO_BIN_EXE_topcoat"), &[][..]),
        (env!("CARGO_BIN_EXE_cargo-topcoat"), &[][..]),
        (env!("CARGO_BIN_EXE_cargo-topcoat"), &["topcoat"][..]),
    ] {
        for args in [&["--help"][..], &["--version"][..], &["fmt", "--help"][..]] {
            let output = Command::new(binary)
                .args(prefix)
                .args(args)
                .output()
                .unwrap();
            assert!(
                output.status.success(),
                "{binary} {prefix:?} {args:?}: {}",
                String::from_utf8_lossy(&output.stderr),
            );
            assert_ne!(output.stdout.as_slice(), b"");
        }
    }
}

#[test]
fn cargo_invocation_runs_a_subcommand() {
    let output = Command::new(env!("CARGO_BIN_EXE_cargo-topcoat"))
        .args(["topcoat", "fmt", "--stdin"])
        .stdin(Stdio::null())
        .output()
        .unwrap();
    assert!(
        output.status.success(),
        "{}",
        String::from_utf8_lossy(&output.stderr),
    );
}

#[test]
fn cargo_invocation_preserves_invalid_arguments() {
    for args in [
        &["topcoat", "unknown"][..],
        &["topcoat", "topcoat", "--help"][..],
        &["topcoat", "fmt", "--unknown"][..],
    ] {
        let output = Command::new(env!("CARGO_BIN_EXE_cargo-topcoat"))
            .args(args)
            .output()
            .unwrap();
        assert!(!output.status.success(), "{args:?}");
    }
}