mod common;
use common::fixtures::WorkspaceBuilder;
#[test]
fn test_diff_no_changes() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
false,
false,
None,
None,
);
assert!(
result.is_ok(),
"diff on clean workspace should succeed: {:?}",
result.err()
);
}
#[test]
fn test_diff_unstaged_changes() {
let ws = WorkspaceBuilder::new().add_repo("frontend").build();
let manifest = ws.load_manifest();
std::fs::write(ws.repo_path("frontend").join("README.md"), "modified\n").unwrap();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
false,
false,
None,
None,
);
assert!(
result.is_ok(),
"diff with unstaged changes should succeed: {:?}",
result.err()
);
}
#[test]
fn test_diff_staged_changes() {
let ws = WorkspaceBuilder::new().add_repo("frontend").build();
let manifest = ws.load_manifest();
let repo_path = ws.repo_path("frontend");
std::fs::write(repo_path.join("README.md"), "staged content\n").unwrap();
std::process::Command::new("git")
.args(["add", "README.md"])
.current_dir(&repo_path)
.output()
.unwrap();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
true, false,
None,
None,
);
assert!(
result.is_ok(),
"diff --staged should succeed: {:?}",
result.err()
);
}
#[test]
fn test_diff_json_output() {
let ws = WorkspaceBuilder::new().add_repo("frontend").build();
let manifest = ws.load_manifest();
std::fs::write(ws.repo_path("frontend").join("README.md"), "json diff\n").unwrap();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
false,
true, None,
None,
);
assert!(
result.is_ok(),
"diff --json should succeed: {:?}",
result.err()
);
}
#[test]
fn test_diff_multi_repo() {
let ws = WorkspaceBuilder::new()
.add_repo("frontend")
.add_repo("backend")
.build();
let manifest = ws.load_manifest();
std::fs::write(ws.repo_path("frontend").join("README.md"), "fe changes\n").unwrap();
std::fs::write(ws.repo_path("backend").join("README.md"), "be changes\n").unwrap();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
false,
false,
None,
None,
);
assert!(
result.is_ok(),
"multi-repo diff should succeed: {:?}",
result.err()
);
}
#[test]
fn test_diff_includes_reference_repos() {
let ws = WorkspaceBuilder::new()
.add_repo("app")
.add_reference_repo("ref-lib")
.build();
let manifest = ws.load_manifest();
std::fs::write(ws.repo_path("ref-lib").join("README.md"), "ref changes\n").unwrap();
let result = gitgrip::cli::commands::diff::run_diff(
&ws.workspace_root,
&manifest,
false,
false,
None,
None,
);
assert!(result.is_ok(), "diff should succeed: {:?}", result.err());
}