diff --git a/src-tauri/src/mcp_tools.rs b/src-tauri/src/mcp_tools.rs index d0c0ae1..853e2ae 100644 --- a/src-tauri/src/mcp_tools.rs +++ b/src-tauri/src/mcp_tools.rs @@ -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!({