rmcl 0.4.0

A fully featured Minecraft TUI launcher
use super::*;

fn version(name: &str, number: &str) -> modrinth::VersionInfo {
    modrinth::VersionInfo {
        id: number.to_owned(),
        project_id: "project".to_owned(),
        name: name.to_owned(),
        version_number: number.to_owned(),
        game_versions: vec!["1.21.1".to_owned()],
        loaders: vec!["fabric".to_owned()],
        version_type: modrinth::VersionType::Release,
        dependencies: Vec::new(),
        date_published: String::new(),
        files: Vec::new(),
    }
}

#[test]
fn version_override_matches_name_or_number_and_rejects_unknown_values() {
    let versions = vec![version("Stable", "1.0.0"), version("Beta", "2.0.0-beta")];

    assert_eq!(select_version(&versions, None).unwrap().name, "Stable");
    assert_eq!(
        select_version(&versions, Some("Beta"))
            .unwrap()
            .version_number,
        "2.0.0-beta"
    );
    assert_eq!(
        select_version(&versions, Some("1.0.0")).unwrap().name,
        "Stable"
    );
    assert_eq!(
        select_version(&versions, Some("missing")).unwrap_err(),
        "Version 'missing' not found"
    );
}

#[test]
fn import_command_parses_name_and_version_overrides() {
    let matches = crate::cli::build_command()
        .try_get_matches_from([
            "rmcl",
            "import",
            "example-pack",
            "--name",
            "Example",
            "--version",
            "1.2.3",
        ])
        .unwrap();
    let import = matches.subcommand_matches("import").unwrap();

    assert_eq!(
        import.get_one::<String>("source").map(String::as_str),
        Some("example-pack")
    );
    assert_eq!(
        import.get_one::<String>("name").map(String::as_str),
        Some("Example")
    );
    assert_eq!(
        import.get_one::<String>("version").map(String::as_str),
        Some("1.2.3")
    );
}

#[tokio::test]
async fn missing_local_pack_returns_a_file_not_found_error() {
    let temp = tempfile::tempdir().unwrap();
    let missing = temp.path().join("missing.mrpack");
    let source = missing.to_string_lossy().into_owned();
    let matches = crate::cli::build_command()
        .try_get_matches_from(["rmcl", "import", &source])
        .unwrap();
    let import = matches.subcommand_matches("import").unwrap();

    let error = handle_import(import).await.unwrap_err().to_string();

    assert_eq!(error, format!("File not found: {}", missing.display()));
}