cockup 0.2.3

Yet another backup tool for various configurations
use super::*;

#[test]
fn brew_discovery_uses_json_and_reports_partial_failure_in_sorted_output() {
    let d = TempDir::new().unwrap();
    let p = d.path();
    executable(
        p,
        "brew",
        r#"#!/bin/sh
[ "$HOMEBREW_NO_AUTO_UPDATE" = 1 ] || exit 4
case "$1" in
  --version) echo Homebrew ;;
  list) printf 'zeta\nalpha\nmissing\n' ;;
  info)
    case "$4" in
      missing) exit 2 ;;
      alpha) printf '%s\n' '{"casks":[{"artifacts":[{"zap":[{"trash":"~/alpha","rmdir":["~/empty"]}]}]}]}' ;;
      zeta) printf '%s\n' '{"casks":[{"artifacts":[{"zap":[{"trash":["~/zeta"]}]}]}]}' ;;
    esac ;;
esac
"#,
    );
    let run = |args: &[&str]| {
        Command::new(env!("CARGO_BIN_EXE_cockup"))
            .current_dir(p)
            .args(args)
            .env("PATH", p)
            .env("NO_COLOR", "1")
            .output()
            .unwrap()
    };
    let out = run(&["detect"]);
    assert_eq!(out.status.code(), Some(1), "{}", text(&out));
    let output = String::from_utf8_lossy(&out.stdout);
    assert!(output.find("alpha:").unwrap() < output.find("zeta:").unwrap());
    assert!(output.contains("~/alpha") && output.contains("~/empty"));
    assert!(String::from_utf8_lossy(&out.stderr).contains("missing"));
    let colored = Command::new(env!("CARGO_BIN_EXE_cockup"))
        .current_dir(p)
        .args(["detect", "alpha"])
        .env("PATH", p)
        .env_remove("NO_COLOR")
        .env("FORCE_COLOR", "1")
        .output()
        .unwrap();
    assert!(colored.status.success(), "{}", text(&colored));
    assert!(
        String::from_utf8_lossy(&colored.stdout)
            .contains("\x1b[32;1malpha:\x1b[0m\n  ~/empty\n  ~/alpha\n"),
        "{}",
        text(&colored)
    );
    assert!(run(&["detect", "zeta"]).status.success());
    fs::remove_file(p.join("brew")).unwrap();
    let out = run(&["detect"]);
    assert_eq!(out.status.code(), Some(1));
    assert!(text(&out).contains("Homebrew"));
}