tendrils-core 0.0.4

Core library for Tendrils
Documentation
use crate::{RawTendril, Tendril, TendrilMode, UniPath};
use rstest::rstest;
use serial_test::serial;
use std::path::{Path, PathBuf};

#[test]
fn invalid_tendril_returns_invalid_tendril() {
    let td_repo = UniPath::from(Path::new("/Repo"));
    let mut given = RawTendril::new("");
    given.remote = "SomeParentPath1".to_string();

    let actual = given.resolve(&td_repo);

    assert!(actual.is_err());
}

#[rstest]
#[case("<mut-testing>1", "value1")]
#[case("~\\<mut-testing>2", "MyHome\\value2")]
#[case("~/<mut-testing>3", "MyHome/value3")]
#[serial(SERIAL_MUT_ENV_VARS)]
fn vars_and_leading_tilde_in_remote_path_are_resolved(
    #[case] remote: String,
    #[case] expected_remote: PathBuf,
) {
    let td_repo = UniPath::from(Path::new("/Repo"));
    let mut given = RawTendril::new("SomeLocal");
    given.remote = remote;
    std::env::set_var("mut-testing", "value");
    std::env::set_var("HOME", "MyHome");

    let expected = Tendril::new_expose(
        &td_repo,
        "SomeLocal".into(),
        expected_remote.into(),
        TendrilMode::CopyOverwrite,
    )
    .unwrap();

    let actual = given.resolve(&td_repo).unwrap();

    assert_eq!(actual, expected);
}

#[test]
fn var_in_remote_path_doesnt_exist_returns_raw_path() {
    let td_repo = UniPath::from(Path::new("/Repo"));
    let mut given = RawTendril::new("SomeLocal");
    given.remote = "<I_do_not_exist>".to_string();

    let expected = Tendril::new_expose(
        &td_repo,
        "SomeLocal".into(),
        PathBuf::from("<I_do_not_exist>").into(),
        TendrilMode::CopyOverwrite,
    )
    .unwrap();

    let actual = given.resolve(&td_repo).unwrap();

    assert_eq!(actual, expected);
}

#[test]
#[serial(SERIAL_MUT_ENV_VARS)]
fn leading_tilde_in_remote_path_tilde_value_doesnt_exist_returns_raw_path() {
    let td_repo = UniPath::from(Path::new("/Repo"));
    let mut given = RawTendril::new("SomeLocal");
    given.remote = "~/SomeRemotePath".to_string();
    std::env::remove_var("HOME");
    std::env::remove_var("HOMEDRIVE");
    std::env::remove_var("HOMEPATH");

    let expected = Tendril::new_expose(
        &td_repo,
        "SomeLocal".into(),
        PathBuf::from("~/SomeRemotePath").into(),
        TendrilMode::CopyOverwrite,
    )
    .unwrap();

    let actual = given.resolve(&td_repo).unwrap();

    assert_eq!(actual, expected);
}

#[rstest]
#[case(TendrilMode::CopyMerge)]
#[case(TendrilMode::CopyOverwrite)]
#[case(TendrilMode::Link)]
fn resolves_tendril_mode_properly(
    #[case] expected_mode: TendrilMode,
) {
    let td_repo = UniPath::from(Path::new("/Repo"));
    let mut given = RawTendril::new("SomeLocal");
    given.remote = "SomeRemotePath".to_string();
    given.mode = expected_mode.clone();

    let expected = Tendril::new_expose(
        &td_repo,
        "SomeLocal".into(),
        PathBuf::from("SomeRemotePath").into(),
        expected_mode,
    )
    .unwrap();

    let actual = given.resolve(&td_repo).unwrap();

    assert_eq!(actual, expected);
}