distronomicon 0.2.0

GitHub release updater for Linux binaries
Documentation
use std::{fs, os::unix};

use assert_cmd::cargo::cargo_bin_cmd;
use camino::Utf8PathBuf;
use camino_tempfile::tempdir;
use insta::assert_snapshot;

fn create_installed_version(install_root: &Utf8PathBuf, app: &str, tag: &str) {
    let releases_dir = install_root.join(app).join("releases").join(tag);
    let bin_dir = install_root.join(app).join("bin");

    fs::create_dir_all(&releases_dir).unwrap();
    fs::create_dir_all(&bin_dir).unwrap();

    let binary_path = releases_dir.join(app);
    fs::write(&binary_path, "fake binary").unwrap();

    let symlink_path = bin_dir.join(app);
    unix::fs::symlink(format!("../releases/{tag}/{app}"), symlink_path).unwrap();
}

#[test]
fn version_with_no_installation() {
    let temp_dir = tempdir().unwrap();
    let install_root = temp_dir.path().join("opt");

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("--app")
        .arg("myapp")
        .arg("--install-root")
        .arg(install_root.as_str())
        .arg("version");

    let output = cmd.output().unwrap();
    assert_eq!(output.status.code(), Some(0));
    let stdout = String::from_utf8(output.stdout).unwrap();
    assert_eq!(stdout, "");
}

#[test]
fn version_with_installed_tag() {
    let temp_dir = tempdir().unwrap();
    let install_root = temp_dir.path().join("opt");

    create_installed_version(&install_root, "myapp", "v1.2.3");

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("--app")
        .arg("myapp")
        .arg("--install-root")
        .arg(install_root.as_str())
        .arg("version");

    let output = cmd.output().unwrap();
    assert_eq!(output.status.code(), Some(0));
    let stdout = String::from_utf8(output.stdout).unwrap();
    assert_eq!(stdout, "v1.2.3\n");
}

#[test]
fn version_verbose_shows_diagnostics() {
    let temp_dir = tempdir().unwrap();
    let install_root = temp_dir.path().join("opt");

    create_installed_version(&install_root, "myapp", "v1.2.3");

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("--app")
        .arg("myapp")
        .arg("--install-root")
        .arg(install_root.as_str())
        .arg("-v")
        .arg("version");

    let output = cmd.output().unwrap();
    assert_eq!(output.status.code(), Some(0));
    let stdout = String::from_utf8(output.stdout).unwrap();

    let normalized = stdout.replace(install_root.as_str(), "/tmp/test");

    assert_snapshot!(normalized);
}

#[test]
fn version_works_without_github_flags() {
    let temp_dir = tempdir().unwrap();
    let install_root = temp_dir.path().join("opt");

    create_installed_version(&install_root, "myapp", "v1.2.3");

    let mut cmd = cargo_bin_cmd!();
    cmd.arg("--app")
        .arg("myapp")
        .arg("--install-root")
        .arg(install_root.as_str())
        .arg("version");

    let output = cmd.output().unwrap();
    assert_eq!(output.status.code(), Some(0));
    let stdout = String::from_utf8(output.stdout).unwrap();
    assert_eq!(stdout, "v1.2.3\n");
}