Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions github/enterprise_team.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,136 @@ func (s *EnterpriseService) DeleteTeam(ctx context.Context, enterprise, teamSlug

return resp, nil
}

// ListTeamMembers lists all members of an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#list-members-in-an-enterprise-team
//
//meta:operation GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships
func (s *EnterpriseService) ListTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, opt *ListOptions) ([]*User, *Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships", enterprise, enterpriseTeam)
u, err := addOptions(u, opt)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var members []*User
resp, err := s.client.Do(ctx, req, &members)
if err != nil {
return nil, resp, err
}

return members, resp, nil
}

// BulkAddTeamMembers adds multiple members to an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#bulk-add-team-members
//
//meta:operation POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add
func (s *EnterpriseService) BulkAddTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, username []string) ([]*User, *Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/add", enterprise, enterpriseTeam)
req, err := s.client.NewRequest("POST", u, map[string][]string{"usernames": username})
if err != nil {
return nil, nil, err
}

var members []*User
resp, err := s.client.Do(ctx, req, &members)
if err != nil {
return nil, resp, err
}

return members, resp, nil
}

// BulkRemoveTeamMembers removes multiple members from an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#bulk-remove-team-members
//
//meta:operation POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove
func (s *EnterpriseService) BulkRemoveTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, username []string) ([]*User, *Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/remove", enterprise, enterpriseTeam)
req, err := s.client.NewRequest("POST", u, map[string][]string{"usernames": username})
if err != nil {
return nil, nil, err
}

var members []*User
resp, err := s.client.Do(ctx, req, &members)
if err != nil {
return nil, resp, err
}

return members, resp, nil
}

// GetTeamMembership retrieves a team membership for a user in an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#get-enterprise-team-membership
//
//meta:operation GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
func (s *EnterpriseService) GetTeamMembership(ctx context.Context, enterprise, enterpriseTeam, username string) (*User, *Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)

req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

var membership *User
resp, err := s.client.Do(ctx, req, &membership)
if err != nil {
return nil, resp, err
}

return membership, resp, nil
}

// AddTeamMember adds a member to an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#add-team-member
//
//meta:operation PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
func (s *EnterpriseService) AddTeamMember(ctx context.Context, enterprise, enterpriseTeam, username string) (*User, *Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)

req, err := s.client.NewRequest("PUT", u, nil)
if err != nil {
return nil, nil, err
}

var member *User
resp, err := s.client.Do(ctx, req, &member)
if err != nil {
return nil, resp, err
}

return member, resp, nil
}

// RemoveTeamMember removes a member from an enterprise team.
//
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#remove-team-membership
//
//meta:operation DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
func (s *EnterpriseService) RemoveTeamMember(ctx context.Context, enterprise, enterpriseTeam, username string) (*Response, error) {
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)

req, err := s.client.NewRequest("DELETE", u, nil)
if err != nil {
return nil, err
}

resp, err := s.client.Do(ctx, req, nil)
if err != nil {
return resp, err
}

return resp, nil
}
245 changes: 245 additions & 0 deletions github/enterprise_team_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,3 +234,248 @@ func TestEnterpriseService_DeleteTeam(t *testing.T) {
return client.Enterprise.DeleteTeam(ctx, "e", "t1")
})
}

func TestEnterpriseService_ListTeamMembers(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `[{
"login": "user1",
"id": 1001,
"url": "https://example.com/user1"
}]`)
})
ctx := t.Context()
opts := &ListOptions{Page: 1, PerPage: 10}
got, _, err := client.Enterprise.ListTeamMembers(ctx, "e", "t1", opts)
if err != nil {
t.Fatalf("Enterprise.ListTeamMembers returned error: %v", err)
}

want := []*User{
{
Login: Ptr("user1"),
ID: Ptr(int64(1001)),
URL: Ptr("https://example.com/user1"),
},
}

if !cmp.Equal(got, want) {
t.Errorf("Enterprise.ListTeamMembers = %+v, want %+v", got, want)
}

const methodName = "ListTeamMembers"
testBadOptions(t, methodName, func() error {
_, _, err := client.Enterprise.ListTeamMembers(ctx, "\n", "t1", opts)
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Enterprise.ListTeamMembers(ctx, "e", "t1", opts)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestEnterpriseService_BulkAddTeamMembers(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships/add", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "POST")

fmt.Fprint(w, `[{
"login": "u1",
"id": 1
},{
"login": "u2",
"id": 2
}]`)
})

ctx := t.Context()
got, _, err := client.Enterprise.BulkAddTeamMembers(ctx, "e", "t1", []string{"u1", "u2"})
if err != nil {
t.Fatalf("BulkAddTeamMembers returned error: %v", err)
}

want := []*User{
{Login: Ptr("u1"), ID: Ptr(int64(1))},
{Login: Ptr("u2"), ID: Ptr(int64(2))},
}

if !cmp.Equal(got, want) {
t.Errorf("BulkAddTeamMembers = %+v, want %+v", got, want)
}

const methodName = "BulkAddTeamMembers"
testBadOptions(t, methodName, func() error {
_, _, err := client.Enterprise.BulkAddTeamMembers(ctx, "\n", "t1", []string{"u1"})
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Enterprise.BulkAddTeamMembers(ctx, "e", "t1", []string{"u1"})
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestEnterpriseService_BulkRemoveTeamMembers(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships/remove", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "POST")

fmt.Fprint(w, `[{
"login": "u1",
"id": 1
},{
"login": "u2",
"id": 2
}]`)
})

ctx := t.Context()
got, _, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "e", "t1", []string{"u1", "u2"})
if err != nil {
t.Fatalf("BulkRemoveTeamMembers returned error: %v", err)
}

want := []*User{
{Login: Ptr("u1"), ID: Ptr(int64(1))},
{Login: Ptr("u2"), ID: Ptr(int64(2))},
}

if !cmp.Equal(got, want) {
t.Errorf("BulkRemoveTeamMembers = %+v, want %+v", got, want)
}

const methodName = "BulkRemoveTeamMembers"
testBadOptions(t, methodName, func() error {
_, _, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "\n", "t1", []string{"u1"})
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "e", "t1", []string{"u1"})
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestEnterpriseService_GetTeamMembership(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{
"login": "u1",
"id": 10
}`)
})

ctx := t.Context()
got, _, err := client.Enterprise.GetTeamMembership(ctx, "e", "t1", "u1")
if err != nil {
t.Fatalf("GetTeamMembership returned error: %v", err)
}

want := &User{
Login: Ptr("u1"),
ID: Ptr(int64(10)),
}

if !cmp.Equal(got, want) {
t.Errorf("GetTeamMembership = %+v, want %+v", got, want)
}

const methodName = "GetTeamMembership"
testBadOptions(t, methodName, func() error {
_, _, err := client.Enterprise.GetTeamMembership(ctx, "\n", "t1", "u1")
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Enterprise.GetTeamMembership(ctx, "e", "t1", "u1")
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestEnterpriseService_AddTeamMember(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
fmt.Fprint(w, `{
"login": "u1",
"id": 5
}`)
})

ctx := t.Context()
got, _, err := client.Enterprise.AddTeamMember(ctx, "e", "t1", "u1")
if err != nil {
t.Fatalf("AddTeamMember returned error: %v", err)
}

want := &User{
Login: Ptr("u1"),
ID: Ptr(int64(5)),
}

if !cmp.Equal(got, want) {
t.Errorf("AddTeamMember = %+v, want %+v", got, want)
}

const methodName = "AddTeamMember"
testBadOptions(t, methodName, func() error {
_, _, err := client.Enterprise.AddTeamMember(ctx, "\n", "t1", "u1")
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Enterprise.AddTeamMember(ctx, "e", "t1", "u1")
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestEnterpriseService_RemoveTeamMember(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
w.WriteHeader(http.StatusNoContent)
})

ctx := t.Context()
resp, err := client.Enterprise.RemoveTeamMember(ctx, "e", "t1", "u1")
if err != nil {
t.Fatalf("RemoveTeamMember returned error: %v", err)
}
if resp == nil {
t.Fatal("RemoveTeamMember returned nil Response")
}

const methodName = "RemoveTeamMember"
testBadOptions(t, methodName, func() error {
_, err := client.Enterprise.RemoveTeamMember(ctx, "\n", "t1", "u1")
return err
})
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
return client.Enterprise.RemoveTeamMember(ctx, "e", "t1", "u1")
})
}
Loading