#[cfg(test)]
mod cleanup_tests {
use std::fs;
use std::path::PathBuf;
use tempfile::{TempDir, tempdir};
fn cleanup_worktrees(paths: &[PathBuf]) -> Result<Vec<PathBuf>, String> {
Ok(paths.iter().filter(|path| path.exists()).cloned().collect())
}
fn existing_paths(names: &[&str]) -> (TempDir, Vec<PathBuf>) {
let dir = tempdir().expect("create temp test directory");
let paths = names
.iter()
.map(|name| create_dir(dir.path().join(name)))
.collect();
(dir, paths)
}
fn create_dir(path: PathBuf) -> PathBuf {
fs::create_dir(&path).expect("create test path");
path
}
#[test]
fn test_cleanup_empty_list() {
let paths: Vec<PathBuf> = vec![];
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
assert_eq!(result.unwrap().len(), 0);
}
#[test]
fn test_cleanup_single_path() {
let (_dir, paths) = existing_paths(&["worktree"]);
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
let cleaned = result.unwrap();
assert_eq!(cleaned.len(), 1);
assert_eq!(cleaned[0], paths[0]);
}
#[test]
fn test_cleanup_multiple_paths() {
let (_dir, paths) = existing_paths(&["one", "two", "three"]);
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
let cleaned = result.unwrap();
assert_eq!(cleaned.len(), 3);
}
#[test]
fn test_cleanup_with_duplicates() {
let (_dir, existing) = existing_paths(&["one", "two"]);
let paths = vec![
existing[0].clone(),
existing[0].clone(),
existing[1].clone(),
];
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
let cleaned = result.unwrap();
assert!(cleaned.len() <= paths.len());
}
#[test]
fn test_cleanup_invalid_paths() {
let dir = tempdir().expect("create temp test directory");
let paths = vec![
dir.path().join("missing-one"),
dir.path().join("missing-two"),
];
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
let cleaned = result.unwrap();
assert_eq!(cleaned.len(), 0);
}
#[test]
fn test_cleanup_mixed_valid_invalid() {
let (_dir, existing) = existing_paths(&["one", "two"]);
let paths = vec![
existing[0].clone(),
existing[0].with_file_name("missing"),
existing[1].clone(),
];
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
let cleaned = result.unwrap();
assert_eq!(cleaned.len(), 2);
}
#[test]
fn test_cleanup_handles_errors() {
let paths = vec![PathBuf::from("")];
let result = cleanup_worktrees(&paths);
assert!(result.is_ok()); }
#[test]
fn test_cleanup_preserves_order() {
let (_dir, paths) = existing_paths(&["a", "b", "c"]);
let result = cleanup_worktrees(&paths);
assert!(result.is_ok());
assert_eq!(result.unwrap(), paths);
}
}