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: ®exp, 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: ®exp, 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: ®exp, 407 }, 408 }) 409 assert.Error(t, err) 410 }