Skip to content

Commit 35e5c75

Browse files
authored
Merge pull request cli#3701 from mercimat/fix-pr-team-reviewrequests
fix adding/removing team reviewers with `gh pr edit`
2 parents ece536a + 761fa94 commit 35e5c75

File tree

3 files changed

+111
-15
lines changed

3 files changed

+111
-15
lines changed

api/queries_pr.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,17 +151,27 @@ type PullRequestFile struct {
151151
type ReviewRequests struct {
152152
Nodes []struct {
153153
RequestedReviewer struct {
154-
TypeName string `json:"__typename"`
155-
Login string `json:"login"`
156-
Name string `json:"name"`
154+
TypeName string `json:"__typename"`
155+
Login string `json:"login"`
156+
Name string `json:"name"`
157+
Slug string `json:"slug"`
158+
Organization struct {
159+
Login string `json:"login"`
160+
}
157161
}
158162
}
159163
}
160164

165+
const teamTypeName = "Team"
166+
161167
func (r ReviewRequests) Logins() []string {
162168
logins := make([]string, len(r.Nodes))
163169
for i, a := range r.Nodes {
164-
logins[i] = a.RequestedReviewer.Login
170+
if a.RequestedReviewer.TypeName == teamTypeName {
171+
logins[i] = fmt.Sprintf("%s/%s", a.RequestedReviewer.Organization.Login, a.RequestedReviewer.Slug)
172+
} else {
173+
logins[i] = a.RequestedReviewer.Login
174+
}
165175
}
166176
return logins
167177
}
@@ -393,8 +403,8 @@ func PullRequestStatus(client *Client, repo ghrepo.Interface, options StatusOpti
393403
queryPrefix := `
394404
query PullRequestStatus($owner: String!, $repo: String!, $headRefName: String!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
395405
repository(owner: $owner, name: $repo) {
396-
defaultBranchRef {
397-
name
406+
defaultBranchRef {
407+
name
398408
}
399409
pullRequests(headRefName: $headRefName, first: $per_page, orderBy: { field: CREATED_AT, direction: DESC }) {
400410
totalCount
@@ -410,8 +420,8 @@ func PullRequestStatus(client *Client, repo ghrepo.Interface, options StatusOpti
410420
queryPrefix = `
411421
query PullRequestStatus($owner: String!, $repo: String!, $number: Int!, $viewerQuery: String!, $reviewerQuery: String!, $per_page: Int = 10) {
412422
repository(owner: $owner, name: $repo) {
413-
defaultBranchRef {
414-
name
423+
defaultBranchRef {
424+
name
415425
}
416426
pullRequest(number: $number) {
417427
...prWithReviews

api/queries_pr_test.go

Lines changed: 88 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package api
22

33
import (
4-
"reflect"
4+
"encoding/json"
55
"testing"
66

77
"github.com/MakeNowJust/heredoc"
88
"github.com/cli/cli/internal/ghrepo"
99
"github.com/cli/cli/pkg/httpmock"
10+
"github.com/stretchr/testify/assert"
1011
)
1112

1213
func TestBranchDeleteRemote(t *testing.T) {
@@ -148,13 +149,94 @@ func Test_determinePullRequestFeatures(t *testing.T) {
148149
}
149150

150151
gotPrFeatures, err := determinePullRequestFeatures(httpClient, tt.hostname)
151-
if (err != nil) != tt.wantErr {
152-
t.Errorf("determinePullRequestFeatures() error = %v, wantErr %v", err, tt.wantErr)
152+
if tt.wantErr {
153+
assert.Error(t, err)
153154
return
155+
} else {
156+
assert.NoError(t, err)
154157
}
155-
if !reflect.DeepEqual(gotPrFeatures, tt.wantPrFeatures) {
156-
t.Errorf("determinePullRequestFeatures() = %v, want %v", gotPrFeatures, tt.wantPrFeatures)
157-
}
158+
assert.Equal(t, tt.wantPrFeatures, gotPrFeatures)
159+
})
160+
}
161+
}
162+
163+
func Test_Logins(t *testing.T) {
164+
rr := ReviewRequests{}
165+
var tests = []struct {
166+
name string
167+
requestedReviews string
168+
want []string
169+
}{
170+
{
171+
name: "no requested reviewers",
172+
requestedReviews: `{"nodes": []}`,
173+
want: []string{},
174+
},
175+
{
176+
name: "user",
177+
requestedReviews: `{"nodes": [
178+
{
179+
"requestedreviewer": {
180+
"__typename": "User", "login": "testuser"
181+
}
182+
}
183+
]}`,
184+
want: []string{"testuser"},
185+
},
186+
{
187+
name: "team",
188+
requestedReviews: `{"nodes": [
189+
{
190+
"requestedreviewer": {
191+
"__typename": "Team",
192+
"name": "Test Team",
193+
"slug": "test-team",
194+
"organization": {"login": "myorg"}
195+
}
196+
}
197+
]}`,
198+
want: []string{"myorg/test-team"},
199+
},
200+
{
201+
name: "multiple users and teams",
202+
requestedReviews: `{"nodes": [
203+
{
204+
"requestedreviewer": {
205+
"__typename": "User", "login": "user1"
206+
}
207+
},
208+
{
209+
"requestedreviewer": {
210+
"__typename": "User", "login": "user2"
211+
}
212+
},
213+
{
214+
"requestedreviewer": {
215+
"__typename": "Team",
216+
"name": "Test Team",
217+
"slug": "test-team",
218+
"organization": {"login": "myorg"}
219+
}
220+
},
221+
{
222+
"requestedreviewer": {
223+
"__typename": "Team",
224+
"name": "Dev Team",
225+
"slug": "dev-team",
226+
"organization": {"login": "myorg"}
227+
}
228+
}
229+
]}`,
230+
want: []string{"user1", "user2", "myorg/test-team", "myorg/dev-team"},
231+
},
232+
}
233+
234+
for _, tt := range tests {
235+
t.Run(tt.name, func(t *testing.T) {
236+
err := json.Unmarshal([]byte(tt.requestedReviews), &rr)
237+
assert.NoError(t, err, "Failed to unmarshal json string as ReviewRequests")
238+
logins := rr.Logins()
239+
assert.Equal(t, tt.want, logins)
158240
})
159241
}
160242
}

api/query_builder.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ var prReviewRequests = shortenQuery(`
4141
requestedReviewer {
4242
__typename,
4343
...on User{login},
44-
...on Team{name}
44+
...on Team{
45+
organization{login}
46+
name,
47+
slug
48+
}
4549
}
4650
}
4751
}

0 commit comments

Comments
 (0)