github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/api/queries_pr_test.go (about) 1 package api 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/MakeNowJust/heredoc" 8 "github.com/cli/cli/internal/ghrepo" 9 "github.com/cli/cli/pkg/httpmock" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestBranchDeleteRemote(t *testing.T) { 14 var tests = []struct { 15 name string 16 responseStatus int 17 responseBody string 18 expectError bool 19 }{ 20 { 21 name: "success", 22 responseStatus: 204, 23 responseBody: "", 24 expectError: false, 25 }, 26 { 27 name: "error", 28 responseStatus: 500, 29 responseBody: `{"message": "oh no"}`, 30 expectError: true, 31 }, 32 } 33 34 for _, tt := range tests { 35 t.Run(tt.name, func(t *testing.T) { 36 http := &httpmock.Registry{} 37 http.Register( 38 httpmock.REST("DELETE", "repos/OWNER/REPO/git/refs/heads/branch"), 39 httpmock.StatusStringResponse(tt.responseStatus, tt.responseBody)) 40 41 client := NewClient(ReplaceTripper(http)) 42 repo, _ := ghrepo.FromFullName("OWNER/REPO") 43 44 err := BranchDeleteRemote(client, repo, "branch") 45 if (err != nil) != tt.expectError { 46 t.Fatalf("unexpected result: %v", err) 47 } 48 }) 49 } 50 } 51 52 func Test_determinePullRequestFeatures(t *testing.T) { 53 tests := []struct { 54 name string 55 hostname string 56 queryResponse map[string]string 57 wantPrFeatures pullRequestFeature 58 wantErr bool 59 }{ 60 { 61 name: "github.com", 62 hostname: "github.com", 63 wantPrFeatures: pullRequestFeature{ 64 HasReviewDecision: true, 65 HasStatusCheckRollup: true, 66 HasBranchProtectionRule: true, 67 }, 68 wantErr: false, 69 }, 70 { 71 name: "GHE empty response", 72 hostname: "git.my.org", 73 queryResponse: map[string]string{ 74 `query PullRequest_fields\b`: `{"data": {}}`, 75 `query PullRequest_fields2\b`: `{"data": {}}`, 76 }, 77 wantPrFeatures: pullRequestFeature{ 78 HasReviewDecision: false, 79 HasStatusCheckRollup: false, 80 HasBranchProtectionRule: false, 81 }, 82 wantErr: false, 83 }, 84 { 85 name: "GHE has reviewDecision", 86 hostname: "git.my.org", 87 queryResponse: map[string]string{ 88 `query PullRequest_fields\b`: heredoc.Doc(` 89 { "data": { "PullRequest": { "fields": [ 90 {"name": "foo"}, 91 {"name": "reviewDecision"} 92 ] } } } 93 `), 94 `query PullRequest_fields2\b`: `{"data": {}}`, 95 }, 96 wantPrFeatures: pullRequestFeature{ 97 HasReviewDecision: true, 98 HasStatusCheckRollup: false, 99 HasBranchProtectionRule: false, 100 }, 101 wantErr: false, 102 }, 103 { 104 name: "GHE has statusCheckRollup", 105 hostname: "git.my.org", 106 queryResponse: map[string]string{ 107 `query PullRequest_fields\b`: heredoc.Doc(` 108 { "data": { "Commit": { "fields": [ 109 {"name": "foo"}, 110 {"name": "statusCheckRollup"} 111 ] } } } 112 `), 113 `query PullRequest_fields2\b`: `{"data": {}}`, 114 }, 115 wantPrFeatures: pullRequestFeature{ 116 HasReviewDecision: false, 117 HasStatusCheckRollup: true, 118 HasBranchProtectionRule: false, 119 }, 120 wantErr: false, 121 }, 122 { 123 name: "GHE has branchProtectionRule", 124 hostname: "git.my.org", 125 queryResponse: map[string]string{ 126 `query PullRequest_fields\b`: `{"data": {}}`, 127 `query PullRequest_fields2\b`: heredoc.Doc(` 128 { "data": { "Ref": { "fields": [ 129 {"name": "foo"}, 130 {"name": "branchProtectionRule"} 131 ] } } } 132 `), 133 }, 134 wantPrFeatures: pullRequestFeature{ 135 HasReviewDecision: false, 136 HasStatusCheckRollup: false, 137 HasBranchProtectionRule: true, 138 }, 139 wantErr: false, 140 }, 141 } 142 for _, tt := range tests { 143 t.Run(tt.name, func(t *testing.T) { 144 fakeHTTP := &httpmock.Registry{} 145 httpClient := NewHTTPClient(ReplaceTripper(fakeHTTP)) 146 147 for query, resp := range tt.queryResponse { 148 fakeHTTP.Register(httpmock.GraphQL(query), httpmock.StringResponse(resp)) 149 } 150 151 gotPrFeatures, err := determinePullRequestFeatures(httpClient, tt.hostname) 152 if tt.wantErr { 153 assert.Error(t, err) 154 return 155 } else { 156 assert.NoError(t, err) 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) 240 }) 241 } 242 }