Files

181 lines
5.3 KiB
Rust

//! Copyright (c) 2022-2026 GitDataAi All rights reserved.
mod common;
fn hdr() -> gitks::pb::RepositoryHeader {
gitks::pb::RepositoryHeader {
relative_path: "test-repo".into(),
..Default::default()
}
}
#[tokio::test]
async fn test_list_refs_via_service() {
let (dir, _gb) = common::setup_bare_repo();
let svc = common::setup_service(dir.path());
// list_refs is called internally by advertise_refs
// We test it indirectly through the service
use gitks::pb::pack_service_server::PackService;
let result = svc
.advertise_refs(tonic::Request::new(gitks::pb::AdvertiseRefsRequest {
repository: Some(hdr()),
protocol: None,
service: String::new(),
raw: false,
}))
.await
.unwrap()
.into_inner();
assert!(!result.references.is_empty(), "should have refs");
let names: Vec<&str> = result.references.iter().map(|r| r.name.as_str()).collect();
assert!(
names.iter().any(|n| n.contains("refs/heads/main")),
"should have main branch, got: {:?}",
names
);
assert!(
names.iter().any(|n| n.contains("refs/heads/feature")),
"should have feature branch, got: {:?}",
names
);
assert!(
names.iter().any(|n| n.contains("refs/tags/v0.1.0")),
"should have tag, got: {:?}",
names
);
}
#[test]
fn test_list_refs_direct() {
let (_dir, gb) = common::setup_bare_repo();
let refs = gb.list_refs().expect("list_refs");
assert!(!refs.is_empty());
let names: Vec<&str> = refs.iter().map(|r| r.name.as_str()).collect();
assert!(names.iter().any(|n| n.contains("refs/heads/main")));
assert!(names.iter().any(|n| n.contains("refs/heads/feature")));
assert!(names.iter().any(|n| n.contains("refs/tags/v0.1.0")));
// Each ref should have a valid target OID
for r in &refs {
let oid = r.target_oid.as_ref().expect("ref should have target_oid");
assert!(!oid.hex.is_empty(), "OID hex should not be empty");
assert_eq!(oid.hex.len(), 40, "SHA-1 hex should be 40 chars");
}
}
#[test]
fn test_write_ref_and_ref_exists() {
let (_dir, gb) = common::setup_bare_repo();
let oid = common::get_main_oid(&gb);
let resp = gb
.write_ref(gitks::pb::WriteRefRequest {
repository: Some(hdr()),
ref_name: "refs/heads/test-write".into(),
new_oid: oid,
old_oid: String::new(),
force: false,
})
.unwrap();
assert!(resp.ok, "write_ref failed: {}", resp.error);
let exists = gb
.ref_exists(gitks::pb::RefExistsRequest {
repository: Some(hdr()),
ref_name: "refs/heads/test-write".into(),
})
.unwrap();
assert!(exists.exists);
let not_exists = gb
.ref_exists(gitks::pb::RefExistsRequest {
repository: Some(hdr()),
ref_name: "refs/heads/nonexistent".into(),
})
.unwrap();
assert!(!not_exists.exists);
}
#[test]
fn test_update_references_batch() {
let (_dir, gb) = common::setup_bare_repo();
let oid = common::get_main_oid(&gb);
let resp = gb
.update_references(gitks::pb::UpdateReferencesRequest {
repository: Some(hdr()),
updates: vec![
gitks::pb::RefUpdateEntry {
ref_name: "refs/heads/batch-a".into(),
new_oid: oid.clone(),
old_oid: String::new(),
},
gitks::pb::RefUpdateEntry {
ref_name: "refs/heads/batch-b".into(),
new_oid: oid,
old_oid: String::new(),
},
],
})
.unwrap();
assert!(resp.failed_refs.is_empty(), "error: {}", resp.error);
let a = gb
.ref_exists(gitks::pb::RefExistsRequest {
repository: Some(hdr()),
ref_name: "refs/heads/batch-a".into(),
})
.unwrap();
assert!(a.exists);
}
#[test]
fn test_update_references_empty() {
let (_dir, gb) = common::setup_bare_repo();
let resp = gb
.update_references(gitks::pb::UpdateReferencesRequest {
repository: Some(hdr()),
updates: vec![],
})
.unwrap();
assert!(resp.failed_refs.is_empty());
}
#[test]
fn test_delete_refs() {
let (_dir, gb) = common::setup_bare_repo();
let oid = common::get_main_oid(&gb);
gb.write_ref(gitks::pb::WriteRefRequest {
repository: Some(hdr()),
ref_name: "refs/heads/to-delete".into(),
new_oid: oid,
old_oid: String::new(),
force: false,
})
.unwrap();
let resp = gb
.delete_refs(gitks::pb::DeleteRefsRequest {
repository: Some(hdr()),
ref_names: vec!["refs/heads/to-delete".into()],
})
.unwrap();
assert!(resp.failed_refs.is_empty());
let exists = gb
.ref_exists(gitks::pb::RefExistsRequest {
repository: Some(hdr()),
ref_name: "refs/heads/to-delete".into(),
})
.unwrap();
assert!(!exists.exists);
}
#[test]
fn test_find_default_branch_name() {
let (_dir, gb) = common::setup_bare_repo();
let resp = gb.find_default_branch_name().unwrap();
assert_eq!(resp.name, "main");
}