use std::borrow::Cow; use git_config::values::{path::interpolate, Path}; use crate::values::b; #[test] fn no_interpolation_for_paths_without_tilde_or_prefix() { let path = &b"/foo/bar"[..]; let actual = Path::from(Cow::Borrowed(path)); assert_eq!(&*actual, path); assert!( matches!(&actual.value, Cow::Borrowed(_)), "it does not unnecessarily copy values" ); } #[test] fn empty_path_is_error() { assert!(matches!( Path::from(Cow::Borrowed(b(""))).interpolate(None), Err(interpolate::Error::Missing { what: "path" }) )); } #[test] fn prefix_substitutes_git_install_dir() { for git_install_dir in &["/tmp/git", "C:\\git"] { for (val, expected) in &[ (&b"%(prefix)/foo/bar"[..], "foo/bar"), (b"%(prefix)/foo\\bar", "foo\\bar"), ] { let expected = &std::path::PathBuf::from(format!("{}{}{}", git_install_dir, std::path::MAIN_SEPARATOR, expected)); assert_eq!( &*Path::from(Cow::Borrowed(*val)) .interpolate(Some(std::path::Path::new(git_install_dir))) .unwrap(), expected, "prefix interpolation keeps separators as they are" ); } } } #[test] fn prefix_substitution_skipped_with_dot_slash() { let path = "./%(prefix)/foo/bar"; let git_install_dir = "/tmp/git"; assert_eq!( Path::from(Cow::Borrowed(b(path))) .interpolate(Some(std::path::Path::new(git_install_dir))) .unwrap(), std::path::Path::new(path) ); } #[test] fn tilde_substitutes_current_user() { let path = &b"~/foo/bar"[..]; let expected = format!( "{}{}foo/bar", dirs::home_dir().expect("empty home").display(), std::path::MAIN_SEPARATOR ); assert_eq!( Path::from(Cow::Borrowed(path)).interpolate(None).unwrap().as_ref(), std::path::Path::new(&expected), "note that path separators are not turned into slashes as we work with `std::path::Path`" ); } #[cfg(target_os = "windows")] #[test] fn tilde_with_given_user_is_unsupported_on_windows() { assert!(matches!( Path::from(Cow::Borrowed(&b"~baz/foo/bar"[..])).interpolate(None), Err(interpolate::Error::UserInterpolationUnsupported) )); } #[cfg(not(target_os = "windows"))] #[test] fn tilde_with_given_user() { let user = std::env::var("USER").unwrap(); let home = std::env::var("HOME").unwrap(); let specific_user_home = format!("~{}", user); for path_suffix in &["foo/bar", "foo\\bar", ""] { let path = format!("{}{}{}", specific_user_home, std::path::MAIN_SEPARATOR, path_suffix); let expected = format!("{}{}{}", home, std::path::MAIN_SEPARATOR, path_suffix); assert_eq!( Path::from(Cow::Borrowed(b(&path))).interpolate(None).unwrap(), std::path::Path::new(&expected), "it keeps path separators as is" ); } }