#![cfg(test)]
use crate::{
errors::{io::IoError, DotbakError},
git::Repository,
repo_exists, repo_not_exists,
};
use assert_fs::{prelude::*, TempDir};
const TEST_GIT_REPO_URL: &str = "https://github.com/cogsandsquigs/dotbak";
#[test]
fn test_init_path_exists() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::init(repo_dir, None).unwrap();
println!("{:?}", repo_dir);
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_init_path_nonexistent() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path().join("some/sub/folders");
let repo = Repository::init(&repo_dir, None).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_init_exists_already() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
let repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_load_path_exists() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
let result = Repository::load(repo_dir);
assert!(result.is_ok());
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_load_path_nonexistent() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path().join("some/sub/folders");
let result = Repository::load(repo_dir);
assert!(result.is_err());
assert!(matches!(
result,
Err(DotbakError::Io(IoError::NotFound { .. }))
));
}
#[test]
fn test_clone_path_exists() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::clone(repo_dir, TEST_GIT_REPO_URL).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_clone_path_nonexistent() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path().join("some/sub/folders");
let repo = Repository::clone(&repo_dir, TEST_GIT_REPO_URL).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_clone_exists_already() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::init(repo_dir, None);
repo_exists!(repo_dir);
assert_eq!(repo.unwrap().path, repo_dir);
let result = Repository::clone(repo_dir, TEST_GIT_REPO_URL);
assert!(result.is_err());
assert!(matches!(
result,
Err(DotbakError::Io ( IoError::CommandRun { stderr, .. })) if stderr.contains("already exists and is not an empty directory")
));
}
#[test]
fn test_arbitrary_command() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let mut repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
tmp_dir.child("test.txt").touch().unwrap();
repo.arbitrary_command(&["add", "."]).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
assert!(tmp_dir.child("test.txt").path().exists());
repo.arbitrary_command(&["commit", "-m", "Test commit"])
.unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
assert!(tmp_dir.child("test.txt").path().exists());
}
#[test]
fn test_commit() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let mut repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
repo.arbitrary_command(&["config", "user.name", "Test User"])
.unwrap();
repo.arbitrary_command(&["config", "user.email", "test_user@tests"])
.unwrap();
tmp_dir.child("test.txt").touch().unwrap();
repo.commit("Initial commit").unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
assert!(tmp_dir.child("test.txt").path().exists());
tmp_dir.child("test2.txt").touch().unwrap();
repo.commit("Second commit").unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
assert!(tmp_dir.child("test.txt").path().exists());
assert!(tmp_dir.child("test2.txt").path().exists());
}
#[test]
fn test_set_remote() {
let tmp_dir = TempDir::new().unwrap();
let mut repo_dir = tmp_dir.path().to_path_buf();
let mut repo = Repository::init(&repo_dir, None).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
repo.set_remote(TEST_GIT_REPO_URL).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
repo_dir = tmp_dir.path().join("clone");
let mut repo = Repository::clone(&repo_dir, TEST_GIT_REPO_URL).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
repo.set_remote(TEST_GIT_REPO_URL).unwrap();
repo_exists!(&repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_push() {
if !is_ci::uncached() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let mut repo = Repository::clone(repo_dir, TEST_GIT_REPO_URL).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
repo.push().unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path(), repo_dir);
}
else {
println!("Skipping test_push because we are in a CI environment.");
}
}
#[test]
fn test_pull() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let mut repo = Repository::clone(repo_dir, TEST_GIT_REPO_URL).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
repo.pull().unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
}
#[test]
fn test_delete() {
let tmp_dir = TempDir::new().unwrap();
let repo_dir = tmp_dir.path();
let repo = Repository::init(repo_dir, None).unwrap();
repo_exists!(repo_dir);
assert_eq!(repo.path, repo_dir);
repo.delete().unwrap();
repo_not_exists!(repo_dir);
}