use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;
#[test]
fn test_griptree_repo_info_serialization() {
use gitgrip::core::griptree::GriptreeRepoInfo;
let repo_info = GriptreeRepoInfo {
name: "codi".to_string(),
original_branch: "main".to_string(),
is_reference: false,
worktree_name: Some("main".to_string()),
worktree_path: Some("/path/to/worktree".to_string()),
main_repo_path: Some("/workspace/codi".to_string()),
};
let json = serde_json::to_string(&repo_info).unwrap();
let deserialized: GriptreeRepoInfo = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.name, repo_info.name);
assert_eq!(deserialized.original_branch, repo_info.original_branch);
assert_eq!(deserialized.is_reference, repo_info.is_reference);
assert_eq!(deserialized.worktree_name, repo_info.worktree_name);
assert_eq!(deserialized.worktree_path, repo_info.worktree_path);
assert_eq!(deserialized.main_repo_path, repo_info.main_repo_path);
}
#[test]
fn test_griptree_pointer_backwards_compat() {
use gitgrip::core::griptree::GriptreePointer;
use serde_json;
let old_json = r#"{
"branch": "feat/test",
"mainWorkspace": "/workspace",
"locked": false
}"#;
let pointer: GriptreePointer = serde_json::from_str(old_json).unwrap();
assert_eq!(pointer.branch, "feat/test");
assert_eq!(pointer.main_workspace, "/workspace");
assert!(pointer.repos.is_empty(), "repos should default to empty");
assert!(
pointer.manifest_branch.is_none(),
"manifest_branch should default to None"
);
}
#[test]
fn test_griptree_pointer_new_fields() {
use gitgrip::core::griptree::GriptreePointer;
use serde_json;
let json_with_new_fields = r#"{
"branch": "feat/test",
"mainWorkspace": "/workspace",
"locked": false,
"repos": [
{
"name": "codi",
"originalBranch": "main",
"isReference": false
}
],
"manifestBranch": "griptree-feat-test"
}"#;
let pointer: GriptreePointer = serde_json::from_str(json_with_new_fields).unwrap();
assert_eq!(pointer.branch, "feat/test");
assert_eq!(pointer.main_workspace, "/workspace");
assert_eq!(pointer.repos.len(), 1);
assert_eq!(pointer.repos[0].name, "codi");
assert_eq!(pointer.repos[0].original_branch, "main");
assert!(!pointer.repos[0].is_reference);
assert_eq!(
pointer.manifest_branch,
Some("griptree-feat-test".to_string())
);
}
#[test]
fn test_main_manifests_dir_path() {
let temp = TempDir::new().unwrap();
let workspace_root = PathBuf::from(temp.path());
let manifests_dir = workspace_root.join(".gitgrip").join("spaces").join("main");
fs::create_dir_all(&manifests_dir).unwrap();
assert!(manifests_dir.exists());
}
#[test]
fn test_griptree_manifest_path() {
let temp = TempDir::new().unwrap();
let griptree_path = PathBuf::from(temp.path());
let griptree_manifest_dir = griptree_path.join(".gitgrip").join("spaces").join("main");
fs::create_dir_all(&griptree_manifest_dir).unwrap();
assert!(griptree_manifest_dir.exists());
}
#[test]
fn test_manifest_worktree_git_dir() {
let temp = TempDir::new().unwrap();
let manifests_dir = PathBuf::from(temp.path());
let manifests_git_dir = manifests_dir.join(".git");
fs::create_dir_all(&manifests_dir).unwrap();
assert!(!manifests_git_dir.exists());
fs::write(
&manifests_git_dir,
"gitdir: /some/other/path/.git/worktrees/mymain",
)
.unwrap();
assert!(manifests_git_dir.exists());
}
#[test]
fn test_manifest_worktree_branch_name() {
let branch_name = "feat/feature-branch";
let expected_worktree_name = format!("griptree-{}", branch_name.replace('/', "-"));
assert_eq!(expected_worktree_name, "griptree-feat-feature-branch");
}
#[test]
fn test_manifest_worktree_branch_name_simple() {
let branch_name = "my-feature";
let expected_worktree_name = format!("griptree-{}", branch_name.replace('/', "-"));
assert_eq!(expected_worktree_name, "griptree-my-feature");
}
#[test]
fn test_griptree_pointer_empty_repos() {
use gitgrip::core::griptree::GriptreePointer;
use serde_json;
let pointer = GriptreePointer {
branch: "feature".to_string(),
main_workspace: "/path".to_string(),
locked: false,
created_at: None,
repos: vec![],
manifest_branch: None,
manifest_worktree_name: None,
};
let json = serde_json::to_string_pretty(&pointer).unwrap();
let deserialized: GriptreePointer = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.repos.len(), 0);
assert!(deserialized.manifest_branch.is_none());
}
#[test]
fn test_griptree_repo_info_camel_case() {
use gitgrip::core::griptree::GriptreeRepoInfo;
use serde_json;
let repo_info = GriptreeRepoInfo {
name: "codi-private".to_string(),
original_branch: "develop".to_string(),
is_reference: false,
worktree_name: None,
worktree_path: None,
main_repo_path: None,
};
let json = serde_json::to_string(&repo_info).unwrap();
assert!(json.contains("\"originalBranch\""));
assert!(json.contains("\"isReference\""));
let deserialized: GriptreeRepoInfo = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.original_branch, "develop");
assert!(!deserialized.is_reference);
}