Skip to content

Commit 94cef70

Browse files
committed
refactor: streamline UpdatePullRequest logic and enhance test cases for reviewer updates
1 parent 033f613 commit 94cef70

File tree

3 files changed

+76
-49
lines changed

3 files changed

+76
-49
lines changed

pkg/github/discussions_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ var (
8787
"url": "https://github.com/owner/.github/discussions/4",
8888
"category": map[string]any{"name": "General"},
8989
},
90-
9190
}
9291

9392
// Ordered mock responses
@@ -190,7 +189,7 @@ var (
190189
"startCursor": "",
191190
"endCursor": "",
192191
},
193-
"totalCount": 4,
192+
"totalCount": 4,
194193
},
195194
},
196195
})

pkg/github/pullrequests.go

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -315,33 +315,38 @@ func UpdatePullRequest(getClient GetClientFn, getGQLClient GetGQLClientFn, t tra
315315
return mcp.NewToolResultError(err.Error()), nil
316316
}
317317

318-
// If no updates and no reviewers, return error early
319-
if !restUpdateNeeded && len(reviewers) == 0 && !draftProvided {
320-
return mcp.NewToolResultError("No update parameters provided"), nil
318+
// If no updates, no draft change, and no reviewers, return error early
319+
if !restUpdateNeeded && !draftProvided && len(reviewers) == 0 {
320+
return mcp.NewToolResultError("No update parameters provided."), nil
321321
}
322322

323-
client, err := getClient(ctx)
324-
if err != nil {
325-
return nil, fmt.Errorf("failed to get GitHub client: %w", err)
326-
}
327-
pr, resp, err := client.PullRequests.Edit(ctx, owner, repo, pullNumber, update)
328-
if err != nil {
329-
return ghErrors.NewGitHubAPIErrorResponse(ctx,
330-
"failed to update pull request",
331-
resp,
332-
err,
333-
), nil
334-
}
335-
defer func() { _ = resp.Body.Close() }()
323+
// Handle REST API updates
324+
if restUpdateNeeded {
325+
client, err := getClient(ctx)
326+
if err != nil {
327+
return nil, fmt.Errorf("failed to get GitHub client: %w", err)
328+
}
336329

337-
if resp.StatusCode != http.StatusOK {
338-
body, err := io.ReadAll(resp.Body)
330+
_, resp, err := client.PullRequests.Edit(ctx, owner, repo, pullNumber, update)
339331
if err != nil {
340-
return nil, fmt.Errorf("failed to read response body: %w", err)
332+
return ghErrors.NewGitHubAPIErrorResponse(ctx,
333+
"failed to update pull request",
334+
resp,
335+
err,
336+
), nil
337+
}
338+
defer func() { _ = resp.Body.Close() }()
339+
340+
if resp.StatusCode != http.StatusOK {
341+
body, err := io.ReadAll(resp.Body)
342+
if err != nil {
343+
return nil, fmt.Errorf("failed to read response body: %w", err)
344+
}
345+
return mcp.NewToolResultError(fmt.Sprintf("failed to update pull request: %s", string(body))), nil
341346
}
342-
return mcp.NewToolResultError(fmt.Sprintf("failed to update pull request: %s", string(body))), nil
343347
}
344348

349+
// Handle draft status changes using GraphQL
345350
if draftProvided {
346351
gqlClient, err := getGQLClient(ctx)
347352
if err != nil {
@@ -407,6 +412,41 @@ func UpdatePullRequest(getClient GetClientFn, getGQLClient GetGQLClientFn, t tra
407412
}
408413
}
409414

415+
// Handle reviewer requests
416+
if len(reviewers) > 0 {
417+
client, err := getClient(ctx)
418+
if err != nil {
419+
return nil, fmt.Errorf("failed to get GitHub client: %w", err)
420+
}
421+
422+
reviewersRequest := github.ReviewersRequest{
423+
Reviewers: reviewers,
424+
}
425+
426+
_, resp, err := client.PullRequests.RequestReviewers(ctx, owner, repo, pullNumber, reviewersRequest)
427+
if err != nil {
428+
return ghErrors.NewGitHubAPIErrorResponse(ctx,
429+
"failed to request reviewers",
430+
resp,
431+
err,
432+
), nil
433+
}
434+
defer func() {
435+
if resp != nil && resp.Body != nil {
436+
_ = resp.Body.Close()
437+
}
438+
}()
439+
440+
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK {
441+
body, err := io.ReadAll(resp.Body)
442+
if err != nil {
443+
return nil, fmt.Errorf("failed to read response body: %w", err)
444+
}
445+
return mcp.NewToolResultError(fmt.Sprintf("failed to request reviewers: %s", string(body))), nil
446+
}
447+
}
448+
449+
// Get the final state of the PR to return
410450
client, err := getClient(ctx)
411451
if err != nil {
412452
return nil, err

pkg/github/pullrequests_test.go

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -257,58 +257,47 @@ func Test_UpdatePullRequest(t *testing.T) {
257257
expectedPR: mockClosedPR,
258258
},
259259
{
260-
<<<<<<< HEAD
261260
name: "successful PR update with reviewers",
262261
mockedClient: mock.NewMockedHTTPClient(
263-
mock.WithRequestMatch(
264-
mock.GetReposPullsByOwnerByRepoByPullNumber,
265-
&github.PullRequest{
266-
Number: github.Ptr(42),
267-
Title: github.Ptr("Test PR"),
268-
State: github.Ptr("open"),
269-
},
270-
),
271262
// Mock for RequestReviewers call, returning the PR with reviewers
272263
mock.WithRequestMatch(
273264
mock.PostReposPullsRequestedReviewersByOwnerByRepoByPullNumber,
274265
mockPRWithReviewers,
275-
=======
276-
name: "successful PR update (title only)",
277-
mockedClient: mock.NewMockedHTTPClient(
278-
mock.WithRequestMatchHandler(
279-
mock.PatchReposPullsByOwnerByRepoByPullNumber,
280-
expectRequestBody(t, map[string]interface{}{
281-
"title": "Updated Test PR Title",
282-
}).andThen(
283-
mockResponse(t, http.StatusOK, mockUpdatedPR),
284-
),
285266
),
286267
mock.WithRequestMatch(
287268
mock.GetReposPullsByOwnerByRepoByPullNumber,
288-
mockUpdatedPR,
289-
>>>>>>> d5e1f48 (Add updating draft state to `update_pull_request` tool (#774))
269+
mockPRWithReviewers,
290270
),
291271
),
292272
requestArgs: map[string]interface{}{
293273
"owner": "owner",
294274
"repo": "repo",
295275
"pullNumber": float64(42),
296-
<<<<<<< HEAD
297276
"reviewers": []interface{}{"reviewer1", "reviewer2"},
298277
},
299278
expectError: false,
300279
expectedPR: mockPRWithReviewers,
301280
},
302281
{
303-
name: "no update parameters provided",
282+
name: "successful PR update (title only)",
304283
mockedClient: mock.NewMockedHTTPClient(
305-
// Mock a response for the GET PR request in case of no updates
284+
mock.WithRequestMatchHandler(
285+
mock.PatchReposPullsByOwnerByRepoByPullNumber,
286+
expectRequestBody(t, map[string]interface{}{
287+
"title": "Updated Test PR Title",
288+
}).andThen(
289+
mockResponse(t, http.StatusOK, mockUpdatedPR),
290+
),
291+
),
306292
mock.WithRequestMatch(
307293
mock.GetReposPullsByOwnerByRepoByPullNumber,
308-
mockNoUpdatePR,
294+
mockUpdatedPR,
309295
),
310296
),
311-
=======
297+
requestArgs: map[string]interface{}{
298+
"owner": "owner",
299+
"repo": "repo",
300+
"pullNumber": float64(42),
312301
"title": "Updated Test PR Title",
313302
},
314303
expectError: false,
@@ -317,7 +306,6 @@ func Test_UpdatePullRequest(t *testing.T) {
317306
{
318307
name: "no update parameters provided",
319308
mockedClient: mock.NewMockedHTTPClient(), // No API call expected
320-
>>>>>>> d5e1f48 (Add updating draft state to `update_pull_request` tool (#774))
321309
requestArgs: map[string]interface{}{
322310
"owner": "owner",
323311
"repo": "repo",

0 commit comments

Comments
 (0)