proto_cli 0.56.0

A multi-language version manager, a unified toolchain.
use proto_core::test_utils::*;
use starbase_sandbox::assert_debug_snapshot;
use starbase_sandbox::predicates::prelude::*;
use std::fs;

mod outdated {
    use super::*;

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

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("outdated");
        });

        assert
            .inner
            .stderr(predicate::str::contains("No tools have been configured"));
    }

    #[test]
    fn reports_all_non_global_configs() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"moonbase = "*""#);
        sandbox.create_file("a/.prototools", r#"protostar = "*""#);
        sandbox.create_file("a/b/.prototools", r#"moonstone = "*""#);
        sandbox.create_file("a/b/c/.prototools", r#"protoform = "*""#);

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("outdated")
                .current_dir(sandbox.path().join("a/b/c"));
        });

        let output = assert.output();

        assert!(predicate::str::contains("protostar").eval(&output));
        assert!(predicate::str::contains("moonstone").eval(&output));
        assert!(predicate::str::contains("protoform").eval(&output));
        assert!(predicate::str::contains("moonbase").not().eval(&output));
    }

    #[test]
    fn only_includes_local_config() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"moonbase = "*""#);
        sandbox.create_file("a/.prototools", r#"protostar = "*""#);
        sandbox.create_file("a/b/.prototools", r#"moonstone = "*""#);
        sandbox.create_file("a/b/c/.prototools", r#"protoform = "*""#);

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("outdated")
                .arg("--config-mode")
                .arg("local")
                .current_dir(sandbox.path().join("a/b/c"));
        });

        let output = assert.output();

        assert!(predicate::str::contains("protostar").not().eval(&output));
        assert!(predicate::str::contains("moonstone").not().eval(&output));
        assert!(predicate::str::contains("protoform").eval(&output));
        assert!(predicate::str::contains("moonbase").not().eval(&output));
    }

    #[test]
    fn can_include_global_config() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"moonbase = "*""#);
        sandbox.create_file("a/.prototools", r#"protostar = "*""#);
        sandbox.create_file("a/b/.prototools", r#"moonstone = "*""#);
        sandbox.create_file("a/b/c/.prototools", r#"protoform = "*""#);

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("outdated")
                .arg("--config-mode")
                .arg("upwards-global")
                .current_dir(sandbox.path().join("a/b/c"));
        });

        let output = assert.output();

        assert!(predicate::str::contains("protostar").eval(&output));
        assert!(predicate::str::contains("moonstone").eval(&output));
        assert!(predicate::str::contains("protoform").eval(&output));
        assert!(predicate::str::contains("moonbase").eval(&output));
    }

    #[test]
    fn global_doesnt_overwrite_local() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"protostar = "1""#);
        sandbox.create_file("a/.prototools", r#"protostar = "2""#);

        let assert = sandbox.run_bin(|cmd| {
            cmd.arg("outdated")
                .arg("--config-mode")
                .arg("upwards-global")
                .current_dir(sandbox.path().join("a"));
        });

        let output = assert.output();

        assert!(predicate::str::contains("protostar").eval(&output));
        assert!(predicate::str::contains("2").eval(&output));
    }

    #[test]
    fn updates_each_file_respectively() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"moonbase = "1""#);
        sandbox.create_file("a/.prototools", r#"protostar = "2""#);
        sandbox.create_file("a/b/.prototools", r#"moonstone = "3""#);

        sandbox
            .run_bin(|cmd| {
                cmd.arg("outdated")
                    .arg("--update")
                    .arg("--config-mode")
                    .arg("upwards-global")
                    .arg("--yes")
                    .current_dir(sandbox.path().join("a/b"));
            })
            .success();

        assert_debug_snapshot!(vec![
            fs::read_to_string(sandbox.path().join(".proto/.prototools")).unwrap(),
            fs::read_to_string(sandbox.path().join("a/.prototools")).unwrap(),
            fs::read_to_string(sandbox.path().join("a/b/.prototools")).unwrap(),
        ]);
    }

    #[test]
    fn can_update_with_latest_version() {
        let sandbox = create_empty_proto_sandbox();
        sandbox.create_file(".proto/.prototools", r#"moonbase = "1.0.0""#);
        sandbox.create_file("a/.prototools", r#"protostar = "2.0.0""#);
        sandbox.create_file("a/b/.prototools", r#"moonstone = "3.0.0""#);

        sandbox
            .run_bin(|cmd| {
                cmd.arg("outdated")
                    .arg("--update")
                    .arg("--config-mode")
                    .arg("upwards-global")
                    .arg("--latest")
                    .arg("--yes")
                    .current_dir(sandbox.path().join("a/b"));
            })
            .success();

        assert!(
            !fs::read_to_string(sandbox.path().join(".proto/.prototools"))
                .unwrap()
                .contains("1.0.0")
        );
        assert!(
            !fs::read_to_string(sandbox.path().join("a/.prototools"))
                .unwrap()
                .contains("2.0.0")
        );
        assert!(
            !fs::read_to_string(sandbox.path().join("a/b/.prototools"))
                .unwrap()
                .contains("3.0.0")
        );
    }
}