sdkman-cli-native 0.5.2

Native CLI subcommand components for SDKMAN! written in Rust. Use the binaries generated by this project in the sdk wrapper shell function from the sdkman-cli project.
Documentation
#[cfg(test)]
use std::env;
use std::{path::Path, process::Command};

use assert_cmd::prelude::*;
use predicates::prelude::*;
use serial_test::serial;
use support::VirtualEnv;

mod support;

#[test]
#[serial]
fn should_successfully_render_version() -> Result<(), Box<dyn std::error::Error>> {
    let prefix = "SDKMAN!";
    let cli_version = "5.0.0";
    let native_version = "0.1.0";

    let header = format!("\n{}", prefix);
    let env = VirtualEnv {
        cli_version: cli_version.to_string(),
        native_version: native_version.to_string(),
        ..Default::default()
    };

    let sdkman_dir = support::virtual_env(env);

    env::set_var("SDKMAN_DIR", sdkman_dir.path().as_os_str());

    let contains_header = predicate::str::starts_with(header);
    let contains_version = predicate::str::contains(format!("script: {}", cli_version));
    let contains_native_version = predicate::str::contains(format!("native: {}", native_version));

    Command::cargo_bin("version")?
        .assert()
        .success()
        .stdout(contains_header.and(contains_version.and(contains_native_version)))
        .code(0);

    Ok(())
}

#[test]
#[serial]
fn should_panic_if_version_file_not_present() -> Result<(), Box<dyn std::error::Error>> {
    let native_version = "0.1.0".to_string();

    let sdkman_dir = support::prepare_sdkman_dir();
    let var_path = Path::new("var");

    support::write_file(
        sdkman_dir.path(),
        var_path,
        "version_native",
        native_version,
    );

    env::set_var("SDKMAN_DIR", sdkman_dir.path().as_os_str());

    Command::cargo_bin("version")?.assert().failure().code(101);
    Ok(())
}

#[test]
#[serial]
fn should_panic_if_native_version_file_not_present() -> Result<(), Box<dyn std::error::Error>> {
    let version = "5.0.0".to_string();

    let sdkman_dir = support::prepare_sdkman_dir();
    let var_path = Path::new("var");

    support::write_file(sdkman_dir.path(), var_path, "version", version);

    env::set_var("SDKMAN_DIR", sdkman_dir.path().as_os_str());

    Command::cargo_bin("version")?.assert().failure().code(101);
    Ok(())
}

#[test]
#[serial]
fn should_panic_if_version_file_empty() -> Result<(), Box<dyn std::error::Error>> {
    let sdkman_dir = support::prepare_sdkman_dir();
    let var_path = Path::new("var");

    support::write_file(sdkman_dir.path(), var_path, "version", "".to_string());

    support::write_file(
        sdkman_dir.path(),
        var_path,
        "version_native",
        "0.1.0".to_string(),
    );

    env::set_var("SDKMAN_DIR", sdkman_dir.path().as_os_str());

    Command::cargo_bin("version")?.assert().failure().code(78);
    Ok(())
}

#[test]
#[serial]
fn should_panic_if_native_version_file_empty() -> Result<(), Box<dyn std::error::Error>> {
    let sdkman_dir = support::prepare_sdkman_dir();
    let var_path = Path::new("var");

    support::write_file(sdkman_dir.path(), var_path, "version", "5.0.0".to_string());

    support::write_file(
        sdkman_dir.path(),
        var_path,
        "version_native",
        "".to_string(),
    );

    env::set_var("SDKMAN_DIR", sdkman_dir.path().as_os_str());

    Command::cargo_bin("version")?.assert().failure().code(78);
    Ok(())
}