@@ -141,6 +141,7 @@ func Test_UpdatePullRequest(t *testing.T) {
141141 assert .Contains (t , tool .InputSchema .Properties , "state" )
142142 assert .Contains (t , tool .InputSchema .Properties , "base" )
143143 assert .Contains (t , tool .InputSchema .Properties , "maintainer_can_modify" )
144+ assert .Contains (t , tool .InputSchema .Properties , "reviewers" )
144145 assert .ElementsMatch (t , tool .InputSchema .Required , []string {"owner" , "repo" , "pullNumber" })
145146
146147 // Setup mock PR for success case
@@ -162,6 +163,23 @@ func Test_UpdatePullRequest(t *testing.T) {
162163 State : github .Ptr ("closed" ), // State updated
163164 }
164165
166+ // Mock PR for when there are no updates but we still need a response
167+ mockNoUpdatePR := & github.PullRequest {
168+ Number : github .Ptr (42 ),
169+ Title : github .Ptr ("Test PR" ),
170+ State : github .Ptr ("open" ),
171+ }
172+
173+ mockPRWithReviewers := & github.PullRequest {
174+ Number : github .Ptr (42 ),
175+ Title : github .Ptr ("Test PR" ),
176+ State : github .Ptr ("open" ),
177+ RequestedReviewers : []* github.User {
178+ {Login : github .Ptr ("reviewer1" )},
179+ {Login : github .Ptr ("reviewer2" )},
180+ },
181+ }
182+
165183 tests := []struct {
166184 name string
167185 mockedClient * http.Client
@@ -220,8 +238,40 @@ func Test_UpdatePullRequest(t *testing.T) {
220238 expectedPR : mockClosedPR ,
221239 },
222240 {
223- name : "no update parameters provided" ,
224- mockedClient : mock .NewMockedHTTPClient (), // No API call expected
241+ name : "successful PR update with reviewers" ,
242+ mockedClient : mock .NewMockedHTTPClient (
243+ mock .WithRequestMatch (
244+ mock .GetReposPullsByOwnerByRepoByPullNumber ,
245+ & github.PullRequest {
246+ Number : github .Ptr (42 ),
247+ Title : github .Ptr ("Test PR" ),
248+ State : github .Ptr ("open" ),
249+ },
250+ ),
251+ // Mock for RequestReviewers call, returning the PR with reviewers
252+ mock .WithRequestMatch (
253+ mock .PostReposPullsRequestedReviewersByOwnerByRepoByPullNumber ,
254+ mockPRWithReviewers ,
255+ ),
256+ ),
257+ requestArgs : map [string ]interface {}{
258+ "owner" : "owner" ,
259+ "repo" : "repo" ,
260+ "pullNumber" : float64 (42 ),
261+ "reviewers" : []interface {}{"reviewer1" , "reviewer2" },
262+ },
263+ expectError : false ,
264+ expectedPR : mockPRWithReviewers ,
265+ },
266+ {
267+ name : "no update parameters provided" ,
268+ mockedClient : mock .NewMockedHTTPClient (
269+ // Mock a response for the GET PR request in case of no updates
270+ mock .WithRequestMatch (
271+ mock .GetReposPullsByOwnerByRepoByPullNumber ,
272+ mockNoUpdatePR ,
273+ ),
274+ ),
225275 requestArgs : map [string ]interface {}{
226276 "owner" : "owner" ,
227277 "repo" : "repo" ,
@@ -251,6 +301,32 @@ func Test_UpdatePullRequest(t *testing.T) {
251301 expectError : true ,
252302 expectedErrMsg : "failed to update pull request" ,
253303 },
304+ {
305+ name : "request reviewers fails" ,
306+ mockedClient : mock .NewMockedHTTPClient (
307+ // First it gets the PR (no fields to update)
308+ mock .WithRequestMatch (
309+ mock .GetReposPullsByOwnerByRepoByPullNumber ,
310+ mockNoUpdatePR ,
311+ ),
312+ // Then reviewer request fails
313+ mock .WithRequestMatchHandler (
314+ mock .PostReposPullsRequestedReviewersByOwnerByRepoByPullNumber ,
315+ http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
316+ w .WriteHeader (http .StatusUnprocessableEntity )
317+ _ , _ = w .Write ([]byte (`{"message": "Invalid reviewers"}` ))
318+ }),
319+ ),
320+ ),
321+ requestArgs : map [string ]interface {}{
322+ "owner" : "owner" ,
323+ "repo" : "repo" ,
324+ "pullNumber" : float64 (42 ),
325+ "reviewers" : []interface {}{"invalid-user" },
326+ },
327+ expectError : true ,
328+ expectedErrMsg : "failed to request reviewers" ,
329+ },
254330 }
255331
256332 for _ , tc := range tests {
@@ -304,6 +380,26 @@ func Test_UpdatePullRequest(t *testing.T) {
304380 if tc .expectedPR .MaintainerCanModify != nil {
305381 assert .Equal (t , * tc .expectedPR .MaintainerCanModify , * returnedPR .MaintainerCanModify )
306382 }
383+
384+ // Check reviewers if they exist in the expected PR
385+ if tc .expectedPR .RequestedReviewers != nil && len (tc .expectedPR .RequestedReviewers ) > 0 {
386+ assert .NotNil (t , returnedPR .RequestedReviewers )
387+ assert .Equal (t , len (tc .expectedPR .RequestedReviewers ), len (returnedPR .RequestedReviewers ))
388+
389+ // Create maps of reviewer logins for easy comparison
390+ expectedReviewers := make (map [string ]bool )
391+ for _ , reviewer := range tc .expectedPR .RequestedReviewers {
392+ expectedReviewers [* reviewer .Login ] = true
393+ }
394+
395+ actualReviewers := make (map [string ]bool )
396+ for _ , reviewer := range returnedPR .RequestedReviewers {
397+ actualReviewers [* reviewer .Login ] = true
398+ }
399+
400+ // Compare the maps
401+ assert .Equal (t , expectedReviewers , actualReviewers )
402+ }
307403 })
308404 }
309405}
0 commit comments