runewarp 0.1.0

Runewarp is an ingress tunneling tool for exposing local services without moving TLS termination to the edge. Clients connect out over QUIC, so you can publish services without putting your backend directly on the Internet or leaking your public IP.
Documentation
use assert_cmd::Command;

#[test]
fn no_args_prints_the_top_level_help() {
    let assert = Command::cargo_bin("runewarp").unwrap().assert().success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();

    assert!(stdout.contains("Public ingress. Private by design."));
    assert!(stdout.contains("Usage:"));
    assert!(stdout.contains("server"));
    assert!(stdout.contains("client"));
}

#[test]
fn top_level_help_identifies_runewarp_in_the_product_line() -> Result<(), Box<dyn std::error::Error>>
{
    let assert = Command::cargo_bin("runewarp")?
        .arg("--help")
        .assert()
        .success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone())?;

    assert!(stdout.starts_with("Runewarp: Public ingress. Private by design."));
    Ok(())
}

#[test]
fn top_level_help_drops_the_config_defaults_footer() -> Result<(), Box<dyn std::error::Error>> {
    let assert = Command::cargo_bin("runewarp")?
        .arg("--help")
        .assert()
        .success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone())?;

    assert!(!stdout.contains("Config defaults:"));
    Ok(())
}

#[test]
fn help_subcommand_prints_the_top_level_help() -> Result<(), Box<dyn std::error::Error>> {
    let assert = Command::cargo_bin("runewarp")?
        .arg("help")
        .assert()
        .success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone())?;

    assert!(stdout.starts_with("Runewarp: Public ingress. Private by design."));
    assert!(stdout.contains("Usage: runewarp [COMMAND]"));
    Ok(())
}

#[test]
fn top_level_help_describes_the_main_entry_points() -> Result<(), Box<dyn std::error::Error>> {
    let assert = Command::cargo_bin("runewarp")?
        .arg("--help")
        .assert()
        .success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone())?;

    assert!(stdout.contains("server  Operate the Server runtime and setup commands"));
    assert!(stdout.contains("client  Operate the Client runtime and setup commands"));
    Ok(())
}

#[test]
fn unknown_command_is_rejected_with_cli_usage() {
    let assert = Command::cargo_bin("runewarp")
        .unwrap()
        .arg("warp")
        .assert()
        .failure();
    let stderr = String::from_utf8(assert.get_output().stderr.clone()).unwrap();

    assert!(stderr.contains("unrecognized subcommand 'warp'"));
    assert!(stderr.contains("Usage:"));
    assert!(stderr.contains("For more information, try '--help'."));
}

#[test]
fn keygen_is_rejected_as_an_unrecognized_command() {
    let assert = Command::cargo_bin("runewarp")
        .unwrap()
        .arg("keygen")
        .assert()
        .failure();
    let stderr = String::from_utf8(assert.get_output().stderr.clone()).unwrap();

    assert!(stderr.contains("unrecognized subcommand 'keygen'"));
    assert!(stderr.contains("Usage: runewarp [COMMAND]"));
}