use crate::setup::{get_git_cmd, get_rgit_cmd, setup_git, setup_rgit};
use anyhow::Result;
use assert_cmd::prelude::*;
use std::{fs, process::Command};
use tempdir::TempDir;
#[test]
fn test_commit_without_root_should_fail() {
let mut cmd = Command::cargo_bin("r_git").expect("Failed to build binary");
cmd.arg("commit")
.arg("-m")
.arg("Initial commit")
.assert()
.failure();
let output = cmd.output().expect("Failed to run command");
assert_eq!(
String::from_utf8_lossy(&output.stderr),
"Error: fatal: not a git repository (or any of the parent directories): .rgit\n"
);
}
#[test]
fn test_commit_without_author_details_should_fail() -> Result<()> {
let temp_dir = TempDir::new("test_rgit")?;
setup_rgit(&temp_dir.path().to_path_buf())?;
setup_git(&temp_dir.path().to_path_buf())?;
std::env::remove_var("RGIT_AUTHOR_NAME");
std::env::remove_var("RGIT_AUTHOR_EMAIL");
let file_path = temp_dir.path().join("file");
std::fs::write(&file_path, "Hello, World!")?;
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("add")
.arg("file")
.assert()
.success();
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("commit")
.arg("-m")
.arg("Initial commit")
.assert()
.failure();
let output = cmd.output().expect("Failed to run command");
assert_eq!(
String::from_utf8_lossy(&output.stderr),
"Error: failed to get author details\n"
);
Ok(())
}
#[test]
fn test_commit_with_single_file() -> Result<()> {
let temp_dir = TempDir::new("test_rgit")?;
setup_rgit(&temp_dir.path().to_path_buf())?;
let file_path = temp_dir.path().join("file");
std::fs::write(&file_path, "Hello, World!")?;
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("add")
.arg("file")
.assert()
.success();
std::env::set_var("RGIT_AUTHOR_NAME", "Test Author");
std::env::set_var("RGIT_AUTHOR_EMAIL", "test@example.com");
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("commit")
.arg("-m")
.arg("Initial commit")
.assert()
.success();
let output = cmd.output().expect("Failed to run command");
let output = String::from_utf8_lossy(&output.stdout);
let commit_oid = output
.trim()
.split(" ")
.next()
.expect("Failed to get commit oid");
fs::rename(
temp_dir.path().join(".rgit/"),
temp_dir.path().join(".git/"),
)?;
let mut cmd = get_git_cmd();
cmd.current_dir(&temp_dir)
.arg("cat-file")
.arg("-p")
.arg(commit_oid)
.assert()
.success();
Ok(())
}
#[test]
fn test_commit_chaining() {
let temp_dir = TempDir::new("test_rgit").expect("Failed to create temp dir");
setup_rgit(&temp_dir.path().to_path_buf()).expect("Failed to setup rgit");
std::env::set_var("RGIT_AUTHOR_NAME", "Test Author");
std::env::set_var("RGIT_AUTHOR_EMAIL", "test@example.com");
let file_path = temp_dir.path().join("file");
fs::write(&file_path, "Hello, World!").expect("Failed to write file");
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("add")
.arg("file")
.assert()
.success();
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("commit")
.arg("-m")
.arg("Initial commit")
.assert()
.success();
let file_path = temp_dir.path().join("file2");
fs::write(&file_path, "Hello, World!").expect("Failed to write file");
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("add")
.arg("file2")
.assert()
.success();
let mut cmd = get_rgit_cmd();
cmd.current_dir(&temp_dir)
.arg("commit")
.arg("-m")
.arg("Second commit")
.assert()
.success();
fs::rename(
temp_dir.path().join(".rgit/"),
temp_dir.path().join(".git/"),
)
.expect("Failed to rename .rgit to .git");
let mut cmd = get_git_cmd();
cmd.current_dir(&temp_dir).arg("log").assert().success();
let output = cmd.output().expect("Failed to run command");
let output = String::from_utf8_lossy(&output.stdout);
assert_eq!(output.split("\n").count(), 12);
}