sal-git 0.1.0

SAL Git - Git repository management and operations
Documentation
use sal_git::*;
use std::fs;
use tempfile::TempDir;

#[test]
fn test_parse_git_url_https() {
    let (server, account, repo) = parse_git_url("https://github.com/user/repo.git");
    assert_eq!(server, "github.com");
    assert_eq!(account, "user");
    assert_eq!(repo, "repo");
}

#[test]
fn test_parse_git_url_https_without_git_extension() {
    let (server, account, repo) = parse_git_url("https://github.com/user/repo");
    assert_eq!(server, "github.com");
    assert_eq!(account, "user");
    assert_eq!(repo, "repo");
}

#[test]
fn test_parse_git_url_ssh() {
    let (server, account, repo) = parse_git_url("git@github.com:user/repo.git");
    assert_eq!(server, "github.com");
    assert_eq!(account, "user");
    assert_eq!(repo, "repo");
}

#[test]
fn test_parse_git_url_ssh_without_git_extension() {
    let (server, account, repo) = parse_git_url("git@github.com:user/repo");
    assert_eq!(server, "github.com");
    assert_eq!(account, "user");
    assert_eq!(repo, "repo");
}

#[test]
fn test_parse_git_url_invalid() {
    let (server, account, repo) = parse_git_url("invalid-url");
    assert_eq!(server, "");
    assert_eq!(account, "");
    assert_eq!(repo, "");
}

#[test]
fn test_git_tree_new_creates_directory() {
    let temp_dir = TempDir::new().unwrap();
    let base_path = temp_dir.path().join("git_repos");
    let base_path_str = base_path.to_str().unwrap();

    let _git_tree = GitTree::new(base_path_str).unwrap();
    assert!(base_path.exists());
    assert!(base_path.is_dir());
}

#[test]
fn test_git_tree_new_existing_directory() {
    let temp_dir = TempDir::new().unwrap();
    let base_path = temp_dir.path().join("existing_dir");
    fs::create_dir_all(&base_path).unwrap();
    let base_path_str = base_path.to_str().unwrap();

    let _git_tree = GitTree::new(base_path_str).unwrap();
}

#[test]
fn test_git_tree_new_invalid_path() {
    let temp_dir = TempDir::new().unwrap();
    let file_path = temp_dir.path().join("file.txt");
    fs::write(&file_path, "content").unwrap();
    let file_path_str = file_path.to_str().unwrap();

    let result = GitTree::new(file_path_str);
    assert!(result.is_err());
    if let Err(error) = result {
        match error {
            GitError::InvalidBasePath(_) => {}
            _ => panic!("Expected InvalidBasePath error"),
        }
    }
}

#[test]
fn test_git_tree_list_empty_directory() {
    let temp_dir = TempDir::new().unwrap();
    let base_path_str = temp_dir.path().to_str().unwrap();

    let git_tree = GitTree::new(base_path_str).unwrap();
    let repos = git_tree.list().unwrap();
    assert!(repos.is_empty());
}

#[test]
fn test_git_repo_new() {
    let repo = GitRepo::new("/path/to/repo".to_string());
    assert_eq!(repo.path(), "/path/to/repo");
}

#[test]
fn test_git_repo_clone() {
    let repo1 = GitRepo::new("/path/to/repo".to_string());
    let repo2 = repo1.clone();
    assert_eq!(repo1.path(), repo2.path());
}

#[test]
fn test_git_error_display() {
    let error = GitError::InvalidUrl("bad-url".to_string());
    assert_eq!(format!("{}", error), "Could not parse git URL: bad-url");

    let error = GitError::NoRepositoriesFound;
    assert_eq!(format!("{}", error), "No repositories found");

    let error = GitError::RepositoryNotFound("pattern".to_string());
    assert_eq!(
        format!("{}", error),
        "No repositories found matching 'pattern'"
    );
}