use assert_fs::prelude::*;
use color_eyre::{eyre::eyre, Result};
use predicates::prelude::*;
use sn_api::SafeUrl;
use sn_cmd_test_utilities::util::{
can_write_symlinks, create_absolute_symlinks_directory, create_nrs_link, create_symlink,
digest_file, get_random_string, safe_cmd, safe_cmd_at, safe_cmd_stdout, str_to_sha3_256,
sum_tree, test_symlinks_are_valid, upload_path, use_isolated_safe_config_dir, TEST_FOLDER,
};
use std::{
path::{Path, PathBuf},
time::{SystemTime, UNIX_EPOCH},
};
#[test]
fn files_get_src_is_container_and_dst_is_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
let mut dst_pb = PathBuf::from(dst);
dst_pb.push(tmp_data_path.path().file_name().ok_or_else(|| {
eyre!(
"failed to read file name from path: {}",
tmp_data_path.path().display()
)
})?);
assert_eq!(
sum_tree(TEST_FOLDER)?,
sum_tree(&dst_pb.as_path().display().to_string())?
);
Ok(())
}
#[test]
fn files_get_src_is_container_trailing_and_dst_is_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_src_is_container_and_dst_is_cwd() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd_at(
&config_dir,
[
"files",
"get",
src,
".",
"--exists=overwrite",
"--progress=none",
],
&dst,
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_src_is_container_and_dst_is_unspecified() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd_at(
&config_dir,
["files", "get", src, "--exists=overwrite", "--progress=none"],
&dst,
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_attempt_overwrite_sub_file_with_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let subfolder_file = assert_fs::NamedTempFile::new("subfolder")?;
subfolder_file.write_str("existing text file")?;
let mut pb = PathBuf::from(subfolder_file.path());
pb.pop();
let src = &files_container_xor;
let dst = pb.as_path().display().to_string();
let output = safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(output.status.code(), Some(0));
assert_ne!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
subfolder_file.assert(predicate::path::is_file());
subfolder_file.assert(predicate::str::contains("existing text file"));
assert!(Path::new(&dst).join("test.md").is_file());
assert!(Path::new(&dst).join("another.md").is_file());
Ok(())
}
#[test]
fn files_get_src_is_nrs_and_dst_is_unspecified() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut nrs_name = "NRS_NAME".to_string();
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_err(|e| eyre!(e.to_string()))?
.as_micros();
nrs_name.push_str(&str_to_sha3_256(&format!("{now}")));
safe_cmd(
&config_dir,
["nrs", "register", &nrs_name, "-l", &files_container_xor],
Some(0),
)?;
let src = format!("safe://{nrs_name}");
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd_at(
&config_dir,
[
"files",
"get",
&src,
"--exists=overwrite",
"--progress=none",
],
&dst,
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
#[ignore = "investigate after sn_cli merge into workspace"]
fn files_get_src_is_nrs_with_path_and_dst_is_unspecified() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_dir = assert_fs::TempDir::new()?;
tmp_data_dir.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_dir, with_trailing_slash)?;
let mut e = SafeUrl::from_url(&files_container_xor)?;
e.set_path("subfolder");
let xor_url_with_path = e.to_string();
let mut nrs_name = "NRS_NAME".to_string();
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_err(|e| eyre!(e.to_string()))?
.as_micros();
nrs_name.push_str(&str_to_sha3_256(&format!("{now}")));
safe_cmd(
&config_dir,
["nrs", "create", &nrs_name, "-l", &xor_url_with_path],
Some(0),
)?;
let src = format!("safe://{}/sub2.md", &nrs_name);
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd_at(
&config_dir,
[
"files",
"get",
&src,
"--exists=overwrite",
"--progress=none",
],
&dst,
Some(0),
)?;
assert_eq!(
std::fs::read_to_string(Path::new(&format!("{dst}/sub2.md")))?,
std::fs::read_to_string(Path::new("testdata/subfolder/sub2.md"))?
);
Ok(())
}
#[test]
#[ignore = "investigate after sn_cli merge into workspace"]
fn files_get_src_is_nrs_recursive_and_dst_not_existing() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_dir = assert_fs::TempDir::new()?;
tmp_data_dir.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_dir, with_trailing_slash)?;
let container_folder_name = tmp_data_dir
.path()
.file_name()
.and_then(|f| f.to_str())
.ok_or_else(|| {
eyre!(
"failed to read file name from path: {}",
tmp_data_dir.path().display()
)
})?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_path(container_folder_name);
let tmp_data_nrs = get_random_string();
let tmp_data_nrs_url = create_nrs_link(&config_dir, &tmp_data_nrs, &url.to_string())?;
let version = tmp_data_nrs_url
.content_version()
.ok_or_else(|| eyre!("failed to read content version from xorurl"))?;
let src = format!("safe://{tmp_data_nrs}/subfolder?v={version}");
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
sum_tree("testdata/subfolder")?,
sum_tree(&format!("{dst}/subfolder"))?
);
Ok(())
}
#[test]
fn files_get_src_has_embedded_spaces_and_dst_also() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("dir with space/file with space");
child.write_str("some file content")?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
sum_tree(&tmp_data_path.path().display().to_string())?,
sum_tree(&dst)?
);
Ok(())
}
#[test]
fn files_get_src_has_encoded_spaces_and_dst_also() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("dir with space/file with space");
child.write_str("some file content")?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let url = SafeUrl::from_url(&files_container_xor)?;
let src = format!(
"{}://{}/{}",
url.scheme(),
url.public_name(),
"dir%20with%20space/file%20with%20space",
);
let dst = assert_fs::NamedTempFile::new("new file")?;
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst.path().display().to_string(),
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
dst.assert(predicate::path::is_file());
dst.assert(predicate::str::contains("some file content"));
Ok(())
}
#[test]
fn files_get_exists_preserve() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let test_md_file = assert_fs::NamedTempFile::new("test.md")?;
test_md_file.write_str("some markdown content")?;
let mut dst_pb = PathBuf::from(test_md_file.path());
dst_pb.pop();
let dst = dst_pb.as_path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=preserve",
"--progress=none",
],
Some(0),
)?;
test_md_file.assert(predicate::path::is_file());
test_md_file.assert(predicate::str::contains("some markdown content"));
assert_ne!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
assert!(Path::new(&dst).join("another.md").is_file());
Ok(())
}
#[test]
fn files_get_exists_overwrite() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let test_md_file = assert_fs::NamedTempFile::new("test.md")?;
test_md_file.write_str("some markdown content")?;
let mut dst_pb = PathBuf::from(test_md_file.path());
dst_pb.pop();
let dst = dst_pb.as_path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
assert!(Path::new(&dst).join("another.md").is_file());
assert_eq!(
std::fs::read_to_string(Path::new(&format!("{dst}/test.md")))?,
"hello tests!"
);
Ok(())
}
#[test]
fn files_get_src_path_is_invalid() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("/path/is/invalid");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
let output = safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(1),
)?;
assert!(String::from_utf8_lossy(&output.stderr)
.into_owned()
.contains("no data found for path: /path/is/invalid/"));
Ok(())
}
#[test]
fn files_get_dst_parent_does_not_exist() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &&files_container_xor;
let dst = "/non/existent/path";
let output = safe_cmd(
&config_dir,
[
"files",
"get",
src,
dst,
"--exists=overwrite",
"--progress=none",
],
Some(1),
)?;
assert_eq!(output.status.code(), Some(1));
assert!(String::from_utf8_lossy(&output.stderr)
.into_owned()
.contains("No such directory:"));
Ok(())
}
#[test]
fn files_get_src_is_dir_and_dst_exists_as_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("testdata");
child.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &child, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("testdata/");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("testdata");
child.create_dir_all()?;
let dst = format!("{}/testdata", child.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_src_is_dir_and_dst_exists_as_file() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("testdata");
child.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &child, with_trailing_slash)?;
let url = SafeUrl::from_url(&files_container_xor)?;
let src = format!(
"{}://{}/{}?v=0",
url.scheme(),
url.public_name(),
"testdata/",
);
let dst = assert_fs::TempDir::new()?;
let child = dst.child("testdata");
child.write_str("some file content")?;
let dst = format!("{}/testdata", child.path().display());
let output = safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(1),
)?;
assert_eq!(output.status.code(), Some(1));
Ok(())
}
#[test]
fn files_get_src_is_dir_and_dst_not_existing() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("testdata");
child.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &child, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("testdata/");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let dst = format!("{}/testdata", dst.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree(TEST_FOLDER)?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_src_is_dir_and_dst_exists_as_newname_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("testdata");
child.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &child, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("testdata/");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("newname");
child.create_dir_all()?;
let dst = format!("{}/testdata", child.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree("../resources/testdata")?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_src_is_dir_and_dst_exists_as_newname_file() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = false;
let tmp_data_path = assert_fs::TempDir::new()?;
let child = tmp_data_path.child("testdata");
child.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &child, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("testdata/");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("newname");
child.write_str("some file contents")?;
let dst = child.path().display().to_string();
let output = safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(1),
)?;
assert!(String::from_utf8_lossy(&output.stderr)
.into_owned()
.contains("cannot overwrite non-directory"));
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_exists_as_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("noextension");
child.create_dir_all()?;
let dst = child.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&format!("{dst}/noextension"))?
);
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_exists_as_file() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("noextension");
child.write_str("noextension is an existing file with some content")?;
let dst = child.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&dst)?
);
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_not_existing() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let dst = dst.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&format!("{dst}/noextension"))?
);
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_exists_as_newname_dir() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("newname");
child.create_dir_all()?;
let dst = child.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&format!("{dst}/noextension"))?
);
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_exists_as_newname_file() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let child = dst.child("newname");
child.write_str("this file will be overwritten")?;
let dst = child.path().display().to_string();
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&dst)?
);
Ok(())
}
#[test]
fn files_get_src_is_file_and_dst_newname_not_existing() -> Result<()> {
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
tmp_data_path.copy_from("../resources/testdata", &["**"])?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut url = SafeUrl::from_url(&files_container_xor)?;
url.set_content_version(None);
url.set_path("noextension");
let src = url.to_string();
let dst = assert_fs::TempDir::new()?;
let dst = format!("{}/newname", dst.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
&src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
digest_file("../resources/testdata/noextension")?,
digest_file(&dst)?
);
Ok(())
}
#[test]
fn files_get_symlinks_relative() -> Result<()> {
if !test_symlinks_are_valid()? || !can_write_symlinks() {
return Ok(());
}
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let (files_container_xor, _processed_files, _) = upload_path(
&config_dir,
"../resources/test_symlinks",
with_trailing_slash,
)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = format!("{}/newname", dst.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(sum_tree("../resources/test_symlinks")?, sum_tree(&dst)?);
Ok(())
}
#[test]
fn files_get_symlinks_absolute() -> Result<()> {
if !can_write_symlinks() {
return Ok(());
}
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
create_absolute_symlinks_directory(&tmp_data_path)?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let src = &files_container_xor;
let dst = assert_fs::TempDir::new()?;
let dst = format!("{}/newname", dst.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
sum_tree(&tmp_data_path.path().display().to_string())?,
sum_tree(&dst)?
);
Ok(())
}
#[test]
fn files_get_symlinks_after_sync() -> Result<()> {
if !can_write_symlinks() {
return Ok(());
}
let config_dir = use_isolated_safe_config_dir()?;
let with_trailing_slash = true;
let tmp_data_path = assert_fs::TempDir::new()?;
create_absolute_symlinks_directory(&tmp_data_path)?;
let (files_container_xor, _processed_files, _) =
upload_path(&config_dir, &tmp_data_path, with_trailing_slash)?;
let mut safeurl = SafeUrl::from_url(&files_container_xor)?;
safeurl.set_content_version(None);
let new_symlink_path = Path::new(tmp_data_path.path()).join("newlink");
let new_symlink_target = tmp_data_path.child("newlink_target");
new_symlink_target.write_str("content for target file")?;
create_symlink(&new_symlink_target, &new_symlink_path, false).map_err(|e| eyre!("{:?}", e))?;
safe_cmd_stdout(
&config_dir,
[
"files",
"sync",
&format!("{}/", tmp_data_path.path().display()),
&safeurl.to_string(),
],
Some(0),
)?;
let src = &safeurl.to_string();
let dst = assert_fs::TempDir::new()?;
let dst = format!("{}/newname", dst.path().display());
safe_cmd(
&config_dir,
[
"files",
"get",
src,
&dst,
"--exists=overwrite",
"--progress=none",
],
Some(0),
)?;
assert_eq!(
sum_tree(&tmp_data_path.path().display().to_string())?,
sum_tree(&dst)?
);
Ok(())
}