feat: gitea SDK extended tests + research type coverage

- gitea: list_org_repos, get_issue, list_notifications, list_orgs,
  get_org — exercises authed_get paths for more API endpoints
- research: empty tasks parse, multiple tasks parse, depth boundary
  edge cases
This commit is contained in:
2026-03-24 15:15:56 +00:00
parent f1009ddda4
commit b5c83b7c34

View File

@@ -4276,6 +4276,42 @@ mod gitea_sdk_tests {
assert!(!repos.is_empty(), "Should find sol repo by query");
}
#[tokio::test]
async fn test_list_org_repos() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
let repos = gitea.list_org_repos("sol", "studio", Some(50)).await.unwrap();
assert!(!repos.is_empty(), "Studio org should have repos");
}
#[tokio::test]
async fn test_get_issue() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
let issue = gitea.get_issue("sol", "studio", "sol", 1).await.unwrap();
assert_eq!(issue.number, 1);
assert!(issue.title.contains("Bootstrap"));
}
#[tokio::test]
async fn test_list_notifications() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
// May be empty, just verify it doesn't error
let _ = gitea.list_notifications("sol").await.unwrap();
}
#[tokio::test]
async fn test_list_orgs() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
let orgs = gitea.list_orgs("sol", "sol").await.unwrap();
assert!(orgs.iter().any(|o| o.username == "studio"), "Should list studio org");
}
#[tokio::test]
async fn test_get_org() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
let org = gitea.get_org("sol", "studio").await.unwrap();
assert_eq!(org.username, "studio");
}
#[tokio::test]
async fn test_create_and_close_issue() {
let Some(gitea) = dev_gitea().await else { eprintln!("Skipping: no Gitea+OpenBao"); return; };
@@ -5466,6 +5502,30 @@ mod research_extended_tests {
assert_eq!(json["tool_calls_made"], 3);
}
#[test]
fn test_research_empty_tasks() {
let parsed: serde_json::Value = serde_json::from_str(r#"{"tasks":[]}"#).unwrap();
let tasks: Vec<research::ResearchTask> = serde_json::from_value(
parsed.get("tasks").cloned().unwrap_or(serde_json::json!([])),
).unwrap();
assert!(tasks.is_empty());
}
#[test]
fn test_research_multiple_tasks_parse() {
let json = serde_json::json!({
"tasks": [
{"focus": "auth", "instructions": "check auth flow"},
{"focus": "db", "instructions": "review schema"},
{"focus": "api", "instructions": "list endpoints"},
]
});
let tasks: Vec<research::ResearchTask> = serde_json::from_value(json["tasks"].clone()).unwrap();
assert_eq!(tasks.len(), 3);
assert_eq!(tasks[0].focus, "auth");
assert_eq!(tasks[2].focus, "api");
}
#[test]
fn test_research_result_output_format() {
let results = vec![