github.com/argoproj/argo-cd/v2@v2.10.9/applicationset/services/pull_request/bitbucket_cloud_test.go (about)

     1  package pull_request
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  
    13  	"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
    14  )
    15  
    16  func defaultHandlerCloud(t *testing.T) func(http.ResponseWriter, *http.Request) {
    17  	return func(w http.ResponseWriter, r *http.Request) {
    18  		w.Header().Set("Content-Type", "application/json")
    19  		var err error
    20  		switch r.RequestURI {
    21  		case "/repositories/OWNER/REPO/pullrequests/":
    22  			_, err = io.WriteString(w, `{
    23  					"size": 1,
    24  					"pagelen": 10,
    25  					"page": 1,
    26  					"values": [
    27  						{
    28  							"id": 101,
    29  							"source": {
    30  								"branch": {
    31  									"name": "feature/foo-bar"
    32  								},
    33  								"commit": {
    34  									"type": "commit",
    35  									"hash": "1a8dd249c04a"
    36  								}
    37  							}
    38  						}
    39  					]
    40  				}`)
    41  		default:
    42  			t.Fail()
    43  		}
    44  		if err != nil {
    45  			t.Fail()
    46  		}
    47  	}
    48  }
    49  
    50  func TestParseUrlEmptyUrl(t *testing.T) {
    51  	url, err := parseUrl("")
    52  	bitbucketUrl, _ := url.Parse("https://api.bitbucket.org/2.0")
    53  
    54  	assert.NoError(t, err)
    55  	assert.Equal(t, bitbucketUrl, url)
    56  }
    57  
    58  func TestInvalidBaseUrlBasicAuthCloud(t *testing.T) {
    59  	_, err := NewBitbucketCloudServiceBasicAuth("http:// example.org", "user", "password", "OWNER", "REPO")
    60  
    61  	assert.Error(t, err)
    62  }
    63  
    64  func TestInvalidBaseUrlBearerTokenCloud(t *testing.T) {
    65  	_, err := NewBitbucketCloudServiceBearerToken("http:// example.org", "TOKEN", "OWNER", "REPO")
    66  
    67  	assert.Error(t, err)
    68  }
    69  
    70  func TestInvalidBaseUrlNoAuthCloud(t *testing.T) {
    71  	_, err := NewBitbucketCloudServiceNoAuth("http:// example.org", "OWNER", "REPO")
    72  
    73  	assert.Error(t, err)
    74  }
    75  
    76  func TestListPullRequestBearerTokenCloud(t *testing.T) {
    77  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    78  		assert.Equal(t, "Bearer TOKEN", r.Header.Get("Authorization"))
    79  		defaultHandlerCloud(t)(w, r)
    80  	}))
    81  	defer ts.Close()
    82  	svc, err := NewBitbucketCloudServiceBearerToken(ts.URL, "TOKEN", "OWNER", "REPO")
    83  	assert.NoError(t, err)
    84  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
    85  	assert.NoError(t, err)
    86  	assert.Equal(t, 1, len(pullRequests))
    87  	assert.Equal(t, 101, pullRequests[0].Number)
    88  	assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch)
    89  	assert.Equal(t, "1a8dd249c04a", pullRequests[0].HeadSHA)
    90  }
    91  
    92  func TestListPullRequestNoAuthCloud(t *testing.T) {
    93  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    94  		assert.Empty(t, r.Header.Get("Authorization"))
    95  		defaultHandlerCloud(t)(w, r)
    96  	}))
    97  	defer ts.Close()
    98  	svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
    99  	assert.NoError(t, err)
   100  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   101  	assert.NoError(t, err)
   102  	assert.Equal(t, 1, len(pullRequests))
   103  	assert.Equal(t, 101, pullRequests[0].Number)
   104  	assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch)
   105  	assert.Equal(t, "1a8dd249c04a", pullRequests[0].HeadSHA)
   106  }
   107  
   108  func TestListPullRequestBasicAuthCloud(t *testing.T) {
   109  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   110  		assert.Equal(t, "Basic dXNlcjpwYXNzd29yZA==", r.Header.Get("Authorization"))
   111  		defaultHandlerCloud(t)(w, r)
   112  	}))
   113  	defer ts.Close()
   114  	svc, err := NewBitbucketCloudServiceBasicAuth(ts.URL, "user", "password", "OWNER", "REPO")
   115  	assert.NoError(t, err)
   116  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   117  	assert.NoError(t, err)
   118  	assert.Equal(t, 1, len(pullRequests))
   119  	assert.Equal(t, 101, pullRequests[0].Number)
   120  	assert.Equal(t, "feature/foo-bar", pullRequests[0].Branch)
   121  	assert.Equal(t, "1a8dd249c04a", pullRequests[0].HeadSHA)
   122  }
   123  
   124  func TestListPullRequestPaginationCloud(t *testing.T) {
   125  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   126  		w.Header().Set("Content-Type", "application/json")
   127  		var err error
   128  		switch r.RequestURI {
   129  		case "/repositories/OWNER/REPO/pullrequests/":
   130  			_, err = io.WriteString(w, fmt.Sprintf(`{
   131  				"size": 2,
   132  				"pagelen": 1,
   133  				"page": 1,
   134  				"next": "http://%s/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=2",
   135  				"values": [
   136  					{
   137  						"id": 101,
   138  						"source": {
   139  							"branch": {
   140  								"name": "feature-101"
   141  							},
   142  							"commit": {
   143  								"type": "commit",
   144  								"hash": "1a8dd249c04a"
   145  							}
   146  						}
   147  					},
   148  					{
   149  						"id": 102,
   150  						"source": {
   151  							"branch": {
   152  								"name": "feature-102"
   153  							},
   154  							"commit": {
   155  								"type": "commit",
   156  								"hash": "4cf807e67a6d"
   157  							}
   158  						}
   159  					}
   160  				]
   161  			}`, r.Host))
   162  		case "/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=2":
   163  			_, err = io.WriteString(w, fmt.Sprintf(`{
   164  				"size": 2,
   165  				"pagelen": 1,
   166  				"page": 2,
   167  				"previous": "http://%s/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=1",
   168  				"values": [
   169  					{
   170  						"id": 103,
   171  						"source": {
   172  							"branch": {
   173  								"name": "feature-103"
   174  							},
   175  							"commit": {
   176  								"type": "commit",
   177  								"hash": "6344d9623e3b"
   178  							}
   179  						}
   180  					}
   181  				]
   182  			}`, r.Host))
   183  		default:
   184  			t.Fail()
   185  		}
   186  		if err != nil {
   187  			t.Fail()
   188  		}
   189  	}))
   190  	defer ts.Close()
   191  	svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   192  	assert.NoError(t, err)
   193  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   194  	assert.NoError(t, err)
   195  	assert.Equal(t, 3, len(pullRequests))
   196  	assert.Equal(t, PullRequest{
   197  		Number:  101,
   198  		Branch:  "feature-101",
   199  		HeadSHA: "1a8dd249c04a",
   200  	}, *pullRequests[0])
   201  	assert.Equal(t, PullRequest{
   202  		Number:  102,
   203  		Branch:  "feature-102",
   204  		HeadSHA: "4cf807e67a6d",
   205  	}, *pullRequests[1])
   206  	assert.Equal(t, PullRequest{
   207  		Number:  103,
   208  		Branch:  "feature-103",
   209  		HeadSHA: "6344d9623e3b",
   210  	}, *pullRequests[2])
   211  }
   212  
   213  func TestListResponseErrorCloud(t *testing.T) {
   214  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   215  		w.WriteHeader(500)
   216  	}))
   217  	defer ts.Close()
   218  	svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   219  	_, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   220  	assert.Error(t, err)
   221  }
   222  
   223  func TestListResponseMalformedCloud(t *testing.T) {
   224  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   225  		w.Header().Set("Content-Type", "application/json")
   226  		switch r.RequestURI {
   227  		case "/repositories/OWNER/REPO/pullrequests/":
   228  			_, err := io.WriteString(w, `[{
   229  				"size": 1,
   230  				"pagelen": 10,
   231  				"page": 1,
   232  				"values": [{ "id": 101 }]
   233  			}]`)
   234  			if err != nil {
   235  				t.Fail()
   236  			}
   237  		default:
   238  			t.Fail()
   239  		}
   240  	}))
   241  	defer ts.Close()
   242  	svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   243  	_, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   244  	assert.Error(t, err)
   245  }
   246  
   247  func TestListResponseMalformedValuesCloud(t *testing.T) {
   248  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   249  		w.Header().Set("Content-Type", "application/json")
   250  		switch r.RequestURI {
   251  		case "/repositories/OWNER/REPO/pullrequests/":
   252  			_, err := io.WriteString(w, `{
   253  				"size": 1,
   254  				"pagelen": 10,
   255  				"page": 1,
   256  				"values": { "id": 101 }
   257  			}`)
   258  			if err != nil {
   259  				t.Fail()
   260  			}
   261  		default:
   262  			t.Fail()
   263  		}
   264  	}))
   265  	defer ts.Close()
   266  	svc, _ := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   267  	_, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   268  	assert.Error(t, err)
   269  }
   270  
   271  func TestListResponseEmptyCloud(t *testing.T) {
   272  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   273  		w.Header().Set("Content-Type", "application/json")
   274  		switch r.RequestURI {
   275  		case "/repositories/OWNER/REPO/pullrequests/":
   276  			_, err := io.WriteString(w, `{
   277  				"size": 1,
   278  				"pagelen": 10,
   279  				"page": 1,
   280  				"values": []
   281  			}`)
   282  			if err != nil {
   283  				t.Fail()
   284  			}
   285  		default:
   286  			t.Fail()
   287  		}
   288  	}))
   289  	defer ts.Close()
   290  	svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   291  	assert.NoError(t, err)
   292  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{})
   293  	assert.NoError(t, err)
   294  	assert.Empty(t, pullRequests)
   295  }
   296  
   297  func TestListPullRequestBranchMatchCloud(t *testing.T) {
   298  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   299  		w.Header().Set("Content-Type", "application/json")
   300  		var err error
   301  		switch r.RequestURI {
   302  		case "/repositories/OWNER/REPO/pullrequests/":
   303  			_, err = io.WriteString(w, fmt.Sprintf(`{
   304  				"size": 2,
   305  				"pagelen": 1,
   306  				"page": 1,
   307  				"next": "http://%s/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=2",
   308  				"values": [
   309  					{
   310  						"id": 101,
   311  						"source": {
   312  							"branch": {
   313  								"name": "feature-101"
   314  							},
   315  							"commit": {
   316  								"type": "commit",
   317  								"hash": "1a8dd249c04a"
   318  							}
   319  						}
   320  					},
   321  					{
   322  						"id": 200,
   323  						"source": {
   324  							"branch": {
   325  								"name": "feature-200"
   326  							},
   327  							"commit": {
   328  								"type": "commit",
   329  								"hash": "4cf807e67a6d"
   330  							}
   331  						}
   332  					}
   333  				]
   334  			}`, r.Host))
   335  		case "/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=2":
   336  			_, err = io.WriteString(w, fmt.Sprintf(`{
   337  				"size": 2,
   338  				"pagelen": 1,
   339  				"page": 2,
   340  				"previous": "http://%s/repositories/OWNER/REPO/pullrequests/?pagelen=1&page=1",
   341  				"values": [
   342  					{
   343  						"id": 102,
   344  						"source": {
   345  							"branch": {
   346  								"name": "feature-102"
   347  							},
   348  							"commit": {
   349  								"type": "commit",
   350  								"hash": "6344d9623e3b"
   351  							}
   352  						}
   353  					}
   354  				]
   355  			}`, r.Host))
   356  		default:
   357  			t.Fail()
   358  		}
   359  		if err != nil {
   360  			t.Fail()
   361  		}
   362  	}))
   363  	defer ts.Close()
   364  	regexp := `feature-1[\d]{2}`
   365  	svc, err := NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   366  	assert.NoError(t, err)
   367  	pullRequests, err := ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{
   368  		{
   369  			BranchMatch: &regexp,
   370  		},
   371  	})
   372  	assert.NoError(t, err)
   373  	assert.Equal(t, 2, len(pullRequests))
   374  	assert.Equal(t, PullRequest{
   375  		Number:  101,
   376  		Branch:  "feature-101",
   377  		HeadSHA: "1a8dd249c04a",
   378  	}, *pullRequests[0])
   379  	assert.Equal(t, PullRequest{
   380  		Number:  102,
   381  		Branch:  "feature-102",
   382  		HeadSHA: "6344d9623e3b",
   383  	}, *pullRequests[1])
   384  
   385  	regexp = `.*2$`
   386  	svc, err = NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   387  	assert.NoError(t, err)
   388  	pullRequests, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{
   389  		{
   390  			BranchMatch: &regexp,
   391  		},
   392  	})
   393  	assert.NoError(t, err)
   394  	assert.Equal(t, 1, len(pullRequests))
   395  	assert.Equal(t, PullRequest{
   396  		Number:  102,
   397  		Branch:  "feature-102",
   398  		HeadSHA: "6344d9623e3b",
   399  	}, *pullRequests[0])
   400  
   401  	regexp = `[\d{2}`
   402  	svc, err = NewBitbucketCloudServiceNoAuth(ts.URL, "OWNER", "REPO")
   403  	assert.NoError(t, err)
   404  	_, err = ListPullRequests(context.Background(), svc, []v1alpha1.PullRequestGeneratorFilter{
   405  		{
   406  			BranchMatch: &regexp,
   407  		},
   408  	})
   409  	assert.Error(t, err)
   410  }