#[test]
fn test_git_error_display() {
use quanttide_devops::source::git::GitSourceError;
let err = GitSourceError::RepoOpen("/nonexistent".into());
assert!(err.to_string().contains("无法打开仓库"));
if let Err(git_err) = git2::Repository::open("/nonexistent") {
let from_git: GitSourceError = git_err.into();
assert!(from_git.to_string().contains("git2 错误"));
}
}
#[test]
fn test_git_from_impl() {
use quanttide_devops::source::git::GitSourceError;
if let Err(git_err) = git2::Repository::open("/nonexistent") {
let err: GitSourceError = git_err.into();
assert!(matches!(err, GitSourceError::Git2(_)));
}
}
#[test]
fn test_git_version_status() {
let d = tempfile::tempdir().unwrap();
let scope = quanttide_devops::contract::Scope {
name: "test".into(),
dir: ".".into(),
language: quanttide_devops::contract::Language::Rust,
build_tool: quanttide_devops::contract::BuildTool::Unknown("auto".into()),
registry: quanttide_devops::contract::Registry::None,
framework: String::new(),
release: quanttide_devops::contract::StageRelease::default(),
test_threshold: None,
ci_workflow: None,
};
let result = quanttide_devops::source::git::version_status(d.path(), &scope);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("无法打开仓库"));
let repo = git2::Repository::init(d.path()).unwrap();
let sig = git2::Signature::now("test", "test@test.com").unwrap();
let tree = {
let mut index = repo.index().unwrap();
let oid = index.write_tree().unwrap();
repo.find_tree(oid).unwrap()
};
repo.commit(Some("HEAD"), &sig, &sig, "init", &tree, &[])
.unwrap();
std::fs::write(
d.path().join("Cargo.toml"),
r#"[package]
name = "test"
version = "0.1.0"
"#,
)
.unwrap();
let vs = quanttide_devops::source::git::version_status(d.path(), &scope).unwrap();
assert!(vs.tag_version.is_none());
assert!(vs.config_version.is_some());
repo.tag_lightweight(
"test/v0.1.0",
&repo
.find_object(repo.head().unwrap().target().unwrap(), None)
.unwrap(),
false,
)
.unwrap();
let vs = quanttide_devops::source::git::version_status(d.path(), &scope).unwrap();
assert_eq!(vs.tag_version.as_deref(), Some("0.1.0"));
assert_eq!(vs.config_version.as_deref(), Some("0.1.0"));
assert!(vs.consistent);
}
#[test]
fn test_git_version_status_config_no_version() {
let d = tempfile::tempdir().unwrap();
let repo = git2::Repository::init(d.path()).unwrap();
let sig = git2::Signature::now("test", "test@test.com").unwrap();
let tree = {
let mut index = repo.index().unwrap();
let oid = index.write_tree().unwrap();
repo.find_tree(oid).unwrap()
};
repo.commit(Some("HEAD"), &sig, &sig, "init", &tree, &[])
.unwrap();
repo.tag_lightweight(
"test/v0.1.0",
&repo
.find_object(repo.head().unwrap().target().unwrap(), None)
.unwrap(),
false,
)
.unwrap();
std::fs::write(
d.path().join("Cargo.toml"),
r#"[package]
name = "test"
"#,
)
.unwrap();
let scope = quanttide_devops::contract::Scope {
name: "test".into(),
dir: ".".into(),
language: quanttide_devops::contract::Language::Rust,
build_tool: quanttide_devops::contract::BuildTool::Unknown("auto".into()),
registry: quanttide_devops::contract::Registry::None,
framework: String::new(),
release: quanttide_devops::contract::StageRelease::default(),
test_threshold: None,
ci_workflow: None,
};
let vs = quanttide_devops::source::git::version_status(d.path(), &scope).unwrap();
assert_eq!(vs.tag_version.as_deref(), Some("0.1.0"));
assert!(
vs.config_files
.iter()
.any(|(n, v)| n == "Cargo.toml" && v.is_none())
);
assert!(vs.consistent);
}