xdbm/tests/cli.rs
qwjyh 41b2924ad7 add test for storage add
- failure due to name duplication
- success with online & subdirectory with two devices
    - used local git to write test (TODO?: use only git2)
2024-03-14 06:35:11 +09:00

233 lines
7.8 KiB
Rust

mod cmd_init {
use std::fs::DirBuilder;
use anyhow::{anyhow, Ok, Result};
use assert_cmd::{assert::OutputAssertExt, cargo::CommandCargoExt, Command};
use git2::Repository;
use log::trace;
use predicates::prelude::predicate;
#[test]
fn init_with_tmpdir() -> Result<()> {
let config_dir = assert_fs::TempDir::new()?;
let mut cmd = Command::cargo_bin("xdbm")?;
cmd.arg("-c")
.arg(config_dir.path())
.arg("init")
.arg("testdev");
cmd.assert().success().stdout(predicate::str::contains(""));
assert_eq!(
std::fs::read_to_string(config_dir.path().join("devname"))?,
"testdev\n"
);
Ok(())
}
#[test]
fn two_devices_with_same_name() -> Result<()> {
// 1st device
let config_dir_1 = assert_fs::TempDir::new()?;
let mut cmd1 = Command::cargo_bin("xdbm")?;
cmd1.arg("-c")
.arg(config_dir_1.path())
.arg("init")
.arg("first");
cmd1.assert().success().stdout(predicate::str::contains(""));
// bare-repo
let bare_repo_dir = assert_fs::TempDir::new()?;
let bare_repo = Repository::init_bare(&bare_repo_dir)?;
// push to bare repository
let repo_1 = Repository::open(&config_dir_1)?;
let upstream_name = "remote";
let mut repo_1_remote =
repo_1.remote(upstream_name, &bare_repo_dir.path().to_str().unwrap())?;
repo_1_remote.push(&["refs/heads/main"], None)?;
trace!("bare repo {:?}", bare_repo_dir.display());
println!("{:?}", bare_repo_dir.read_dir()?);
// set up upstream branch
let (mut repo_1_branch, _branch_type) = repo_1.branches(None)?.next().unwrap()?;
repo_1_branch.set_upstream(Some(format!("{}/{}", upstream_name, "main").as_str()))?;
// 2nd device
let config_dir_2 = assert_fs::TempDir::new()?;
let mut cmd2 = Command::cargo_bin("xdbm")?;
cmd2.arg("-c")
.arg(config_dir_2.path())
.arg("init")
.arg("first")
.arg("-r")
.arg(bare_repo_dir.path());
cmd2.assert().failure();
Ok(())
}
#[test]
fn directory_without_parent() -> Result<()> {
// 1st device
let config_dir_1 = assert_fs::TempDir::new()?;
let mut cmd1 = Command::cargo_bin("xdbm")?;
cmd1.arg("-c")
.arg(config_dir_1.path())
.arg("init")
.arg("first");
cmd1.assert().success().stdout(predicate::str::contains(""));
// add storage
let sample_storage = assert_fs::TempDir::new()?;
let mut cmd_add_storage = Command::cargo_bin("xdbm")?;
cmd_add_storage
.arg("-c")
.arg(config_dir_1.path())
.arg("storage")
.arg("add")
.arg("directory")
.arg("--alias")
.arg("gdrive")
.arg("gdrive")
.arg(sample_storage.path());
cmd_add_storage
.assert()
.failure()
.stderr(predicate::str::contains("No storages found"));
Ok(())
}
#[test]
fn two_devices() -> Result<()> {
// 1st device
let config_dir_1 = assert_fs::TempDir::new()?;
let mut cmd1 = Command::cargo_bin("xdbm")?;
cmd1.arg("-c")
.arg(config_dir_1.path())
.arg("init")
.arg("first");
cmd1.assert().success().stdout(predicate::str::contains(""));
// bare-repo
let bare_repo_dir = assert_fs::TempDir::new()?;
let bare_repo = Repository::init_bare(&bare_repo_dir)?;
// push to bare repository
let repo_1 = Repository::open(&config_dir_1)?;
let upstream_name = "remote";
let mut repo_1_remote =
repo_1.remote(upstream_name, &bare_repo_dir.path().to_str().unwrap())?;
repo_1_remote.push(&["refs/heads/main"], None)?;
trace!("bare repo {:?}", bare_repo_dir.display());
println!("{:?}", bare_repo_dir.read_dir()?);
// set up upstream branch
let (mut repo_1_branch, _branch_type) = repo_1.branches(None)?.next().unwrap()?;
repo_1_branch.set_upstream(Some(format!("{}/{}", upstream_name, "main").as_str()))?;
// 2nd device
let config_dir_2 = assert_fs::TempDir::new()?;
let mut cmd2 = Command::cargo_bin("xdbm")?;
cmd2.arg("-c")
.arg(config_dir_2.path())
.arg("init")
.arg("second")
.arg("-r")
.arg(bare_repo_dir.path());
cmd2.assert().success().stdout(predicate::str::contains(""));
assert_eq!(
std::fs::read_to_string(config_dir_2.path().join("devname"))?,
"second\n"
);
assert!(
std::fs::read_to_string(config_dir_2.path().join("devices.yml"))?.contains("first")
);
assert!(
std::fs::read_to_string(config_dir_2.path().join("devices.yml"))?.contains("second")
);
assert!(config_dir_2.join("backups").join("first.yml").exists());
assert!(config_dir_2.join("backups").join("second.yml").exists());
std::process::Command::new("git")
.arg("push")
.current_dir(&config_dir_2)
.assert()
.success();
// let repo_2 = Repository::open(config_dir_2)?;
// // return Err(anyhow!("{:?}", repo_2.remotes()?.iter().collect::<Vec<_>>()));
// let mut repo_2_remote = repo_2.find_remote(repo_2.remotes()?.get(0).unwrap())?;
// repo_2_remote.push(&[] as &[&str], None)?;
std::process::Command::new("git")
.arg("pull")
.current_dir(&config_dir_1)
.assert()
.success();
// Add storage
let sample_storage = assert_fs::TempDir::new()?;
let mut cmd_add_storage_1 = Command::cargo_bin("xdbm")?;
cmd_add_storage_1
.arg("-c")
.arg(config_dir_1.path())
.arg("storage")
.arg("add")
.arg("online")
.arg("--provider")
.arg("google")
.arg("--capacity")
.arg("15000000000")
.arg("--alias")
.arg("gdrive")
.arg("gdrive1")
.arg(sample_storage.path());
cmd_add_storage_1
.assert()
.success()
.stdout(predicate::str::contains(""));
// Add storage (directory)
let sample_directory = sample_storage.join("foo").join("bar");
DirBuilder::new()
.recursive(true)
.create(&sample_directory)?;
Command::cargo_bin("xdbm")?
.arg("-c")
.arg(config_dir_1.path())
.arg("storage")
.arg("add")
.arg("directory")
.arg("--alias")
.arg("docs")
.arg("gdrive_docs")
.arg(&sample_directory)
.assert()
.success()
.stdout(predicate::str::contains(""));
assert!(
std::fs::read_to_string(config_dir_1.join("storages.yml"))?.contains("parent: gdrive1")
);
std::process::Command::new("git")
.arg("push")
.current_dir(&config_dir_1)
.assert()
.success();
std::process::Command::new("git")
.arg("pull")
.current_dir(&config_dir_2)
.assert()
.success();
// bind
Command::cargo_bin("xdbm")?
.arg("-c")
.arg(config_dir_2.path())
.arg("storage")
.arg("bind")
.arg("--alias")
.arg("gdocs")
.arg("--path")
.arg(&sample_directory)
.arg("gdrive_docs")
.assert()
.success()
.stdout(predicate::str::contains(""));
Ok(())
}
}