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  }