mod common;
use common::fixtures::WorkspaceBuilder;
use common::git_helpers;
#[tokio::test]
async fn test_pr_checks_all_on_default_branch() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::pr::run_pr_checks(
&ws.workspace_root,
&manifest,
None, true, )
.await;
assert!(
result.is_ok(),
"pr checks should succeed when all on default branch: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_checks_json_output_empty() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::pr::run_pr_checks(
&ws.workspace_root,
&manifest,
None, true, )
.await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_pr_checks_handles_api_error_on_feature_branch() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
git_helpers::create_branch(&ws.repo_path("app"), "feat/checks-error");
let result = gitgrip::cli::commands::pr::run_pr_checks(
&ws.workspace_root,
&manifest,
None, true, )
.await;
assert!(
result.is_ok(),
"pr checks should handle API errors: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_checks_skips_non_git_repo() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
std::fs::remove_dir_all(ws.repo_path("app").join(".git")).unwrap();
let result = gitgrip::cli::commands::pr::run_pr_checks(
&ws.workspace_root,
&manifest,
None, true, )
.await;
assert!(
result.is_ok(),
"pr checks should skip non-git repos: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_checks_repo_filter_not_found() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::pr::run_pr_checks(
&ws.workspace_root,
&manifest,
Some("nonexistent"),
true,
)
.await;
assert!(result.is_err(), "should error for unknown repo");
let err = result.unwrap_err().to_string();
assert!(
err.contains("not found"),
"error should mention 'not found': {err}"
);
}
#[tokio::test]
async fn test_pr_checks_repo_filter_valid() {
let ws = WorkspaceBuilder::new()
.add_repo("app")
.add_repo("lib")
.build();
let manifest = ws.load_manifest();
let result =
gitgrip::cli::commands::pr::run_pr_checks(&ws.workspace_root, &manifest, Some("app"), true)
.await;
assert!(
result.is_ok(),
"repo filter to valid repo should succeed: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_checks_skips_reference_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("app")
.add_reference_repo("docs")
.build();
let manifest = ws.load_manifest();
let result =
gitgrip::cli::commands::pr::run_pr_checks(&ws.workspace_root, &manifest, None, true).await;
assert!(
result.is_ok(),
"pr checks should skip reference repos: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_status_all_on_default_branch() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::pr::run_pr_status(
&ws.workspace_root,
&manifest,
true, )
.await;
assert!(
result.is_ok(),
"pr status should succeed when all on default branch: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_status_skips_reference_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("app")
.add_reference_repo("docs")
.build();
let manifest = ws.load_manifest();
git_helpers::create_branch(&ws.repo_path("app"), "feat/test");
let result = gitgrip::cli::commands::pr::run_pr_status(
&ws.workspace_root,
&manifest,
true, )
.await;
assert!(
result.is_ok(),
"pr status should handle reference repos: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_status_non_json_no_changes() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::pr::run_pr_status(
&ws.workspace_root,
&manifest,
false, )
.await;
assert!(
result.is_ok(),
"pr status (non-json) should succeed: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_pr_status_skips_non_git_repo() {
let ws = WorkspaceBuilder::new().add_repo("app").build();
let manifest = ws.load_manifest();
std::fs::remove_dir_all(ws.repo_path("app").join(".git")).unwrap();
let result = gitgrip::cli::commands::pr::run_pr_status(
&ws.workspace_root,
&manifest,
true, )
.await;
assert!(
result.is_ok(),
"pr status should skip non-git repos: {:?}",
result.err()
);
}