mod common;
use common::assertions::{
assert_all_on_branch, assert_branch_exists, assert_branch_not_exists, assert_on_branch,
};
use common::fixtures::WorkspaceBuilder;
use common::git_helpers;
#[test]
fn test_branch_create_across_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/new-feature"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"branch create should succeed: {:?}",
result.err()
);
assert_on_branch(&ws.repo_path("frontend"), "feat/new-feature");
assert_on_branch(&ws.repo_path("backend"), "feat/new-feature");
}
#[test]
fn test_branch_delete() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/to-delete"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
})
.unwrap();
gitgrip::cli::commands::checkout::run_checkout(
&ws.workspace_root,
&manifest,
"main",
false,
None,
None,
)
.unwrap();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/to-delete"),
delete: true,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"branch delete should succeed: {:?}",
result.err()
);
assert_branch_not_exists(&ws.repo_path("frontend"), "feat/to-delete");
assert_branch_not_exists(&ws.repo_path("backend"), "feat/to-delete");
}
#[test]
fn test_branch_list() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/one"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
})
.unwrap();
git_helpers::checkout(&ws.repo_path("app"), "main");
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/two"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
})
.unwrap();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: None,
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"branch list should succeed: {:?}",
result.err()
);
}
#[test]
fn test_branch_filter_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.add_repo("shared")
.build();
let manifest = ws.load_manifest();
let filter = vec!["frontend".to_string(), "backend".to_string()];
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/filtered"),
delete: false,
move_commits: false,
repos_filter: Some(&filter),
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"filtered branch should succeed: {:?}",
result.err()
);
assert_on_branch(&ws.repo_path("frontend"), "feat/filtered");
assert_on_branch(&ws.repo_path("backend"), "feat/filtered");
assert_on_branch(&ws.repo_path("shared"), "main");
}
#[test]
fn test_branch_skip_reference_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("app")
.add_reference_repo("docs")
.build();
let manifest = ws.load_manifest();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/skip-refs"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(result.is_ok(), "branch should succeed: {:?}", result.err());
assert_on_branch(&ws.repo_path("app"), "feat/skip-refs");
assert_on_branch(&ws.repo_path("docs"), "main");
}
#[test]
fn test_branch_idempotent_creation() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/existing"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
})
.unwrap();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/existing"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"creating an existing branch should not fail: {:?}",
result.err()
);
}
#[test]
fn test_branch_not_cloned_repo() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
std::fs::remove_dir_all(ws.repo_path("app")).unwrap();
let manifest = ws.load_manifest();
let result =
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/no-repo"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
});
assert!(
result.is_ok(),
"branch on missing repo should not fail: {:?}",
result.err()
);
}
#[test]
fn test_branch_create_then_verify_branches_exist() {
let ws = WorkspaceBuilder::new()
.add_repo("alpha")
.add_repo("beta")
.build();
let manifest = ws.load_manifest();
gitgrip::cli::commands::branch::run_branch(gitgrip::cli::commands::branch::BranchOptions {
workspace_root: &ws.workspace_root,
manifest: &manifest,
name: Some("feat/verify"),
delete: false,
move_commits: false,
repos_filter: None,
group_filter: None,
json: false,
})
.unwrap();
assert_branch_exists(&ws.repo_path("alpha"), "feat/verify");
assert_branch_exists(&ws.repo_path("beta"), "feat/verify");
assert_branch_exists(&ws.repo_path("alpha"), "main");
assert_branch_exists(&ws.repo_path("beta"), "main");
}