proto_cli 0.56.0

A multi-language version manager, a unified toolchain.
use proto_core::test_utils::*;
use proto_core::{Id, PluginLocator, ProtoConfig, warpgate::UrlLocator};
use starbase_sandbox::predicates::prelude::*;

mod plugin_remove {
    use super::*;

    #[test]
    fn errors_if_no_local_config() {
        let sandbox = create_empty_proto_sandbox();

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("plugin").arg("remove").arg("id");
        });

        assert.failure().stderr(predicate::str::contains(
            "No .prototools has been found in current directory.",
        ));
    }

    #[test]
    fn updates_local_file() {
        let sandbox = create_empty_proto_sandbox();

        ProtoConfig::update(sandbox.path(), |config| {
            config
                .plugins
                .get_or_insert_default()
                .tools.get_or_insert_default()
                .insert(
                    Id::raw("id"),
                    PluginLocator::Url(Box::new(UrlLocator {
                      url: "https://github.com/moonrepo/plugins/releases/latest/download/example_plugin.wasm".into()
                    })),
                );
        })
        .unwrap();

        sandbox
            .run_bin(|cmd| {
                cmd.arg("plugin").arg("remove").arg("id");
            })
            .success();

        let config = load_config(sandbox.path());

        assert!(!config.plugins.tools.contains_key("id"));
    }

    #[test]
    fn updates_global_file() {
        let sandbox = create_empty_proto_sandbox();

        ProtoConfig::update(sandbox.path().join(".proto"), |config| {
            config
                .plugins
                .get_or_insert_default()
                .tools.get_or_insert_default()
                .insert(
                    Id::raw("id"),
                    PluginLocator::Url(Box::new(UrlLocator {
                      url: "https://github.com/moonrepo/plugins/releases/latest/download/example_plugin.wasm".into()
                    })),
                );
        })
        .unwrap();

        sandbox
            .run_bin(|cmd| {
                cmd.arg("plugin")
                    .arg("remove")
                    .arg("id")
                    .arg("--from")
                    .arg("global");
            })
            .success();

        let config = load_config(sandbox.path().join(".proto"));

        assert!(!config.plugins.tools.contains_key("id"));
    }

    #[test]
    fn updates_user_file() {
        let sandbox = create_empty_proto_sandbox();

        ProtoConfig::update(sandbox.path().join(".home"), |config| {
            config
                .plugins
                .get_or_insert_default()
                .tools.get_or_insert_default()
                .insert(
                    Id::raw("id"),
                    PluginLocator::Url(Box::new(UrlLocator {
                      url: "https://github.com/moonrepo/plugins/releases/latest/download/example_plugin.wasm".into()
                    })),
                );
        })
        .unwrap();

        sandbox.debug_files();

        sandbox
            .run_bin(|cmd| {
                cmd.arg("plugin")
                    .arg("remove")
                    .arg("id")
                    .arg("--from")
                    .arg("user");
            })
            .success();

        let config = load_config(sandbox.path().join(".home"));

        assert!(!config.plugins.tools.contains_key("id"));
    }
}