feat(delivery/mcp): get_delivery_status 支持按 pr_number/branch 查询,结论绑定 Gitea head SHA(使者回传 #203) #32

Merged
lanrtop merged 3 commits from feat/delivery-status-by-pr into master 2026-10-03 05:36:38 +08:00
Showing only changes of commit df5832f41b - Show all commits

View File

@ -2680,6 +2680,67 @@ mod tests {
assert!(text.contains("feat/delivery-status-by-pr"), "{text}");
}
/// 使者回传 #203 的症状正是「传 pr_number 也不起作用」:经 scoped dispatch 断言
/// pr_number/branch 真正到达能力本体(未绑定 Gitea,不发网络请求)。
#[tokio::test]
async fn delivery_status_dispatch_forwards_pr_and_branch_targets() {
db::init_test_pool();
let base = temp_base("delivery_target_dispatch");
{
let conn = db::pool().get().unwrap();
conn.execute(
"INSERT OR IGNORE INTO project_profiles (id, name) VALUES ('delivery-target-profile', 'Delivery target fixture')",
[],
)
.unwrap();
conn.execute(
"INSERT OR IGNORE INTO project_workspaces (id, profile_id, win_path) VALUES ('delivery-target', 'delivery-target-profile', ?1)",
[base.to_str().unwrap()],
)
.unwrap();
}
let target_of = |result: &Value| {
assert_ne!(result["isError"], true, "{result}");
result["structuredContent"]["target"].clone()
};
let by_pr = tools_call_for_project(
Some(&json!({"name": "get_delivery_status", "arguments": {
"pr_number": 31, "branch": "feat/worktree"
}})),
"delivery-target",
)
.await;
let target = target_of(&by_pr);
assert_eq!(target["mode"], "pull_request", "{by_pr}");
assert_eq!(target["pr_number"], 31, "{by_pr}");
assert_eq!(
by_pr["structuredContent"]["pull_request"]["state"],
"not_configured"
);
let by_branch = tools_call_for_project(
Some(&json!({"name": "get_delivery_status", "arguments": {
"branch": "feat/worktree"
}})),
"delivery-target",
)
.await;
let target = target_of(&by_branch);
assert_eq!(target["mode"], "branch", "{by_branch}");
assert_eq!(target["branch"], "feat/worktree", "{by_branch}");
let default = tools_call_for_project(
Some(&json!({"name": "get_delivery_status", "arguments": {
"pr_number": null, "branch": null
}})),
"delivery-target",
)
.await;
assert_eq!(target_of(&default)["mode"], "local_branch", "{default}");
let _ = std::fs::remove_dir_all(&base);
}
#[tokio::test]
async fn delivery_status_tool_requires_project_id() {
let result = tools_call(Some(&json!({