github.com/google/go-github/v71@v71.0.0/github/repos_collaborators_test.go (about) 1 // Copyright 2013 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "testing" 14 15 "github.com/google/go-cmp/cmp" 16 ) 17 18 func TestRepositoriesService_ListCollaborators(t *testing.T) { 19 t.Parallel() 20 client, mux, _ := setup(t) 21 22 mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) { 23 testMethod(t, r, "GET") 24 testFormValues(t, r, values{"page": "2"}) 25 fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) 26 }) 27 28 opt := &ListCollaboratorsOptions{ 29 ListOptions: ListOptions{Page: 2}, 30 } 31 ctx := context.Background() 32 users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 33 if err != nil { 34 t.Errorf("Repositories.ListCollaborators returned error: %v", err) 35 } 36 37 want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}} 38 if !cmp.Equal(users, want) { 39 t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want) 40 } 41 42 const methodName = "ListCollaborators" 43 testBadOptions(t, methodName, func() (err error) { 44 _, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt) 45 return err 46 }) 47 48 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 49 got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 50 if got != nil { 51 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 52 } 53 return resp, err 54 }) 55 } 56 57 func TestRepositoriesService_ListCollaborators_withAffiliation(t *testing.T) { 58 t.Parallel() 59 client, mux, _ := setup(t) 60 61 mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) { 62 testMethod(t, r, "GET") 63 testFormValues(t, r, values{"affiliation": "all", "page": "2"}) 64 fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) 65 }) 66 67 opt := &ListCollaboratorsOptions{ 68 ListOptions: ListOptions{Page: 2}, 69 Affiliation: "all", 70 } 71 ctx := context.Background() 72 users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 73 if err != nil { 74 t.Errorf("Repositories.ListCollaborators returned error: %v", err) 75 } 76 77 want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}} 78 if !cmp.Equal(users, want) { 79 t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want) 80 } 81 82 const methodName = "ListCollaborators" 83 testBadOptions(t, methodName, func() (err error) { 84 _, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt) 85 return err 86 }) 87 88 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 89 got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 90 if got != nil { 91 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 92 } 93 return resp, err 94 }) 95 } 96 97 func TestRepositoriesService_ListCollaborators_withPermission(t *testing.T) { 98 t.Parallel() 99 client, mux, _ := setup(t) 100 101 mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) { 102 testMethod(t, r, "GET") 103 testFormValues(t, r, values{"permission": "pull", "page": "2"}) 104 fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) 105 }) 106 107 opt := &ListCollaboratorsOptions{ 108 ListOptions: ListOptions{Page: 2}, 109 Permission: "pull", 110 } 111 ctx := context.Background() 112 users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 113 if err != nil { 114 t.Errorf("Repositories.ListCollaborators returned error: %v", err) 115 } 116 117 want := []*User{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}} 118 if !cmp.Equal(users, want) { 119 t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want) 120 } 121 122 const methodName = "ListCollaborators" 123 testBadOptions(t, methodName, func() (err error) { 124 _, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt) 125 return err 126 }) 127 128 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 129 got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) 130 if got != nil { 131 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 132 } 133 return resp, err 134 }) 135 } 136 137 func TestRepositoriesService_ListCollaborators_invalidOwner(t *testing.T) { 138 t.Parallel() 139 client, _, _ := setup(t) 140 141 ctx := context.Background() 142 _, _, err := client.Repositories.ListCollaborators(ctx, "%", "%", nil) 143 testURLParseError(t, err) 144 } 145 146 func TestRepositoriesService_IsCollaborator_True(t *testing.T) { 147 t.Parallel() 148 client, mux, _ := setup(t) 149 150 mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { 151 testMethod(t, r, "GET") 152 w.WriteHeader(http.StatusNoContent) 153 }) 154 155 ctx := context.Background() 156 isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") 157 if err != nil { 158 t.Errorf("Repositories.IsCollaborator returned error: %v", err) 159 } 160 161 if !isCollab { 162 t.Errorf("Repositories.IsCollaborator returned false, want true") 163 } 164 165 const methodName = "IsCollaborator" 166 testBadOptions(t, methodName, func() (err error) { 167 _, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n") 168 return err 169 }) 170 171 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 172 got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") 173 if got { 174 t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) 175 } 176 return resp, err 177 }) 178 } 179 180 func TestRepositoriesService_IsCollaborator_False(t *testing.T) { 181 t.Parallel() 182 client, mux, _ := setup(t) 183 184 mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { 185 testMethod(t, r, "GET") 186 w.WriteHeader(http.StatusNotFound) 187 }) 188 189 ctx := context.Background() 190 isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") 191 if err != nil { 192 t.Errorf("Repositories.IsCollaborator returned error: %v", err) 193 } 194 195 if isCollab { 196 t.Errorf("Repositories.IsCollaborator returned true, want false") 197 } 198 199 const methodName = "IsCollaborator" 200 testBadOptions(t, methodName, func() (err error) { 201 _, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n") 202 return err 203 }) 204 205 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 206 got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") 207 if got { 208 t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) 209 } 210 return resp, err 211 }) 212 } 213 214 func TestRepositoriesService_IsCollaborator_invalidUser(t *testing.T) { 215 t.Parallel() 216 client, _, _ := setup(t) 217 218 ctx := context.Background() 219 _, _, err := client.Repositories.IsCollaborator(ctx, "%", "%", "%") 220 testURLParseError(t, err) 221 } 222 223 func TestRepositoryService_GetPermissionLevel(t *testing.T) { 224 t.Parallel() 225 client, mux, _ := setup(t) 226 227 mux.HandleFunc("/repos/o/r/collaborators/u/permission", func(w http.ResponseWriter, r *http.Request) { 228 testMethod(t, r, "GET") 229 fmt.Fprintf(w, `{"permission":"admin","user":{"login":"u"}}`) 230 }) 231 232 ctx := context.Background() 233 rpl, _, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u") 234 if err != nil { 235 t.Errorf("Repositories.GetPermissionLevel returned error: %v", err) 236 } 237 238 want := &RepositoryPermissionLevel{ 239 Permission: Ptr("admin"), 240 User: &User{ 241 Login: Ptr("u"), 242 }, 243 } 244 245 if !cmp.Equal(rpl, want) { 246 t.Errorf("Repositories.GetPermissionLevel returned %+v, want %+v", rpl, want) 247 } 248 249 const methodName = "GetPermissionLevel" 250 testBadOptions(t, methodName, func() (err error) { 251 _, _, err = client.Repositories.GetPermissionLevel(ctx, "\n", "\n", "\n") 252 return err 253 }) 254 255 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 256 got, resp, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u") 257 if got != nil { 258 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 259 } 260 return resp, err 261 }) 262 } 263 264 func TestRepositoriesService_AddCollaborator(t *testing.T) { 265 t.Parallel() 266 client, mux, _ := setup(t) 267 268 opt := &RepositoryAddCollaboratorOptions{Permission: "admin"} 269 mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { 270 v := new(RepositoryAddCollaboratorOptions) 271 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 272 testMethod(t, r, "PUT") 273 if !cmp.Equal(v, opt) { 274 t.Errorf("Request body = %+v, want %+v", v, opt) 275 } 276 w.WriteHeader(http.StatusOK) 277 assertWrite(t, w, []byte(`{"permissions": "write","url": "https://api.github.com/user/repository_invitations/1296269","html_url": "https://github.com/octocat/Hello-World/invitations","id":1,"permissions":"write","repository":{"url":"s","name":"r","id":1},"invitee":{"login":"u"},"inviter":{"login":"o"}}`)) 278 }) 279 ctx := context.Background() 280 collaboratorInvitation, _, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt) 281 if err != nil { 282 t.Errorf("Repositories.AddCollaborator returned error: %v", err) 283 } 284 want := &CollaboratorInvitation{ 285 ID: Ptr(int64(1)), 286 Repo: &Repository{ 287 ID: Ptr(int64(1)), 288 URL: Ptr("s"), 289 Name: Ptr("r"), 290 }, 291 Invitee: &User{ 292 Login: Ptr("u"), 293 }, 294 Inviter: &User{ 295 Login: Ptr("o"), 296 }, 297 Permissions: Ptr("write"), 298 URL: Ptr("https://api.github.com/user/repository_invitations/1296269"), 299 HTMLURL: Ptr("https://github.com/octocat/Hello-World/invitations"), 300 } 301 302 if !cmp.Equal(collaboratorInvitation, want) { 303 t.Errorf("AddCollaborator returned %+v, want %+v", collaboratorInvitation, want) 304 } 305 306 const methodName = "AddCollaborator" 307 testBadOptions(t, methodName, func() (err error) { 308 _, _, err = client.Repositories.AddCollaborator(ctx, "\n", "\n", "\n", opt) 309 return err 310 }) 311 312 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 313 got, resp, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt) 314 if got != nil { 315 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 316 } 317 return resp, err 318 }) 319 } 320 321 func TestRepositoriesService_AddCollaborator_invalidUser(t *testing.T) { 322 t.Parallel() 323 client, _, _ := setup(t) 324 325 ctx := context.Background() 326 _, _, err := client.Repositories.AddCollaborator(ctx, "%", "%", "%", nil) 327 testURLParseError(t, err) 328 } 329 330 func TestRepositoriesService_RemoveCollaborator(t *testing.T) { 331 t.Parallel() 332 client, mux, _ := setup(t) 333 334 mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { 335 testMethod(t, r, "DELETE") 336 w.WriteHeader(http.StatusNoContent) 337 }) 338 339 ctx := context.Background() 340 _, err := client.Repositories.RemoveCollaborator(ctx, "o", "r", "u") 341 if err != nil { 342 t.Errorf("Repositories.RemoveCollaborator returned error: %v", err) 343 } 344 345 const methodName = "RemoveCollaborator" 346 testBadOptions(t, methodName, func() (err error) { 347 _, err = client.Repositories.RemoveCollaborator(ctx, "\n", "\n", "\n") 348 return err 349 }) 350 351 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 352 return client.Repositories.RemoveCollaborator(ctx, "o", "r", "u") 353 }) 354 } 355 356 func TestRepositoriesService_RemoveCollaborator_invalidUser(t *testing.T) { 357 t.Parallel() 358 client, _, _ := setup(t) 359 360 ctx := context.Background() 361 _, err := client.Repositories.RemoveCollaborator(ctx, "%", "%", "%") 362 testURLParseError(t, err) 363 } 364 365 func TestRepositoryAddCollaboratorOptions_Marshal(t *testing.T) { 366 t.Parallel() 367 testJSONMarshal(t, &RepositoryAddCollaboratorOptions{}, "{}") 368 369 r := &RepositoryAddCollaboratorOptions{ 370 Permission: "permission", 371 } 372 373 want := `{ 374 "permission": "permission" 375 }` 376 377 testJSONMarshal(t, r, want) 378 } 379 380 func TestRepositoryPermissionLevel_Marshal(t *testing.T) { 381 t.Parallel() 382 testJSONMarshal(t, &RepositoryPermissionLevel{}, "{}") 383 384 r := &RepositoryPermissionLevel{ 385 Permission: Ptr("permission"), 386 User: &User{ 387 Login: Ptr("l"), 388 ID: Ptr(int64(1)), 389 URL: Ptr("u"), 390 AvatarURL: Ptr("a"), 391 GravatarID: Ptr("g"), 392 Name: Ptr("n"), 393 Company: Ptr("c"), 394 Blog: Ptr("b"), 395 Location: Ptr("l"), 396 Email: Ptr("e"), 397 Hireable: Ptr(true), 398 Bio: Ptr("b"), 399 TwitterUsername: Ptr("t"), 400 PublicRepos: Ptr(1), 401 Followers: Ptr(1), 402 Following: Ptr(1), 403 CreatedAt: &Timestamp{referenceTime}, 404 SuspendedAt: &Timestamp{referenceTime}, 405 }, 406 } 407 408 want := `{ 409 "permission": "permission", 410 "user": { 411 "login": "l", 412 "id": 1, 413 "avatar_url": "a", 414 "gravatar_id": "g", 415 "name": "n", 416 "company": "c", 417 "blog": "b", 418 "location": "l", 419 "email": "e", 420 "hireable": true, 421 "bio": "b", 422 "twitter_username": "t", 423 "public_repos": 1, 424 "followers": 1, 425 "following": 1, 426 "created_at": ` + referenceTimeStr + `, 427 "suspended_at": ` + referenceTimeStr + `, 428 "url": "u" 429 } 430 }` 431 432 testJSONMarshal(t, r, want) 433 } 434 435 func TestCollaboratorInvitation_Marshal(t *testing.T) { 436 t.Parallel() 437 testJSONMarshal(t, &CollaboratorInvitation{}, "{}") 438 439 r := &CollaboratorInvitation{ 440 ID: Ptr(int64(1)), 441 Repo: &Repository{ 442 443 ID: Ptr(int64(1)), 444 URL: Ptr("url"), 445 Name: Ptr("n"), 446 }, 447 Invitee: &User{ 448 Login: Ptr("l"), 449 ID: Ptr(int64(1)), 450 URL: Ptr("u"), 451 AvatarURL: Ptr("a"), 452 GravatarID: Ptr("g"), 453 Name: Ptr("n"), 454 Company: Ptr("c"), 455 Blog: Ptr("b"), 456 Location: Ptr("l"), 457 Email: Ptr("e"), 458 Hireable: Ptr(true), 459 Bio: Ptr("b"), 460 TwitterUsername: Ptr("t"), 461 PublicRepos: Ptr(1), 462 Followers: Ptr(1), 463 Following: Ptr(1), 464 CreatedAt: &Timestamp{referenceTime}, 465 SuspendedAt: &Timestamp{referenceTime}, 466 }, 467 Inviter: &User{ 468 Login: Ptr("l"), 469 ID: Ptr(int64(1)), 470 URL: Ptr("u"), 471 AvatarURL: Ptr("a"), 472 GravatarID: Ptr("g"), 473 Name: Ptr("n"), 474 Company: Ptr("c"), 475 Blog: Ptr("b"), 476 Location: Ptr("l"), 477 Email: Ptr("e"), 478 Hireable: Ptr(true), 479 Bio: Ptr("b"), 480 TwitterUsername: Ptr("t"), 481 PublicRepos: Ptr(1), 482 Followers: Ptr(1), 483 Following: Ptr(1), 484 CreatedAt: &Timestamp{referenceTime}, 485 SuspendedAt: &Timestamp{referenceTime}, 486 }, 487 Permissions: Ptr("per"), 488 CreatedAt: &Timestamp{referenceTime}, 489 URL: Ptr("url"), 490 HTMLURL: Ptr("hurl"), 491 } 492 493 want := `{ 494 "id": 1, 495 "repository": { 496 "id": 1, 497 "name": "n", 498 "url": "url" 499 }, 500 "invitee": { 501 "login": "l", 502 "id": 1, 503 "avatar_url": "a", 504 "gravatar_id": "g", 505 "name": "n", 506 "company": "c", 507 "blog": "b", 508 "location": "l", 509 "email": "e", 510 "hireable": true, 511 "bio": "b", 512 "twitter_username": "t", 513 "public_repos": 1, 514 "followers": 1, 515 "following": 1, 516 "created_at": ` + referenceTimeStr + `, 517 "suspended_at": ` + referenceTimeStr + `, 518 "url": "u" 519 }, 520 "inviter": { 521 "login": "l", 522 "id": 1, 523 "avatar_url": "a", 524 "gravatar_id": "g", 525 "name": "n", 526 "company": "c", 527 "blog": "b", 528 "location": "l", 529 "email": "e", 530 "hireable": true, 531 "bio": "b", 532 "twitter_username": "t", 533 "public_repos": 1, 534 "followers": 1, 535 "following": 1, 536 "created_at": ` + referenceTimeStr + `, 537 "suspended_at": ` + referenceTimeStr + `, 538 "url": "u" 539 }, 540 "permissions": "per", 541 "created_at": ` + referenceTimeStr + `, 542 "url": "url", 543 "html_url": "hurl" 544 }` 545 546 testJSONMarshal(t, r, want) 547 }