115 lines · 3.6 KB · Rust
RawDownload
use git_path::{create_symlink, realpath, realpath::Error, CanonicalizedTempDir};use std::path::Path;use tempfile::tempdir; #[test]fn assorted() {    let cwd = tempdir().unwrap();    let cwd = cwd.path();    let symlinks_disabled = 0;     assert!(        matches!(realpath("", cwd, symlinks_disabled), Err(Error::EmptyPath)),        "Empty path is not allowed"    );     assert_eq!(        realpath("b/.git", cwd, symlinks_disabled).unwrap(),        cwd.join("b").join(".git"),        "relative paths are prefixed with current dir"    );     assert_eq!(        realpath("b//.git", cwd, symlinks_disabled).unwrap(),        cwd.join("b").join(".git"),        "empty path components are ignored"    );     assert_eq!(        realpath("./tmp/.git", cwd, symlinks_disabled).unwrap(),        cwd.join("tmp").join(".git"),        "path starting with dot is relative and is prefixed with current dir"    );     assert_eq!(        realpath("./tmp/a/./.git", cwd, symlinks_disabled).unwrap(),        cwd.join("tmp").join("a").join(".git"),        "all ./ path components are ignored unless they the one at the beginning of the path"    );     assert_eq!(        realpath("./b/../tmp/.git", cwd, symlinks_disabled).unwrap(),        cwd.join("tmp").join(".git"),        "dot dot goes to parent path component"    );     {        #[cfg(not(target_os = "windows"))]        let absolute_path = Path::new("/c/d/.git");        #[cfg(target_os = "windows")]        let absolute_path = Path::new("C:\\c\\d\\.git");        assert_eq!(            realpath(absolute_path, cwd, symlinks_disabled).unwrap(),            absolute_path,            "absolute path without symlinks has nothing to resolve and remains unchanged"        );    }} #[test]fn link_cycle_is_detected() {    let tmp_dir = CanonicalizedTempDir::new();    let link_name = "link";    let link_destination = tmp_dir.join(link_name);    let link_path = tmp_dir.join(link_name);    create_symlink(&link_path, &link_destination);    let max_symlinks = 8;     assert!(        matches!(            realpath(link_path.join(".git"), "", max_symlinks),            Err(Error::MaxSymlinksExceeded { max_symlinks: 8 })        ),        "link cycle is detected"    );} #[test]fn symlink_with_absolute_path_gets_expanded() {    let tmp_dir = CanonicalizedTempDir::new();    let link_from = tmp_dir.join("a").join("b").join("tmp_p_q_link");    let link_to = tmp_dir.join("p").join("q");    create_symlink(&link_from, &link_to);    let max_symlinks = 8;    assert_eq!(        realpath(link_from.join(".git"), tmp_dir, max_symlinks).unwrap(),        link_to.join(".git"),        "symlink with absolute path gets expanded"    );} #[test]fn symlink_to_relative_path_gets_expanded_into_absolute_path() {    let cwd = CanonicalizedTempDir::new();    let link_name = "pq_link";    create_symlink(&cwd.join("r").join(link_name), &Path::new("p").join("q"));    assert_eq!(        realpath(Path::new(link_name).join(".git"), cwd.join("r"), 8).unwrap(),        cwd.join("r").join("p").join("q").join(".git"),        "symlink to relative path gets expanded into absolute path"    );} #[test]fn symlink_processing_is_disabled_if_the_value_is_zero() {    let cwd = CanonicalizedTempDir::new();    let link_name = "x_link";    create_symlink(&cwd.join(link_name), Path::new("link destination does not exist"));    assert!(        matches!(            realpath(&Path::new(link_name).join(".git"), &cwd, 0),            Err(Error::MaxSymlinksExceeded { max_symlinks: 0 })        ),        "symlink processing is disabled if the value is zero"    );}