[go: up one dir, main page]

cargo-binlist 1.3.0

List all installed binaries with cargo and their versions
#![expect(clippy::unwrap_used, reason = "unwrap is used for testing purposes")]
use comfy_table::{Attribute, Cell, Color};
use log::LevelFilter;
use semver::Version;

use crate::{
    cli::{Cli, ListOpts},
    data::{PackageInfo, VersionCheck},
    logic,
};

#[test]
fn test_get_package_infos() {
    let output = r"
cargo-binstall v1.10.18:
    cargo-binstall
cargo-bloat v0.12.1:
    cargo-bloat
cargo-deny v0.16.1:
    cargo-deny
cargo-edit v0.13.0:
    cargo-add
    cargo-rm
    cargo-set-version
    cargo-upgrade
";

    let mut parsed = logic::get_package_infos(output);
    parsed.sort_by(|a, b| a.name.cmp(&b.name));
    assert_eq!(parsed.len(), 4);
    assert_eq!(parsed[0].name, "cargo-binstall");
    assert_eq!(parsed[0].version.to_string(), "1.10.18");
    assert_eq!(parsed[1].name, "cargo-bloat");
    assert_eq!(parsed[1].version.to_string(), "0.12.1");
    assert_eq!(parsed[2].name, "cargo-deny");
    assert_eq!(parsed[2].version.to_string(), "0.16.1");
    assert_eq!(parsed[3].name, "cargo-edit");
    assert_eq!(parsed[3].version.to_string(), "0.13.0");
}

#[test]
fn test_parse_package_line() {
    let line = "tester v1.10.18:";
    let parsed = logic::parse_package_line(line).unwrap();
    assert_eq!(parsed.name, "tester");
    assert_eq!(parsed.version.to_string(), "1.10.18");
}

#[test]
fn test_packageinfo() {
    let mut pkg = PackageInfo::new("serde".to_owned(), Version::new(0, 0, 1));
    let latest = pkg.latest_version().unwrap();
    assert!(latest > pkg.version);
    pkg.set_info(&latest);
    assert_eq!(pkg.info, VersionCheck::NewerAvailable(latest));
}

#[test]
fn test_get_installed_bins() {
    logic::get_installed_bins().unwrap();
}

#[test]
fn test_cli_list() {
    Cli::List(ListOpts {
        filter: LevelFilter::Trace,
        outdated: false,
        uncondensed: false,
    })
    .run()
    .unwrap();
}

#[test]
fn test_cli_update() {
    logic::update(&[], true).unwrap();
}

#[test]
fn test_version_occurrences() {
    let pkgs = vec![
        PackageInfo::new("cargo-binstall".to_owned(), Version::new(1, 10, 18)),
        PackageInfo::new("cargo-bloat".to_owned(), Version::new(0, 12, 1)),
        PackageInfo::new("cargo-deny".to_owned(), Version::new(0, 16, 1)),
        PackageInfo::new("cargo-edit".to_owned(), Version::new(0, 13, 0)),
    ];

    logic::version_occurrences(&pkgs);
}

#[test]
fn test_colored_cell() {
    let local_newer_cell = Cell::new("No Update").add_attribute(Attribute::Dim);
    let cell = VersionCheck::LocalNewer.colored_cell();
    assert_eq!(cell.content(), "No Update");
    assert_eq!(cell, local_newer_cell);

    let newer_available_cell = Cell::new("Update Available (2.0.0)")
        .fg(Color::Green)
        .add_attribute(Attribute::Bold);
    let cell = VersionCheck::NewerAvailable(Version::new(2, 0, 0)).colored_cell();
    assert_eq!(cell.content(), "Update Available (2.0.0)");
    assert_eq!(cell, newer_available_cell);

    let unavailable_cell = Cell::new("Not Available").fg(Color::Red);
    let cell = VersionCheck::UnAvailable.colored_cell();
    assert_eq!(cell.content(), "Not Available");
    assert_eq!(cell, unavailable_cell);

    let up_to_date_cell = Cell::new("Up to date").fg(Color::Blue);
    let cell = VersionCheck::UpToDate.colored_cell();
    assert_eq!(cell.content(), "Up to date");
    assert_eq!(cell, up_to_date_cell);
}