demons 0.3.0

Run a project's development commands side-by-side in one terminal
use std::{fs, process::Command};

use tempfile::tempdir;

fn demons() -> Command {
    Command::new(env!("CARGO_BIN_EXE_demons"))
}

#[test]
fn prints_help_and_version() {
    let help = demons().arg("--help").output().unwrap();
    assert!(help.status.success());
    assert!(String::from_utf8_lossy(&help.stdout).contains("development commands side-by-side"));

    let version = demons().arg("--version").output().unwrap();
    assert!(version.status.success());
    assert_eq!(
        String::from_utf8_lossy(&version.stdout).trim(),
        format!("demons {}", env!("CARGO_PKG_VERSION"))
    );
}

#[test]
fn validates_config_before_requiring_a_tty() {
    let temp = tempdir().unwrap();
    let path = temp.path().join("demons.toml");
    fs::write(
        &path,
        r#"
            [[task]]
            name = "web"
            command = "npm run dev"
            cwd = "missing"
        "#,
    )
    .unwrap();

    let output = demons()
        .args(["--config", path.to_str().unwrap()])
        .output()
        .unwrap();
    assert!(!output.status.success());
    assert!(String::from_utf8_lossy(&output.stderr).contains("is not a directory"));
}

#[test]
fn reports_missing_config_without_prompting_on_piped_input() {
    let temp = tempdir().unwrap();
    let output = demons().current_dir(temp.path()).output().unwrap();

    assert!(!output.status.success());
    assert!(String::from_utf8_lossy(&output.stderr).contains("no demons.toml found"));
}

#[test]
fn init_requires_an_interactive_terminal() {
    let temp = tempdir().unwrap();
    let output = demons()
        .arg("init")
        .current_dir(temp.path())
        .output()
        .unwrap();

    assert!(!output.status.success());
    assert!(
        String::from_utf8_lossy(&output.stderr)
            .contains("demons init requires an interactive terminal")
    );
}