github.com/google/go-github/v74@v74.0.0/github/teams_test.go (about) 1 // Copyright 2018 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 "bytes" 10 "context" 11 "encoding/json" 12 "fmt" 13 "io" 14 "net/http" 15 "testing" 16 17 "github.com/google/go-cmp/cmp" 18 ) 19 20 func TestTeamsService_ListTeams(t *testing.T) { 21 t.Parallel() 22 client, mux, _ := setup(t) 23 24 mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { 25 testMethod(t, r, "GET") 26 testFormValues(t, r, values{"page": "2"}) 27 fmt.Fprint(w, `[{"id":1}]`) 28 }) 29 30 opt := &ListOptions{Page: 2} 31 ctx := context.Background() 32 teams, _, err := client.Teams.ListTeams(ctx, "o", opt) 33 if err != nil { 34 t.Errorf("Teams.ListTeams returned error: %v", err) 35 } 36 37 want := []*Team{{ID: Ptr(int64(1))}} 38 if !cmp.Equal(teams, want) { 39 t.Errorf("Teams.ListTeams returned %+v, want %+v", teams, want) 40 } 41 42 const methodName = "ListTeams" 43 testBadOptions(t, methodName, func() (err error) { 44 _, _, err = client.Teams.ListTeams(ctx, "\n", opt) 45 return err 46 }) 47 48 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 49 got, resp, err := client.Teams.ListTeams(ctx, "o", 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 TestTeamsService_ListTeams_invalidOrg(t *testing.T) { 58 t.Parallel() 59 client, _, _ := setup(t) 60 61 ctx := context.Background() 62 _, _, err := client.Teams.ListTeams(ctx, "%", nil) 63 testURLParseError(t, err) 64 } 65 66 func TestTeamsService_GetTeamByID(t *testing.T) { 67 t.Parallel() 68 client, mux, _ := setup(t) 69 70 mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { 71 testMethod(t, r, "GET") 72 fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`) 73 }) 74 75 ctx := context.Background() 76 team, _, err := client.Teams.GetTeamByID(ctx, 1, 1) 77 if err != nil { 78 t.Errorf("Teams.GetTeamByID returned error: %v", err) 79 } 80 81 want := &Team{ID: Ptr(int64(1)), Name: Ptr("n"), Description: Ptr("d"), URL: Ptr("u"), Slug: Ptr("s"), Permission: Ptr("p"), LDAPDN: Ptr("cn=n,ou=groups,dc=example,dc=com")} 82 if !cmp.Equal(team, want) { 83 t.Errorf("Teams.GetTeamByID returned %+v, want %+v", team, want) 84 } 85 86 const methodName = "GetTeamByID" 87 testBadOptions(t, methodName, func() (err error) { 88 _, _, err = client.Teams.GetTeamByID(ctx, -1, -1) 89 return err 90 }) 91 92 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 93 got, resp, err := client.Teams.GetTeamByID(ctx, 1, 1) 94 if got != nil { 95 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 96 } 97 return resp, err 98 }) 99 } 100 101 func TestTeamsService_GetTeamByID_notFound(t *testing.T) { 102 t.Parallel() 103 client, mux, _ := setup(t) 104 105 mux.HandleFunc("/organizations/1/team/2", func(w http.ResponseWriter, r *http.Request) { 106 testMethod(t, r, "GET") 107 w.WriteHeader(http.StatusNotFound) 108 }) 109 110 ctx := context.Background() 111 team, resp, err := client.Teams.GetTeamByID(ctx, 1, 2) 112 if err == nil { 113 t.Error("Expected HTTP 404 response") 114 } 115 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 116 t.Errorf("Teams.GetTeamByID returned status %d, want %d", got, want) 117 } 118 if team != nil { 119 t.Errorf("Teams.GetTeamByID returned %+v, want nil", team) 120 } 121 } 122 123 func TestTeamsService_GetTeamBySlug(t *testing.T) { 124 t.Parallel() 125 client, mux, _ := setup(t) 126 127 mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { 128 testMethod(t, r, "GET") 129 fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`) 130 }) 131 132 ctx := context.Background() 133 team, _, err := client.Teams.GetTeamBySlug(ctx, "o", "s") 134 if err != nil { 135 t.Errorf("Teams.GetTeamBySlug returned error: %v", err) 136 } 137 138 want := &Team{ID: Ptr(int64(1)), Name: Ptr("n"), Description: Ptr("d"), URL: Ptr("u"), Slug: Ptr("s"), Permission: Ptr("p"), LDAPDN: Ptr("cn=n,ou=groups,dc=example,dc=com")} 139 if !cmp.Equal(team, want) { 140 t.Errorf("Teams.GetTeamBySlug returned %+v, want %+v", team, want) 141 } 142 143 const methodName = "GetTeamBySlug" 144 testBadOptions(t, methodName, func() (err error) { 145 _, _, err = client.Teams.GetTeamBySlug(ctx, "\n", "\n") 146 return err 147 }) 148 149 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 150 got, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s") 151 if got != nil { 152 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 153 } 154 return resp, err 155 }) 156 } 157 158 func TestTeamsService_GetTeamBySlug_invalidOrg(t *testing.T) { 159 t.Parallel() 160 client, _, _ := setup(t) 161 162 ctx := context.Background() 163 _, _, err := client.Teams.GetTeamBySlug(ctx, "%", "s") 164 testURLParseError(t, err) 165 } 166 167 func TestTeamsService_GetTeamBySlug_notFound(t *testing.T) { 168 t.Parallel() 169 client, mux, _ := setup(t) 170 171 mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { 172 testMethod(t, r, "GET") 173 w.WriteHeader(http.StatusNotFound) 174 }) 175 176 ctx := context.Background() 177 team, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s") 178 if err == nil { 179 t.Error("Expected HTTP 404 response") 180 } 181 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 182 t.Errorf("Teams.GetTeamBySlug returned status %d, want %d", got, want) 183 } 184 if team != nil { 185 t.Errorf("Teams.GetTeamBySlug returned %+v, want nil", team) 186 } 187 } 188 189 func TestTeamsService_CreateTeam(t *testing.T) { 190 t.Parallel() 191 client, mux, _ := setup(t) 192 193 input := NewTeam{Name: "n", Privacy: Ptr("closed"), RepoNames: []string{"r"}} 194 195 mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { 196 v := new(NewTeam) 197 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 198 199 testMethod(t, r, "POST") 200 if !cmp.Equal(v, &input) { 201 t.Errorf("Request body = %+v, want %+v", v, input) 202 } 203 204 fmt.Fprint(w, `{"id":1}`) 205 }) 206 207 ctx := context.Background() 208 team, _, err := client.Teams.CreateTeam(ctx, "o", input) 209 if err != nil { 210 t.Errorf("Teams.CreateTeam returned error: %v", err) 211 } 212 213 want := &Team{ID: Ptr(int64(1))} 214 if !cmp.Equal(team, want) { 215 t.Errorf("Teams.CreateTeam returned %+v, want %+v", team, want) 216 } 217 218 const methodName = "CreateTeam" 219 testBadOptions(t, methodName, func() (err error) { 220 _, _, err = client.Teams.CreateTeam(ctx, "\n", input) 221 return err 222 }) 223 224 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 225 got, resp, err := client.Teams.CreateTeam(ctx, "o", input) 226 if got != nil { 227 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 228 } 229 return resp, err 230 }) 231 } 232 233 func TestTeamsService_CreateTeam_invalidOrg(t *testing.T) { 234 t.Parallel() 235 client, _, _ := setup(t) 236 237 ctx := context.Background() 238 _, _, err := client.Teams.CreateTeam(ctx, "%", NewTeam{}) 239 testURLParseError(t, err) 240 } 241 242 func TestTeamsService_EditTeamByID(t *testing.T) { 243 t.Parallel() 244 client, mux, _ := setup(t) 245 246 input := NewTeam{Name: "n", Privacy: Ptr("closed")} 247 248 mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { 249 v := new(NewTeam) 250 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 251 252 testMethod(t, r, "PATCH") 253 if !cmp.Equal(v, &input) { 254 t.Errorf("Request body = %+v, want %+v", v, input) 255 } 256 257 fmt.Fprint(w, `{"id":1}`) 258 }) 259 260 ctx := context.Background() 261 team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false) 262 if err != nil { 263 t.Errorf("Teams.EditTeamByID returned error: %v", err) 264 } 265 266 want := &Team{ID: Ptr(int64(1))} 267 if !cmp.Equal(team, want) { 268 t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want) 269 } 270 271 const methodName = "EditTeamByID" 272 testBadOptions(t, methodName, func() (err error) { 273 _, _, err = client.Teams.EditTeamByID(ctx, -1, -1, input, false) 274 return err 275 }) 276 277 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 278 got, resp, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false) 279 if got != nil { 280 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 281 } 282 return resp, err 283 }) 284 } 285 286 func TestTeamsService_EditTeamByID_RemoveParent(t *testing.T) { 287 t.Parallel() 288 client, mux, _ := setup(t) 289 290 input := NewTeam{Name: "n", NotificationSetting: Ptr("notifications_enabled"), Privacy: Ptr("closed")} 291 var body string 292 293 mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { 294 v := new(NewTeam) 295 buf, err := io.ReadAll(r.Body) 296 if err != nil { 297 t.Errorf("Unable to read body: %v", err) 298 } 299 body = string(buf) 300 assertNilError(t, json.NewDecoder(bytes.NewBuffer(buf)).Decode(v)) 301 302 testMethod(t, r, "PATCH") 303 if !cmp.Equal(v, &input) { 304 t.Errorf("Request body = %+v, want %+v", v, input) 305 } 306 307 fmt.Fprint(w, `{"id":1}`) 308 }) 309 310 ctx := context.Background() 311 team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, true) 312 if err != nil { 313 t.Errorf("Teams.EditTeamByID returned error: %v", err) 314 } 315 316 want := &Team{ID: Ptr(int64(1))} 317 if !cmp.Equal(team, want) { 318 t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want) 319 } 320 321 if want := `{"name":"n","parent_team_id":null,"notification_setting":"notifications_enabled","privacy":"closed"}` + "\n"; body != want { 322 t.Errorf("Teams.EditTeamByID body = %+v, want %+v", body, want) 323 } 324 } 325 326 func TestTeamsService_EditTeamBySlug(t *testing.T) { 327 t.Parallel() 328 client, mux, _ := setup(t) 329 330 input := NewTeam{Name: "n", Privacy: Ptr("closed")} 331 332 mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { 333 v := new(NewTeam) 334 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 335 336 testMethod(t, r, "PATCH") 337 if !cmp.Equal(v, &input) { 338 t.Errorf("Request body = %+v, want %+v", v, input) 339 } 340 341 fmt.Fprint(w, `{"id":1}`) 342 }) 343 344 ctx := context.Background() 345 team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false) 346 if err != nil { 347 t.Errorf("Teams.EditTeamBySlug returned error: %v", err) 348 } 349 350 want := &Team{ID: Ptr(int64(1))} 351 if !cmp.Equal(team, want) { 352 t.Errorf("Teams.EditTeamBySlug returned %+v, want %+v", team, want) 353 } 354 355 const methodName = "EditTeamBySlug" 356 testBadOptions(t, methodName, func() (err error) { 357 _, _, err = client.Teams.EditTeamBySlug(ctx, "\n", "\n", input, false) 358 return err 359 }) 360 361 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 362 got, resp, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false) 363 if got != nil { 364 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 365 } 366 return resp, err 367 }) 368 } 369 370 func TestTeamsService_EditTeamBySlug_RemoveParent(t *testing.T) { 371 t.Parallel() 372 client, mux, _ := setup(t) 373 374 input := NewTeam{Name: "n", NotificationSetting: Ptr("notifications_disabled"), Privacy: Ptr("closed")} 375 var body string 376 377 mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { 378 v := new(NewTeam) 379 buf, err := io.ReadAll(r.Body) 380 if err != nil { 381 t.Errorf("Unable to read body: %v", err) 382 } 383 body = string(buf) 384 assertNilError(t, json.NewDecoder(bytes.NewBuffer(buf)).Decode(v)) 385 386 testMethod(t, r, "PATCH") 387 if !cmp.Equal(v, &input) { 388 t.Errorf("Request body = %+v, want %+v", v, input) 389 } 390 391 fmt.Fprint(w, `{"id":1}`) 392 }) 393 394 ctx := context.Background() 395 team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, true) 396 if err != nil { 397 t.Errorf("Teams.EditTeam returned error: %v", err) 398 } 399 400 want := &Team{ID: Ptr(int64(1))} 401 if !cmp.Equal(team, want) { 402 t.Errorf("Teams.EditTeam returned %+v, want %+v", team, want) 403 } 404 405 if want := `{"name":"n","parent_team_id":null,"notification_setting":"notifications_disabled","privacy":"closed"}` + "\n"; body != want { 406 t.Errorf("Teams.EditTeam body = %+v, want %+v", body, want) 407 } 408 } 409 410 func TestTeamsService_DeleteTeamByID(t *testing.T) { 411 t.Parallel() 412 client, mux, _ := setup(t) 413 414 mux.HandleFunc("/organizations/1/team/1", func(_ http.ResponseWriter, r *http.Request) { 415 testMethod(t, r, "DELETE") 416 }) 417 418 ctx := context.Background() 419 _, err := client.Teams.DeleteTeamByID(ctx, 1, 1) 420 if err != nil { 421 t.Errorf("Teams.DeleteTeamByID returned error: %v", err) 422 } 423 424 const methodName = "DeleteTeamByID" 425 testBadOptions(t, methodName, func() (err error) { 426 _, err = client.Teams.DeleteTeamByID(ctx, -1, -1) 427 return err 428 }) 429 430 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 431 return client.Teams.DeleteTeamByID(ctx, 1, 1) 432 }) 433 } 434 435 func TestTeamsService_DeleteTeamBySlug(t *testing.T) { 436 t.Parallel() 437 client, mux, _ := setup(t) 438 439 mux.HandleFunc("/orgs/o/teams/s", func(_ http.ResponseWriter, r *http.Request) { 440 testMethod(t, r, "DELETE") 441 }) 442 443 ctx := context.Background() 444 _, err := client.Teams.DeleteTeamBySlug(ctx, "o", "s") 445 if err != nil { 446 t.Errorf("Teams.DeleteTeamBySlug returned error: %v", err) 447 } 448 449 const methodName = "DeleteTeamBySlug" 450 testBadOptions(t, methodName, func() (err error) { 451 _, err = client.Teams.DeleteTeamBySlug(ctx, "\n", "\n") 452 return err 453 }) 454 455 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 456 return client.Teams.DeleteTeamBySlug(ctx, "o", "s") 457 }) 458 } 459 460 func TestTeamsService_ListChildTeamsByParentID(t *testing.T) { 461 t.Parallel() 462 client, mux, _ := setup(t) 463 464 mux.HandleFunc("/organizations/1/team/2/teams", func(w http.ResponseWriter, r *http.Request) { 465 testMethod(t, r, "GET") 466 testFormValues(t, r, values{"page": "2"}) 467 fmt.Fprint(w, `[{"id":2}]`) 468 }) 469 470 opt := &ListOptions{Page: 2} 471 ctx := context.Background() 472 teams, _, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt) 473 if err != nil { 474 t.Errorf("Teams.ListChildTeamsByParentID returned error: %v", err) 475 } 476 477 want := []*Team{{ID: Ptr(int64(2))}} 478 if !cmp.Equal(teams, want) { 479 t.Errorf("Teams.ListChildTeamsByParentID returned %+v, want %+v", teams, want) 480 } 481 482 const methodName = "ListChildTeamsByParentID" 483 testBadOptions(t, methodName, func() (err error) { 484 _, _, err = client.Teams.ListChildTeamsByParentID(ctx, -1, -2, opt) 485 return err 486 }) 487 488 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 489 got, resp, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt) 490 if got != nil { 491 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 492 } 493 return resp, err 494 }) 495 } 496 497 func TestTeamsService_ListChildTeamsByParentSlug(t *testing.T) { 498 t.Parallel() 499 client, mux, _ := setup(t) 500 501 mux.HandleFunc("/orgs/o/teams/s/teams", func(w http.ResponseWriter, r *http.Request) { 502 testMethod(t, r, "GET") 503 testFormValues(t, r, values{"page": "2"}) 504 fmt.Fprint(w, `[{"id":2}]`) 505 }) 506 507 opt := &ListOptions{Page: 2} 508 ctx := context.Background() 509 teams, _, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt) 510 if err != nil { 511 t.Errorf("Teams.ListChildTeamsByParentSlug returned error: %v", err) 512 } 513 514 want := []*Team{{ID: Ptr(int64(2))}} 515 if !cmp.Equal(teams, want) { 516 t.Errorf("Teams.ListChildTeamsByParentSlug returned %+v, want %+v", teams, want) 517 } 518 519 const methodName = "ListChildTeamsByParentSlug" 520 testBadOptions(t, methodName, func() (err error) { 521 _, _, err = client.Teams.ListChildTeamsByParentSlug(ctx, "\n", "\n", opt) 522 return err 523 }) 524 525 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 526 got, resp, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt) 527 if got != nil { 528 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 529 } 530 return resp, err 531 }) 532 } 533 534 func TestTeamsService_ListTeamReposByID(t *testing.T) { 535 t.Parallel() 536 client, mux, _ := setup(t) 537 538 mux.HandleFunc("/organizations/1/team/1/repos", func(w http.ResponseWriter, r *http.Request) { 539 testMethod(t, r, "GET") 540 testHeader(t, r, "Accept", mediaTypeTopicsPreview) 541 testFormValues(t, r, values{"page": "2"}) 542 fmt.Fprint(w, `[{"id":1}]`) 543 }) 544 545 opt := &ListOptions{Page: 2} 546 ctx := context.Background() 547 members, _, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt) 548 if err != nil { 549 t.Errorf("Teams.ListTeamReposByID returned error: %v", err) 550 } 551 552 want := []*Repository{{ID: Ptr(int64(1))}} 553 if !cmp.Equal(members, want) { 554 t.Errorf("Teams.ListTeamReposByID returned %+v, want %+v", members, want) 555 } 556 557 const methodName = "ListTeamReposByID" 558 testBadOptions(t, methodName, func() (err error) { 559 _, _, err = client.Teams.ListTeamReposByID(ctx, -1, -1, opt) 560 return err 561 }) 562 563 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 564 got, resp, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt) 565 if got != nil { 566 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 567 } 568 return resp, err 569 }) 570 } 571 572 func TestTeamsService_ListTeamReposBySlug(t *testing.T) { 573 t.Parallel() 574 client, mux, _ := setup(t) 575 576 mux.HandleFunc("/orgs/o/teams/s/repos", func(w http.ResponseWriter, r *http.Request) { 577 testMethod(t, r, "GET") 578 testHeader(t, r, "Accept", mediaTypeTopicsPreview) 579 testFormValues(t, r, values{"page": "2"}) 580 fmt.Fprint(w, `[{"id":1}]`) 581 }) 582 583 opt := &ListOptions{Page: 2} 584 ctx := context.Background() 585 members, _, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt) 586 if err != nil { 587 t.Errorf("Teams.ListTeamReposBySlug returned error: %v", err) 588 } 589 590 want := []*Repository{{ID: Ptr(int64(1))}} 591 if !cmp.Equal(members, want) { 592 t.Errorf("Teams.ListTeamReposBySlug returned %+v, want %+v", members, want) 593 } 594 595 const methodName = "ListTeamReposBySlug" 596 testBadOptions(t, methodName, func() (err error) { 597 _, _, err = client.Teams.ListTeamReposBySlug(ctx, "\n", "\n", opt) 598 return err 599 }) 600 601 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 602 got, resp, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt) 603 if got != nil { 604 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 605 } 606 return resp, err 607 }) 608 } 609 610 func TestTeamsService_IsTeamRepoByID_true(t *testing.T) { 611 t.Parallel() 612 client, mux, _ := setup(t) 613 614 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 615 testMethod(t, r, "GET") 616 testHeader(t, r, "Accept", mediaTypeOrgPermissionRepo) 617 fmt.Fprint(w, `{"id":1}`) 618 }) 619 620 ctx := context.Background() 621 repo, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") 622 if err != nil { 623 t.Errorf("Teams.IsTeamRepoByID returned error: %v", err) 624 } 625 626 want := &Repository{ID: Ptr(int64(1))} 627 if !cmp.Equal(repo, want) { 628 t.Errorf("Teams.IsTeamRepoByID returned %+v, want %+v", repo, want) 629 } 630 631 const methodName = "IsTeamRepoByID" 632 testBadOptions(t, methodName, func() (err error) { 633 _, _, err = client.Teams.IsTeamRepoByID(ctx, -1, -1, "\n", "\n") 634 return err 635 }) 636 637 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 638 got, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") 639 if got != nil { 640 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 641 } 642 return resp, err 643 }) 644 } 645 646 func TestTeamsService_IsTeamRepoBySlug_true(t *testing.T) { 647 t.Parallel() 648 client, mux, _ := setup(t) 649 650 mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 651 testMethod(t, r, "GET") 652 testHeader(t, r, "Accept", mediaTypeOrgPermissionRepo) 653 fmt.Fprint(w, `{"id":1}`) 654 }) 655 656 ctx := context.Background() 657 repo, _, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 658 if err != nil { 659 t.Errorf("Teams.IsTeamRepoBySlug returned error: %v", err) 660 } 661 662 want := &Repository{ID: Ptr(int64(1))} 663 if !cmp.Equal(repo, want) { 664 t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want %+v", repo, want) 665 } 666 667 const methodName = "IsTeamRepoBySlug" 668 testBadOptions(t, methodName, func() (err error) { 669 _, _, err = client.Teams.IsTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n") 670 return err 671 }) 672 673 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 674 got, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 675 if got != nil { 676 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 677 } 678 return resp, err 679 }) 680 } 681 682 func TestTeamsService_IsTeamRepoByID_false(t *testing.T) { 683 t.Parallel() 684 client, mux, _ := setup(t) 685 686 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 687 testMethod(t, r, "GET") 688 w.WriteHeader(http.StatusNotFound) 689 }) 690 691 ctx := context.Background() 692 repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") 693 if err == nil { 694 t.Error("Expected HTTP 404 response") 695 } 696 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 697 t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) 698 } 699 if repo != nil { 700 t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) 701 } 702 } 703 704 func TestTeamsService_IsTeamRepoBySlug_false(t *testing.T) { 705 t.Parallel() 706 client, mux, _ := setup(t) 707 708 mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) { 709 testMethod(t, r, "GET") 710 w.WriteHeader(http.StatusNotFound) 711 }) 712 713 ctx := context.Background() 714 repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 715 if err == nil { 716 t.Error("Expected HTTP 404 response") 717 } 718 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 719 t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) 720 } 721 if repo != nil { 722 t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) 723 } 724 } 725 726 func TestTeamsService_IsTeamRepoByID_error(t *testing.T) { 727 t.Parallel() 728 client, mux, _ := setup(t) 729 730 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 731 testMethod(t, r, "GET") 732 http.Error(w, "BadRequest", http.StatusBadRequest) 733 }) 734 735 ctx := context.Background() 736 repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") 737 if err == nil { 738 t.Error("Expected HTTP 400 response") 739 } 740 if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { 741 t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) 742 } 743 if repo != nil { 744 t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) 745 } 746 } 747 748 func TestTeamsService_IsTeamRepoBySlug_error(t *testing.T) { 749 t.Parallel() 750 client, mux, _ := setup(t) 751 752 mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 753 testMethod(t, r, "GET") 754 http.Error(w, "BadRequest", http.StatusBadRequest) 755 }) 756 757 ctx := context.Background() 758 repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 759 if err == nil { 760 t.Error("Expected HTTP 400 response") 761 } 762 if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { 763 t.Errorf("Teams.IsTeamRepoBySlug returned status %d, want %d", got, want) 764 } 765 if repo != nil { 766 t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want nil", repo) 767 } 768 } 769 770 func TestTeamsService_IsTeamRepoByID_invalidOwner(t *testing.T) { 771 t.Parallel() 772 client, _, _ := setup(t) 773 774 ctx := context.Background() 775 _, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "%", "r") 776 testURLParseError(t, err) 777 } 778 779 func TestTeamsService_IsTeamRepoBySlug_invalidOwner(t *testing.T) { 780 t.Parallel() 781 client, _, _ := setup(t) 782 783 ctx := context.Background() 784 _, _, err := client.Teams.IsTeamRepoBySlug(ctx, "o", "s", "%", "r") 785 testURLParseError(t, err) 786 } 787 788 func TestTeamsService_AddTeamRepoByID(t *testing.T) { 789 t.Parallel() 790 client, mux, _ := setup(t) 791 792 opt := &TeamAddTeamRepoOptions{Permission: "admin"} 793 794 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 795 v := new(TeamAddTeamRepoOptions) 796 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 797 798 testMethod(t, r, "PUT") 799 if !cmp.Equal(v, opt) { 800 t.Errorf("Request body = %+v, want %+v", v, opt) 801 } 802 803 w.WriteHeader(http.StatusNoContent) 804 }) 805 806 ctx := context.Background() 807 _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt) 808 if err != nil { 809 t.Errorf("Teams.AddTeamRepoByID returned error: %v", err) 810 } 811 812 const methodName = "AddTeamRepoByID" 813 testBadOptions(t, methodName, func() (err error) { 814 _, err = client.Teams.AddTeamRepoByID(ctx, 1, 1, "\n", "\n", opt) 815 return err 816 }) 817 818 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 819 return client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt) 820 }) 821 } 822 823 func TestTeamsService_AddTeamRepoBySlug(t *testing.T) { 824 t.Parallel() 825 client, mux, _ := setup(t) 826 827 opt := &TeamAddTeamRepoOptions{Permission: "admin"} 828 829 mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 830 v := new(TeamAddTeamRepoOptions) 831 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 832 833 testMethod(t, r, "PUT") 834 if !cmp.Equal(v, opt) { 835 t.Errorf("Request body = %+v, want %+v", v, opt) 836 } 837 838 w.WriteHeader(http.StatusNoContent) 839 }) 840 841 ctx := context.Background() 842 _, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt) 843 if err != nil { 844 t.Errorf("Teams.AddTeamRepoBySlug returned error: %v", err) 845 } 846 847 const methodName = "AddTeamRepoBySlug" 848 testBadOptions(t, methodName, func() (err error) { 849 _, err = client.Teams.AddTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n", opt) 850 return err 851 }) 852 853 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 854 return client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt) 855 }) 856 } 857 858 func TestTeamsService_AddTeamRepoByID_noAccess(t *testing.T) { 859 t.Parallel() 860 client, mux, _ := setup(t) 861 862 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 863 testMethod(t, r, "PUT") 864 w.WriteHeader(http.StatusUnprocessableEntity) 865 }) 866 867 ctx := context.Background() 868 _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", nil) 869 if err == nil { 870 t.Error("Expected error to be returned") 871 } 872 } 873 874 func TestTeamsService_AddTeamRepoBySlug_noAccess(t *testing.T) { 875 t.Parallel() 876 client, mux, _ := setup(t) 877 878 mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) { 879 testMethod(t, r, "PUT") 880 w.WriteHeader(http.StatusUnprocessableEntity) 881 }) 882 883 ctx := context.Background() 884 _, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", nil) 885 if err == nil { 886 t.Error("Expected error to be returned") 887 } 888 } 889 890 func TestTeamsService_AddTeamRepoByID_invalidOwner(t *testing.T) { 891 t.Parallel() 892 client, _, _ := setup(t) 893 894 ctx := context.Background() 895 _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "%", "r", nil) 896 testURLParseError(t, err) 897 } 898 899 func TestTeamsService_AddTeamRepoBySlug_invalidOwner(t *testing.T) { 900 t.Parallel() 901 client, _, _ := setup(t) 902 903 ctx := context.Background() 904 _, err := client.Teams.AddTeamRepoBySlug(ctx, "o", "s", "%", "r", nil) 905 testURLParseError(t, err) 906 } 907 908 func TestTeamsService_RemoveTeamRepoByID(t *testing.T) { 909 t.Parallel() 910 client, mux, _ := setup(t) 911 912 mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 913 testMethod(t, r, "DELETE") 914 w.WriteHeader(http.StatusNoContent) 915 }) 916 917 ctx := context.Background() 918 _, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo") 919 if err != nil { 920 t.Errorf("Teams.RemoveTeamRepoByID returned error: %v", err) 921 } 922 923 const methodName = "RemoveTeamRepoByID" 924 testBadOptions(t, methodName, func() (err error) { 925 _, err = client.Teams.RemoveTeamRepoByID(ctx, -1, -1, "\n", "\n") 926 return err 927 }) 928 929 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 930 return client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo") 931 }) 932 } 933 934 func TestTeamsService_RemoveTeamRepoBySlug(t *testing.T) { 935 t.Parallel() 936 client, mux, _ := setup(t) 937 938 mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { 939 testMethod(t, r, "DELETE") 940 w.WriteHeader(http.StatusNoContent) 941 }) 942 943 ctx := context.Background() 944 _, err := client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 945 if err != nil { 946 t.Errorf("Teams.RemoveTeamRepoBySlug returned error: %v", err) 947 } 948 949 const methodName = "RemoveTeamRepoBySlug" 950 testBadOptions(t, methodName, func() (err error) { 951 _, err = client.Teams.RemoveTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n") 952 return err 953 }) 954 955 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 956 return client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") 957 }) 958 } 959 960 func TestTeamsService_RemoveTeamRepoByID_invalidOwner(t *testing.T) { 961 t.Parallel() 962 client, _, _ := setup(t) 963 964 ctx := context.Background() 965 _, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "%", "r") 966 testURLParseError(t, err) 967 } 968 969 func TestTeamsService_RemoveTeamRepoBySlug_invalidOwner(t *testing.T) { 970 t.Parallel() 971 client, _, _ := setup(t) 972 973 ctx := context.Background() 974 _, err := client.Teams.RemoveTeamRepoBySlug(ctx, "o", "s", "%", "r") 975 testURLParseError(t, err) 976 } 977 978 func TestTeamsService_ListUserTeams(t *testing.T) { 979 t.Parallel() 980 client, mux, _ := setup(t) 981 982 mux.HandleFunc("/user/teams", func(w http.ResponseWriter, r *http.Request) { 983 testMethod(t, r, "GET") 984 testFormValues(t, r, values{"page": "1"}) 985 fmt.Fprint(w, `[{"id":1}]`) 986 }) 987 988 opt := &ListOptions{Page: 1} 989 ctx := context.Background() 990 teams, _, err := client.Teams.ListUserTeams(ctx, opt) 991 if err != nil { 992 t.Errorf("Teams.ListUserTeams returned error: %v", err) 993 } 994 995 want := []*Team{{ID: Ptr(int64(1))}} 996 if !cmp.Equal(teams, want) { 997 t.Errorf("Teams.ListUserTeams returned %+v, want %+v", teams, want) 998 } 999 1000 const methodName = "ListUserTeams" 1001 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1002 got, resp, err := client.Teams.ListUserTeams(ctx, opt) 1003 if got != nil { 1004 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1005 } 1006 return resp, err 1007 }) 1008 } 1009 1010 func TestTeamsService_ListProjectsByID(t *testing.T) { 1011 t.Parallel() 1012 client, mux, _ := setup(t) 1013 1014 mux.HandleFunc("/organizations/1/team/1/projects", func(w http.ResponseWriter, r *http.Request) { 1015 testMethod(t, r, "GET") 1016 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1017 fmt.Fprint(w, `[{"id":1}]`) 1018 }) 1019 1020 ctx := context.Background() 1021 projects, _, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1) 1022 if err != nil { 1023 t.Errorf("Teams.ListTeamProjectsByID returned error: %v", err) 1024 } 1025 1026 want := []*ProjectV2{{ID: Ptr(int64(1))}} 1027 if !cmp.Equal(projects, want) { 1028 t.Errorf("Teams.ListTeamProjectsByID returned %+v, want %+v", projects, want) 1029 } 1030 1031 const methodName = "ListTeamProjectsByID" 1032 testBadOptions(t, methodName, func() (err error) { 1033 _, _, err = client.Teams.ListTeamProjectsByID(ctx, -1, -1) 1034 return err 1035 }) 1036 1037 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1038 got, resp, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1) 1039 if got != nil { 1040 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1041 } 1042 return resp, err 1043 }) 1044 } 1045 1046 func TestTeamsService_ListProjectsBySlug(t *testing.T) { 1047 t.Parallel() 1048 client, mux, _ := setup(t) 1049 1050 mux.HandleFunc("/orgs/o/teams/s/projects", func(w http.ResponseWriter, r *http.Request) { 1051 testMethod(t, r, "GET") 1052 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1053 fmt.Fprint(w, `[{"id":1}]`) 1054 }) 1055 1056 ctx := context.Background() 1057 projects, _, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s") 1058 if err != nil { 1059 t.Errorf("Teams.ListTeamProjectsBySlug returned error: %v", err) 1060 } 1061 1062 want := []*ProjectV2{{ID: Ptr(int64(1))}} 1063 if !cmp.Equal(projects, want) { 1064 t.Errorf("Teams.ListTeamProjectsBySlug returned %+v, want %+v", projects, want) 1065 } 1066 1067 const methodName = "ListTeamProjectsBySlug" 1068 testBadOptions(t, methodName, func() (err error) { 1069 _, _, err = client.Teams.ListTeamProjectsBySlug(ctx, "\n", "\n") 1070 return err 1071 }) 1072 1073 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1074 got, resp, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s") 1075 if got != nil { 1076 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1077 } 1078 return resp, err 1079 }) 1080 } 1081 1082 func TestTeamsService_ReviewProjectsByID(t *testing.T) { 1083 t.Parallel() 1084 client, mux, _ := setup(t) 1085 1086 mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { 1087 testMethod(t, r, "GET") 1088 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1089 fmt.Fprint(w, `{"id":1}`) 1090 }) 1091 1092 ctx := context.Background() 1093 project, _, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1) 1094 if err != nil { 1095 t.Errorf("Teams.ReviewTeamProjectsByID returned error: %v", err) 1096 } 1097 1098 want := &ProjectV2{ID: Ptr(int64(1))} 1099 if !cmp.Equal(project, want) { 1100 t.Errorf("Teams.ReviewTeamProjectsByID returned %+v, want %+v", project, want) 1101 } 1102 1103 const methodName = "ReviewTeamProjectsByID" 1104 testBadOptions(t, methodName, func() (err error) { 1105 _, _, err = client.Teams.ReviewTeamProjectsByID(ctx, -1, -1, -1) 1106 return err 1107 }) 1108 1109 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1110 got, resp, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1) 1111 if got != nil { 1112 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1113 } 1114 return resp, err 1115 }) 1116 } 1117 1118 func TestTeamsService_ReviewProjectsBySlug(t *testing.T) { 1119 t.Parallel() 1120 client, mux, _ := setup(t) 1121 1122 mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { 1123 testMethod(t, r, "GET") 1124 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1125 fmt.Fprint(w, `{"id":1}`) 1126 }) 1127 1128 ctx := context.Background() 1129 project, _, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1) 1130 if err != nil { 1131 t.Errorf("Teams.ReviewTeamProjectsBySlug returned error: %v", err) 1132 } 1133 1134 want := &ProjectV2{ID: Ptr(int64(1))} 1135 if !cmp.Equal(project, want) { 1136 t.Errorf("Teams.ReviewTeamProjectsBySlug returned %+v, want %+v", project, want) 1137 } 1138 1139 const methodName = "ReviewTeamProjectsBySlug" 1140 testBadOptions(t, methodName, func() (err error) { 1141 _, _, err = client.Teams.ReviewTeamProjectsBySlug(ctx, "\n", "\n", -1) 1142 return err 1143 }) 1144 1145 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1146 got, resp, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1) 1147 if got != nil { 1148 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1149 } 1150 return resp, err 1151 }) 1152 } 1153 1154 func TestTeamsService_AddTeamProjectByID(t *testing.T) { 1155 t.Parallel() 1156 client, mux, _ := setup(t) 1157 1158 opt := &TeamProjectOptions{ 1159 Permission: Ptr("admin"), 1160 } 1161 1162 mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { 1163 testMethod(t, r, "PUT") 1164 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1165 1166 v := &TeamProjectOptions{} 1167 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 1168 if !cmp.Equal(v, opt) { 1169 t.Errorf("Request body = %+v, want %+v", v, opt) 1170 } 1171 1172 w.WriteHeader(http.StatusNoContent) 1173 }) 1174 1175 ctx := context.Background() 1176 _, err := client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt) 1177 if err != nil { 1178 t.Errorf("Teams.AddTeamProjectByID returned error: %v", err) 1179 } 1180 1181 const methodName = "AddTeamProjectByID" 1182 testBadOptions(t, methodName, func() (err error) { 1183 _, err = client.Teams.AddTeamProjectByID(ctx, -1, -1, -1, opt) 1184 return err 1185 }) 1186 1187 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1188 return client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt) 1189 }) 1190 } 1191 1192 func TestTeamsService_AddTeamProjectBySlug(t *testing.T) { 1193 t.Parallel() 1194 client, mux, _ := setup(t) 1195 1196 opt := &TeamProjectOptions{ 1197 Permission: Ptr("admin"), 1198 } 1199 1200 mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { 1201 testMethod(t, r, "PUT") 1202 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1203 1204 v := &TeamProjectOptions{} 1205 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 1206 if !cmp.Equal(v, opt) { 1207 t.Errorf("Request body = %+v, want %+v", v, opt) 1208 } 1209 1210 w.WriteHeader(http.StatusNoContent) 1211 }) 1212 1213 ctx := context.Background() 1214 _, err := client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt) 1215 if err != nil { 1216 t.Errorf("Teams.AddTeamProjectBySlug returned error: %v", err) 1217 } 1218 1219 const methodName = "AddTeamProjectBySlug" 1220 testBadOptions(t, methodName, func() (err error) { 1221 _, err = client.Teams.AddTeamProjectBySlug(ctx, "\n", "\n", -1, opt) 1222 return err 1223 }) 1224 1225 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1226 return client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt) 1227 }) 1228 } 1229 1230 func TestTeamsService_RemoveTeamProjectByID(t *testing.T) { 1231 t.Parallel() 1232 client, mux, _ := setup(t) 1233 1234 mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { 1235 testMethod(t, r, "DELETE") 1236 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1237 w.WriteHeader(http.StatusNoContent) 1238 }) 1239 1240 ctx := context.Background() 1241 _, err := client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1) 1242 if err != nil { 1243 t.Errorf("Teams.RemoveTeamProjectByID returned error: %v", err) 1244 } 1245 1246 const methodName = "RemoveTeamProjectByID" 1247 testBadOptions(t, methodName, func() (err error) { 1248 _, err = client.Teams.RemoveTeamProjectByID(ctx, -1, -1, -1) 1249 return err 1250 }) 1251 1252 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1253 return client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1) 1254 }) 1255 } 1256 1257 func TestTeamsService_RemoveTeamProjectBySlug(t *testing.T) { 1258 t.Parallel() 1259 client, mux, _ := setup(t) 1260 1261 mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { 1262 testMethod(t, r, "DELETE") 1263 testHeader(t, r, "Accept", mediaTypeProjectsPreview) 1264 w.WriteHeader(http.StatusNoContent) 1265 }) 1266 1267 ctx := context.Background() 1268 _, err := client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1) 1269 if err != nil { 1270 t.Errorf("Teams.RemoveTeamProjectBySlug returned error: %v", err) 1271 } 1272 1273 const methodName = "RemoveTeamProjectBySlug" 1274 testBadOptions(t, methodName, func() (err error) { 1275 _, err = client.Teams.RemoveTeamProjectBySlug(ctx, "\n", "\n", -1) 1276 return err 1277 }) 1278 1279 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1280 return client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1) 1281 }) 1282 } 1283 1284 func TestTeamsService_ListIDPGroupsInOrganization(t *testing.T) { 1285 t.Parallel() 1286 client, mux, _ := setup(t) 1287 1288 mux.HandleFunc("/orgs/o/team-sync/groups", func(w http.ResponseWriter, r *http.Request) { 1289 testMethod(t, r, "GET") 1290 testFormValues(t, r, values{ 1291 "page": "url-encoded-next-page-token", 1292 "q": "n", 1293 }) 1294 fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) 1295 }) 1296 1297 opt := &ListIDPGroupsOptions{ 1298 Query: "n", 1299 ListCursorOptions: ListCursorOptions{Page: "url-encoded-next-page-token"}, 1300 } 1301 ctx := context.Background() 1302 groups, _, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt) 1303 if err != nil { 1304 t.Errorf("Teams.ListIDPGroupsInOrganization returned error: %v", err) 1305 } 1306 1307 want := &IDPGroupList{ 1308 Groups: []*IDPGroup{ 1309 { 1310 GroupID: Ptr("1"), 1311 GroupName: Ptr("n"), 1312 GroupDescription: Ptr("d"), 1313 }, 1314 }, 1315 } 1316 if !cmp.Equal(groups, want) { 1317 t.Errorf("Teams.ListIDPGroupsInOrganization returned %+v. want %+v", groups, want) 1318 } 1319 1320 const methodName = "ListIDPGroupsInOrganization" 1321 testBadOptions(t, methodName, func() (err error) { 1322 _, _, err = client.Teams.ListIDPGroupsInOrganization(ctx, "\n", opt) 1323 return err 1324 }) 1325 1326 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1327 got, resp, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt) 1328 if got != nil { 1329 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1330 } 1331 return resp, err 1332 }) 1333 } 1334 1335 func TestTeamsService_ListIDPGroupsForTeamByID(t *testing.T) { 1336 t.Parallel() 1337 client, mux, _ := setup(t) 1338 1339 mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1340 testMethod(t, r, "GET") 1341 fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) 1342 }) 1343 1344 ctx := context.Background() 1345 groups, _, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1) 1346 if err != nil { 1347 t.Errorf("Teams.ListIDPGroupsForTeamByID returned error: %v", err) 1348 } 1349 1350 want := &IDPGroupList{ 1351 Groups: []*IDPGroup{ 1352 { 1353 GroupID: Ptr("1"), 1354 GroupName: Ptr("n"), 1355 GroupDescription: Ptr("d"), 1356 }, 1357 }, 1358 } 1359 if !cmp.Equal(groups, want) { 1360 t.Errorf("Teams.ListIDPGroupsForTeamByID returned %+v. want %+v", groups, want) 1361 } 1362 1363 const methodName = "ListIDPGroupsForTeamByID" 1364 testBadOptions(t, methodName, func() (err error) { 1365 _, _, err = client.Teams.ListIDPGroupsForTeamByID(ctx, -1, -1) 1366 return err 1367 }) 1368 1369 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1370 got, resp, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1) 1371 if got != nil { 1372 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1373 } 1374 return resp, err 1375 }) 1376 } 1377 1378 func TestTeamsService_ListIDPGroupsForTeamBySlug(t *testing.T) { 1379 t.Parallel() 1380 client, mux, _ := setup(t) 1381 1382 mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1383 testMethod(t, r, "GET") 1384 fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) 1385 }) 1386 1387 ctx := context.Background() 1388 groups, _, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug") 1389 if err != nil { 1390 t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned error: %v", err) 1391 } 1392 1393 want := &IDPGroupList{ 1394 Groups: []*IDPGroup{ 1395 { 1396 GroupID: Ptr("1"), 1397 GroupName: Ptr("n"), 1398 GroupDescription: Ptr("d"), 1399 }, 1400 }, 1401 } 1402 if !cmp.Equal(groups, want) { 1403 t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned %+v. want %+v", groups, want) 1404 } 1405 1406 const methodName = "ListIDPGroupsForTeamBySlug" 1407 testBadOptions(t, methodName, func() (err error) { 1408 _, _, err = client.Teams.ListIDPGroupsForTeamBySlug(ctx, "\n", "\n") 1409 return err 1410 }) 1411 1412 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1413 got, resp, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug") 1414 if got != nil { 1415 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1416 } 1417 return resp, err 1418 }) 1419 } 1420 1421 func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID(t *testing.T) { 1422 t.Parallel() 1423 client, mux, _ := setup(t) 1424 1425 mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1426 testMethod(t, r, "PATCH") 1427 fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) 1428 }) 1429 1430 input := IDPGroupList{ 1431 Groups: []*IDPGroup{ 1432 { 1433 GroupID: Ptr("1"), 1434 GroupName: Ptr("n"), 1435 GroupDescription: Ptr("d"), 1436 }, 1437 }, 1438 } 1439 1440 ctx := context.Background() 1441 groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) 1442 if err != nil { 1443 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err) 1444 } 1445 1446 want := &IDPGroupList{ 1447 Groups: []*IDPGroup{ 1448 { 1449 GroupID: Ptr("1"), 1450 GroupName: Ptr("n"), 1451 GroupDescription: Ptr("d"), 1452 }, 1453 }, 1454 } 1455 if !cmp.Equal(groups, want) { 1456 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want) 1457 } 1458 1459 const methodName = "CreateOrUpdateIDPGroupConnectionsByID" 1460 testBadOptions(t, methodName, func() (err error) { 1461 _, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, -1, -1, input) 1462 return err 1463 }) 1464 1465 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1466 got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) 1467 if got != nil { 1468 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1469 } 1470 return resp, err 1471 }) 1472 } 1473 1474 func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug(t *testing.T) { 1475 t.Parallel() 1476 client, mux, _ := setup(t) 1477 1478 mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1479 testMethod(t, r, "PATCH") 1480 fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) 1481 }) 1482 1483 input := IDPGroupList{ 1484 Groups: []*IDPGroup{ 1485 { 1486 GroupID: Ptr("1"), 1487 GroupName: Ptr("n"), 1488 GroupDescription: Ptr("d"), 1489 }, 1490 }, 1491 } 1492 1493 ctx := context.Background() 1494 groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) 1495 if err != nil { 1496 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err) 1497 } 1498 1499 want := &IDPGroupList{ 1500 Groups: []*IDPGroup{ 1501 { 1502 GroupID: Ptr("1"), 1503 GroupName: Ptr("n"), 1504 GroupDescription: Ptr("d"), 1505 }, 1506 }, 1507 } 1508 if !cmp.Equal(groups, want) { 1509 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want) 1510 } 1511 1512 const methodName = "CreateOrUpdateIDPGroupConnectionsBySlug" 1513 testBadOptions(t, methodName, func() (err error) { 1514 _, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "\n", "\n", input) 1515 return err 1516 }) 1517 1518 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1519 got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) 1520 if got != nil { 1521 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1522 } 1523 return resp, err 1524 }) 1525 } 1526 func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID_empty(t *testing.T) { 1527 t.Parallel() 1528 client, mux, _ := setup(t) 1529 1530 mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1531 testMethod(t, r, "PATCH") 1532 fmt.Fprint(w, `{"groups": []}`) 1533 }) 1534 1535 input := IDPGroupList{ 1536 Groups: []*IDPGroup{}, 1537 } 1538 1539 ctx := context.Background() 1540 groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) 1541 if err != nil { 1542 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err) 1543 } 1544 1545 want := &IDPGroupList{ 1546 Groups: []*IDPGroup{}, 1547 } 1548 if !cmp.Equal(groups, want) { 1549 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want) 1550 } 1551 } 1552 1553 func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug_empty(t *testing.T) { 1554 t.Parallel() 1555 client, mux, _ := setup(t) 1556 1557 mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { 1558 testMethod(t, r, "PATCH") 1559 fmt.Fprint(w, `{"groups": []}`) 1560 }) 1561 1562 input := IDPGroupList{ 1563 Groups: []*IDPGroup{}, 1564 } 1565 1566 ctx := context.Background() 1567 groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) 1568 if err != nil { 1569 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err) 1570 } 1571 1572 want := &IDPGroupList{ 1573 Groups: []*IDPGroup{}, 1574 } 1575 if !cmp.Equal(groups, want) { 1576 t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want) 1577 } 1578 } 1579 1580 func TestNewTeam_Marshal(t *testing.T) { 1581 t.Parallel() 1582 testJSONMarshal(t, &NewTeam{}, "{}") 1583 1584 u := &NewTeam{ 1585 Name: "n", 1586 Description: Ptr("d"), 1587 Maintainers: []string{"m1", "m2"}, 1588 RepoNames: []string{"repo1", "repo2"}, 1589 NotificationSetting: Ptr("notifications_enabled"), 1590 ParentTeamID: Ptr(int64(1)), 1591 Permission: Ptr("perm"), 1592 Privacy: Ptr("p"), 1593 LDAPDN: Ptr("l"), 1594 } 1595 1596 want := `{ 1597 "name": "n", 1598 "description": "d", 1599 "maintainers": ["m1", "m2"], 1600 "repo_names": ["repo1", "repo2"], 1601 "parent_team_id": 1, 1602 "notification_setting": "notifications_enabled", 1603 "permission": "perm", 1604 "privacy": "p", 1605 "ldap_dn": "l" 1606 }` 1607 1608 testJSONMarshal(t, u, want) 1609 } 1610 1611 func TestTeams_Marshal(t *testing.T) { 1612 t.Parallel() 1613 testJSONMarshal(t, &Team{}, "{}") 1614 1615 u := &Team{ 1616 ID: Ptr(int64(1)), 1617 NodeID: Ptr("n"), 1618 Name: Ptr("n"), 1619 Description: Ptr("d"), 1620 URL: Ptr("u"), 1621 Slug: Ptr("s"), 1622 Permission: Ptr("p"), 1623 Privacy: Ptr("p"), 1624 MembersCount: Ptr(1), 1625 ReposCount: Ptr(1), 1626 MembersURL: Ptr("m"), 1627 RepositoriesURL: Ptr("r"), 1628 Organization: &Organization{ 1629 Login: Ptr("l"), 1630 ID: Ptr(int64(1)), 1631 NodeID: Ptr("n"), 1632 AvatarURL: Ptr("a"), 1633 HTMLURL: Ptr("h"), 1634 Name: Ptr("n"), 1635 Company: Ptr("c"), 1636 Blog: Ptr("b"), 1637 Location: Ptr("l"), 1638 Email: Ptr("e"), 1639 }, 1640 Parent: &Team{ 1641 ID: Ptr(int64(1)), 1642 NodeID: Ptr("n"), 1643 Name: Ptr("n"), 1644 Description: Ptr("d"), 1645 URL: Ptr("u"), 1646 Slug: Ptr("s"), 1647 Permission: Ptr("p"), 1648 Privacy: Ptr("p"), 1649 MembersCount: Ptr(1), 1650 ReposCount: Ptr(1), 1651 }, 1652 LDAPDN: Ptr("l"), 1653 } 1654 1655 want := `{ 1656 "id": 1, 1657 "node_id": "n", 1658 "name": "n", 1659 "description": "d", 1660 "url": "u", 1661 "slug": "s", 1662 "permission": "p", 1663 "privacy": "p", 1664 "members_count": 1, 1665 "repos_count": 1, 1666 "members_url": "m", 1667 "repositories_url": "r", 1668 "organization": { 1669 "login": "l", 1670 "id": 1, 1671 "node_id": "n", 1672 "avatar_url": "a", 1673 "html_url": "h", 1674 "name": "n", 1675 "company": "c", 1676 "blog": "b", 1677 "location": "l", 1678 "email": "e" 1679 }, 1680 "parent": { 1681 "id": 1, 1682 "node_id": "n", 1683 "name": "n", 1684 "description": "d", 1685 "url": "u", 1686 "slug": "s", 1687 "permission": "p", 1688 "privacy": "p", 1689 "members_count": 1, 1690 "repos_count": 1 1691 }, 1692 "ldap_dn": "l" 1693 }` 1694 1695 testJSONMarshal(t, u, want) 1696 } 1697 1698 func TestInvitation_Marshal(t *testing.T) { 1699 t.Parallel() 1700 testJSONMarshal(t, &Invitation{}, "{}") 1701 1702 u := &Invitation{ 1703 ID: Ptr(int64(1)), 1704 NodeID: Ptr("test node"), 1705 Login: Ptr("login123"), 1706 Email: Ptr("go@github.com"), 1707 Role: Ptr("developer"), 1708 CreatedAt: &Timestamp{referenceTime}, 1709 TeamCount: Ptr(99), 1710 InvitationTeamURL: Ptr("url"), 1711 } 1712 1713 want := `{ 1714 "id": 1, 1715 "node_id": "test node", 1716 "login":"login123", 1717 "email":"go@github.com", 1718 "role":"developer", 1719 "created_at":` + referenceTimeStr + `, 1720 "team_count":99, 1721 "invitation_team_url":"url" 1722 }` 1723 1724 testJSONMarshal(t, u, want) 1725 } 1726 1727 func TestIDPGroup_Marshal(t *testing.T) { 1728 t.Parallel() 1729 testJSONMarshal(t, &IDPGroup{}, "{}") 1730 1731 u := &IDPGroup{ 1732 GroupID: Ptr("abc1"), 1733 GroupName: Ptr("test group"), 1734 GroupDescription: Ptr("test group description"), 1735 } 1736 1737 want := `{ 1738 "group_id": "abc1", 1739 "group_name": "test group", 1740 "group_description":"test group description" 1741 }` 1742 1743 testJSONMarshal(t, u, want) 1744 } 1745 1746 func TestTeamsService_GetExternalGroup(t *testing.T) { 1747 t.Parallel() 1748 client, mux, _ := setup(t) 1749 1750 mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) { 1751 testMethod(t, r, "GET") 1752 fmt.Fprint(w, `{ 1753 "group_id": 123, 1754 "group_name": "Octocat admins", 1755 "updated_at": "2006-01-02T15:04:05Z", 1756 "teams": [ 1757 { 1758 "team_id": 1, 1759 "team_name": "team-test" 1760 }, 1761 { 1762 "team_id": 2, 1763 "team_name": "team-test2" 1764 } 1765 ], 1766 "members": [ 1767 { 1768 "member_id": 1, 1769 "member_login": "mona-lisa_eocsaxrs", 1770 "member_name": "Mona Lisa", 1771 "member_email": "mona_lisa@github.com" 1772 }, 1773 { 1774 "member_id": 2, 1775 "member_login": "octo-lisa_eocsaxrs", 1776 "member_name": "Octo Lisa", 1777 "member_email": "octo_lisa@github.com" 1778 } 1779 ] 1780 }`) 1781 }) 1782 1783 ctx := context.Background() 1784 externalGroup, _, err := client.Teams.GetExternalGroup(ctx, "o", 123) 1785 if err != nil { 1786 t.Errorf("Teams.GetExternalGroup returned error: %v", err) 1787 } 1788 1789 want := &ExternalGroup{ 1790 GroupID: Ptr(int64(123)), 1791 GroupName: Ptr("Octocat admins"), 1792 UpdatedAt: &Timestamp{Time: referenceTime}, 1793 Teams: []*ExternalGroupTeam{ 1794 { 1795 TeamID: Ptr(int64(1)), 1796 TeamName: Ptr("team-test"), 1797 }, 1798 { 1799 TeamID: Ptr(int64(2)), 1800 TeamName: Ptr("team-test2"), 1801 }, 1802 }, 1803 Members: []*ExternalGroupMember{ 1804 { 1805 MemberID: Ptr(int64(1)), 1806 MemberLogin: Ptr("mona-lisa_eocsaxrs"), 1807 MemberName: Ptr("Mona Lisa"), 1808 MemberEmail: Ptr("mona_lisa@github.com"), 1809 }, 1810 { 1811 MemberID: Ptr(int64(2)), 1812 MemberLogin: Ptr("octo-lisa_eocsaxrs"), 1813 MemberName: Ptr("Octo Lisa"), 1814 MemberEmail: Ptr("octo_lisa@github.com"), 1815 }, 1816 }, 1817 } 1818 if !cmp.Equal(externalGroup, want) { 1819 t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want) 1820 } 1821 1822 const methodName = "GetExternalGroup" 1823 testBadOptions(t, methodName, func() (err error) { 1824 _, _, err = client.Teams.GetExternalGroup(ctx, "\n", -1) 1825 return err 1826 }) 1827 1828 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1829 got, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123) 1830 if got != nil { 1831 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1832 } 1833 return resp, err 1834 }) 1835 } 1836 1837 func TestTeamsService_GetExternalGroup_notFound(t *testing.T) { 1838 t.Parallel() 1839 client, mux, _ := setup(t) 1840 1841 mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) { 1842 testMethod(t, r, "GET") 1843 w.WriteHeader(http.StatusNotFound) 1844 }) 1845 1846 ctx := context.Background() 1847 eg, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123) 1848 if err == nil { 1849 t.Error("Expected HTTP 404 response") 1850 } 1851 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 1852 t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want) 1853 } 1854 if eg != nil { 1855 t.Errorf("Teams.GetExternalGroup returned %+v, want nil", eg) 1856 } 1857 } 1858 1859 func TestTeamsService_ListExternalGroups(t *testing.T) { 1860 t.Parallel() 1861 client, mux, _ := setup(t) 1862 1863 mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) { 1864 testMethod(t, r, "GET") 1865 fmt.Fprint(w, `{ 1866 "groups": [ 1867 { 1868 "group_id": 123, 1869 "group_name": "Octocat admins", 1870 "updated_at": "2006-01-02T15:04:05Z" 1871 } 1872 ] 1873 }`) 1874 }) 1875 1876 ctx := context.Background() 1877 opts := &ListExternalGroupsOptions{ 1878 DisplayName: Ptr("Octocat"), 1879 } 1880 list, _, err := client.Teams.ListExternalGroups(ctx, "o", opts) 1881 if err != nil { 1882 t.Errorf("Teams.ListExternalGroups returned error: %v", err) 1883 } 1884 1885 want := &ExternalGroupList{ 1886 Groups: []*ExternalGroup{ 1887 { 1888 GroupID: Ptr(int64(123)), 1889 GroupName: Ptr("Octocat admins"), 1890 UpdatedAt: &Timestamp{Time: referenceTime}, 1891 }, 1892 }, 1893 } 1894 if !cmp.Equal(list, want) { 1895 t.Errorf("Teams.ListExternalGroups returned %+v, want %+v", list, want) 1896 } 1897 1898 const methodName = "ListExternalGroups" 1899 testBadOptions(t, methodName, func() (err error) { 1900 _, _, err = client.Teams.ListExternalGroups(ctx, "\n", opts) 1901 return err 1902 }) 1903 1904 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1905 got, resp, err := client.Teams.ListExternalGroups(ctx, "o", opts) 1906 if got != nil { 1907 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1908 } 1909 return resp, err 1910 }) 1911 } 1912 1913 func TestTeamsService_ListExternalGroups_notFound(t *testing.T) { 1914 t.Parallel() 1915 client, mux, _ := setup(t) 1916 1917 mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) { 1918 testMethod(t, r, "GET") 1919 w.WriteHeader(http.StatusNotFound) 1920 }) 1921 1922 ctx := context.Background() 1923 eg, resp, err := client.Teams.ListExternalGroups(ctx, "o", nil) 1924 if err == nil { 1925 t.Error("Expected HTTP 404 response") 1926 } 1927 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 1928 t.Errorf("Teams.ListExternalGroups returned status %d, want %d", got, want) 1929 } 1930 if eg != nil { 1931 t.Errorf("Teams.ListExternalGroups returned %+v, want nil", eg) 1932 } 1933 } 1934 1935 func TestTeamsService_ListExternalGroupsForTeamBySlug(t *testing.T) { 1936 t.Parallel() 1937 client, mux, _ := setup(t) 1938 1939 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 1940 testMethod(t, r, "GET") 1941 fmt.Fprint(w, `{ 1942 "groups": [ 1943 { 1944 "group_id": 123, 1945 "group_name": "Octocat admins", 1946 "updated_at": "2006-01-02T15:04:05Z" 1947 } 1948 ] 1949 }`) 1950 }) 1951 1952 ctx := context.Background() 1953 list, _, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") 1954 if err != nil { 1955 t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned error: %v", err) 1956 } 1957 1958 want := &ExternalGroupList{ 1959 Groups: []*ExternalGroup{ 1960 { 1961 GroupID: Ptr(int64(123)), 1962 GroupName: Ptr("Octocat admins"), 1963 UpdatedAt: &Timestamp{Time: referenceTime}, 1964 }, 1965 }, 1966 } 1967 if !cmp.Equal(list, want) { 1968 t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want %+v", list, want) 1969 } 1970 1971 const methodName = "ListExternalGroupsForTeamBySlug" 1972 testBadOptions(t, methodName, func() (err error) { 1973 _, _, err = client.Teams.ListExternalGroupsForTeamBySlug(ctx, "\n", "\n") 1974 return err 1975 }) 1976 1977 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 1978 got, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") 1979 if got != nil { 1980 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 1981 } 1982 return resp, err 1983 }) 1984 } 1985 1986 func TestTeamsService_ListExternalGroupsForTeamBySlug_notFound(t *testing.T) { 1987 t.Parallel() 1988 client, mux, _ := setup(t) 1989 1990 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 1991 testMethod(t, r, "GET") 1992 w.WriteHeader(http.StatusNotFound) 1993 }) 1994 1995 ctx := context.Background() 1996 eg, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") 1997 if err == nil { 1998 t.Error("Expected HTTP 404 response") 1999 } 2000 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 2001 t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned status %d, want %d", got, want) 2002 } 2003 if eg != nil { 2004 t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want nil", eg) 2005 } 2006 } 2007 2008 func TestTeamsService_UpdateConnectedExternalGroup(t *testing.T) { 2009 t.Parallel() 2010 client, mux, _ := setup(t) 2011 2012 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 2013 testMethod(t, r, "PATCH") 2014 fmt.Fprint(w, `{ 2015 "group_id": 123, 2016 "group_name": "Octocat admins", 2017 "updated_at": "2006-01-02T15:04:05Z", 2018 "teams": [ 2019 { 2020 "team_id": 1, 2021 "team_name": "team-test" 2022 }, 2023 { 2024 "team_id": 2, 2025 "team_name": "team-test2" 2026 } 2027 ], 2028 "members": [ 2029 { 2030 "member_id": 1, 2031 "member_login": "mona-lisa_eocsaxrs", 2032 "member_name": "Mona Lisa", 2033 "member_email": "mona_lisa@github.com" 2034 }, 2035 { 2036 "member_id": 2, 2037 "member_login": "octo-lisa_eocsaxrs", 2038 "member_name": "Octo Lisa", 2039 "member_email": "octo_lisa@github.com" 2040 } 2041 ] 2042 }`) 2043 }) 2044 2045 ctx := context.Background() 2046 body := &ExternalGroup{ 2047 GroupID: Ptr(int64(123)), 2048 } 2049 externalGroup, _, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) 2050 if err != nil { 2051 t.Errorf("Teams.UpdateConnectedExternalGroup returned error: %v", err) 2052 } 2053 2054 want := &ExternalGroup{ 2055 GroupID: Ptr(int64(123)), 2056 GroupName: Ptr("Octocat admins"), 2057 UpdatedAt: &Timestamp{Time: referenceTime}, 2058 Teams: []*ExternalGroupTeam{ 2059 { 2060 TeamID: Ptr(int64(1)), 2061 TeamName: Ptr("team-test"), 2062 }, 2063 { 2064 TeamID: Ptr(int64(2)), 2065 TeamName: Ptr("team-test2"), 2066 }, 2067 }, 2068 Members: []*ExternalGroupMember{ 2069 { 2070 MemberID: Ptr(int64(1)), 2071 MemberLogin: Ptr("mona-lisa_eocsaxrs"), 2072 MemberName: Ptr("Mona Lisa"), 2073 MemberEmail: Ptr("mona_lisa@github.com"), 2074 }, 2075 { 2076 MemberID: Ptr(int64(2)), 2077 MemberLogin: Ptr("octo-lisa_eocsaxrs"), 2078 MemberName: Ptr("Octo Lisa"), 2079 MemberEmail: Ptr("octo_lisa@github.com"), 2080 }, 2081 }, 2082 } 2083 if !cmp.Equal(externalGroup, want) { 2084 t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want) 2085 } 2086 2087 const methodName = "UpdateConnectedExternalGroup" 2088 testBadOptions(t, methodName, func() (err error) { 2089 _, _, err = client.Teams.UpdateConnectedExternalGroup(ctx, "\n", "\n", body) 2090 return err 2091 }) 2092 2093 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 2094 got, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) 2095 if got != nil { 2096 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 2097 } 2098 return resp, err 2099 }) 2100 } 2101 2102 func TestTeamsService_UpdateConnectedExternalGroup_notFound(t *testing.T) { 2103 t.Parallel() 2104 client, mux, _ := setup(t) 2105 2106 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 2107 testMethod(t, r, "PATCH") 2108 w.WriteHeader(http.StatusNotFound) 2109 }) 2110 2111 ctx := context.Background() 2112 body := &ExternalGroup{ 2113 GroupID: Ptr(int64(123)), 2114 } 2115 eg, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) 2116 if err == nil { 2117 t.Error("Expected HTTP 404 response") 2118 } 2119 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 2120 t.Errorf("Teams.UpdateConnectedExternalGroup returned status %d, want %d", got, want) 2121 } 2122 if eg != nil { 2123 t.Errorf("Teams.UpdateConnectedExternalGroup returned %+v, want nil", eg) 2124 } 2125 } 2126 2127 func TestTeamsService_RemoveConnectedExternalGroup(t *testing.T) { 2128 t.Parallel() 2129 client, mux, _ := setup(t) 2130 2131 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 2132 testMethod(t, r, "DELETE") 2133 w.WriteHeader(http.StatusNoContent) 2134 }) 2135 2136 ctx := context.Background() 2137 _, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") 2138 if err != nil { 2139 t.Errorf("Teams.RemoveConnectedExternalGroup returned error: %v", err) 2140 } 2141 2142 const methodName = "RemoveConnectedExternalGroup" 2143 testBadOptions(t, methodName, func() (err error) { 2144 _, err = client.Teams.RemoveConnectedExternalGroup(ctx, "\n", "\n") 2145 return err 2146 }) 2147 2148 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 2149 return client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") 2150 }) 2151 } 2152 2153 func TestTeamsService_RemoveConnectedExternalGroup_notFound(t *testing.T) { 2154 t.Parallel() 2155 client, mux, _ := setup(t) 2156 2157 mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { 2158 testMethod(t, r, "DELETE") 2159 w.WriteHeader(http.StatusNotFound) 2160 }) 2161 2162 ctx := context.Background() 2163 resp, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") 2164 if err == nil { 2165 t.Error("Expected HTTP 404 response") 2166 } 2167 if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { 2168 t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want) 2169 } 2170 } 2171 2172 func TestIDPGroupList_Marshal(t *testing.T) { 2173 t.Parallel() 2174 testJSONMarshal(t, &IDPGroupList{}, "{}") 2175 2176 u := &IDPGroupList{ 2177 Groups: []*IDPGroup{ 2178 { 2179 GroupID: Ptr("abc1"), 2180 GroupName: Ptr("test group"), 2181 GroupDescription: Ptr("test group description"), 2182 }, 2183 { 2184 GroupID: Ptr("abc2"), 2185 GroupName: Ptr("test group2"), 2186 GroupDescription: Ptr("test group description2"), 2187 }, 2188 }, 2189 } 2190 2191 want := `{ 2192 "groups": [ 2193 { 2194 "group_id": "abc1", 2195 "group_name": "test group", 2196 "group_description": "test group description" 2197 }, 2198 { 2199 "group_id": "abc2", 2200 "group_name": "test group2", 2201 "group_description": "test group description2" 2202 } 2203 ] 2204 }` 2205 2206 testJSONMarshal(t, u, want) 2207 } 2208 2209 func TestExternalGroupMember_Marshal(t *testing.T) { 2210 t.Parallel() 2211 testJSONMarshal(t, &ExternalGroupMember{}, "{}") 2212 2213 u := &ExternalGroupMember{ 2214 MemberID: Ptr(int64(1)), 2215 MemberLogin: Ptr("test member"), 2216 MemberName: Ptr("test member name"), 2217 MemberEmail: Ptr("test member email"), 2218 } 2219 2220 want := `{ 2221 "member_id": 1, 2222 "member_login": "test member", 2223 "member_name":"test member name", 2224 "member_email":"test member email" 2225 }` 2226 2227 testJSONMarshal(t, u, want) 2228 } 2229 2230 func TestExternalGroup_Marshal(t *testing.T) { 2231 t.Parallel() 2232 testJSONMarshal(t, &ExternalGroup{}, "{}") 2233 2234 u := &ExternalGroup{ 2235 GroupID: Ptr(int64(123)), 2236 GroupName: Ptr("group1"), 2237 UpdatedAt: &Timestamp{referenceTime}, 2238 Teams: []*ExternalGroupTeam{ 2239 { 2240 TeamID: Ptr(int64(1)), 2241 TeamName: Ptr("team-test"), 2242 }, 2243 { 2244 TeamID: Ptr(int64(2)), 2245 TeamName: Ptr("team-test2"), 2246 }, 2247 }, 2248 Members: []*ExternalGroupMember{ 2249 { 2250 MemberID: Ptr(int64(1)), 2251 MemberLogin: Ptr("test"), 2252 MemberName: Ptr("test"), 2253 MemberEmail: Ptr("test@github.com"), 2254 }, 2255 }, 2256 } 2257 2258 want := `{ 2259 "group_id": 123, 2260 "group_name": "group1", 2261 "updated_at": ` + referenceTimeStr + `, 2262 "teams": [ 2263 { 2264 "team_id": 1, 2265 "team_name": "team-test" 2266 }, 2267 { 2268 "team_id": 2, 2269 "team_name": "team-test2" 2270 } 2271 ], 2272 "members": [ 2273 { 2274 "member_id": 1, 2275 "member_login": "test", 2276 "member_name": "test", 2277 "member_email": "test@github.com" 2278 } 2279 ] 2280 }` 2281 2282 testJSONMarshal(t, u, want) 2283 } 2284 2285 func TestExternalGroupTeam_Marshal(t *testing.T) { 2286 t.Parallel() 2287 testJSONMarshal(t, &ExternalGroupTeam{}, "{}") 2288 2289 u := &ExternalGroupTeam{ 2290 TeamID: Ptr(int64(123)), 2291 TeamName: Ptr("test"), 2292 } 2293 2294 want := `{ 2295 "team_id": 123, 2296 "team_name": "test" 2297 }` 2298 2299 testJSONMarshal(t, u, want) 2300 } 2301 2302 func TestListExternalGroupsOptions_Marshal(t *testing.T) { 2303 t.Parallel() 2304 testJSONMarshal(t, &ListExternalGroupsOptions{}, "{}") 2305 2306 u := &ListExternalGroupsOptions{ 2307 DisplayName: Ptr("test"), 2308 ListOptions: ListOptions{ 2309 Page: 1, 2310 PerPage: 2, 2311 }, 2312 } 2313 2314 want := `{ 2315 "DisplayName": "test", 2316 "page": 1, 2317 "PerPage": 2 2318 }` 2319 2320 testJSONMarshal(t, u, want) 2321 } 2322 2323 func TestTeamAddTeamRepoOptions_Marshal(t *testing.T) { 2324 t.Parallel() 2325 testJSONMarshal(t, &TeamAddTeamRepoOptions{}, "{}") 2326 2327 u := &TeamAddTeamRepoOptions{ 2328 Permission: "a", 2329 } 2330 2331 want := `{ 2332 "permission": "a" 2333 }` 2334 2335 testJSONMarshal(t, u, want) 2336 }