Skip to content

Commit 1830689

Browse files
feat: Add support for Enterprise Team Members APIs (#3873)
1 parent 4d9bd08 commit 1830689

File tree

2 files changed

+378
-0
lines changed

2 files changed

+378
-0
lines changed

github/enterprise_team.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,136 @@ func (s *EnterpriseService) DeleteTeam(ctx context.Context, enterprise, teamSlug
150150

151151
return resp, nil
152152
}
153+
154+
// ListTeamMembers lists all members of an enterprise team.
155+
//
156+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#list-members-in-an-enterprise-team
157+
//
158+
//meta:operation GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships
159+
func (s *EnterpriseService) ListTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, opt *ListOptions) ([]*User, *Response, error) {
160+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships", enterprise, enterpriseTeam)
161+
u, err := addOptions(u, opt)
162+
if err != nil {
163+
return nil, nil, err
164+
}
165+
166+
req, err := s.client.NewRequest("GET", u, nil)
167+
if err != nil {
168+
return nil, nil, err
169+
}
170+
171+
var members []*User
172+
resp, err := s.client.Do(ctx, req, &members)
173+
if err != nil {
174+
return nil, resp, err
175+
}
176+
177+
return members, resp, nil
178+
}
179+
180+
// BulkAddTeamMembers adds multiple members to an enterprise team.
181+
//
182+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#bulk-add-team-members
183+
//
184+
//meta:operation POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add
185+
func (s *EnterpriseService) BulkAddTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, username []string) ([]*User, *Response, error) {
186+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/add", enterprise, enterpriseTeam)
187+
req, err := s.client.NewRequest("POST", u, map[string][]string{"usernames": username})
188+
if err != nil {
189+
return nil, nil, err
190+
}
191+
192+
var members []*User
193+
resp, err := s.client.Do(ctx, req, &members)
194+
if err != nil {
195+
return nil, resp, err
196+
}
197+
198+
return members, resp, nil
199+
}
200+
201+
// BulkRemoveTeamMembers removes multiple members from an enterprise team.
202+
//
203+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#bulk-remove-team-members
204+
//
205+
//meta:operation POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove
206+
func (s *EnterpriseService) BulkRemoveTeamMembers(ctx context.Context, enterprise, enterpriseTeam string, username []string) ([]*User, *Response, error) {
207+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/remove", enterprise, enterpriseTeam)
208+
req, err := s.client.NewRequest("POST", u, map[string][]string{"usernames": username})
209+
if err != nil {
210+
return nil, nil, err
211+
}
212+
213+
var members []*User
214+
resp, err := s.client.Do(ctx, req, &members)
215+
if err != nil {
216+
return nil, resp, err
217+
}
218+
219+
return members, resp, nil
220+
}
221+
222+
// GetTeamMembership retrieves a team membership for a user in an enterprise team.
223+
//
224+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#get-enterprise-team-membership
225+
//
226+
//meta:operation GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
227+
func (s *EnterpriseService) GetTeamMembership(ctx context.Context, enterprise, enterpriseTeam, username string) (*User, *Response, error) {
228+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)
229+
230+
req, err := s.client.NewRequest("GET", u, nil)
231+
if err != nil {
232+
return nil, nil, err
233+
}
234+
235+
var membership *User
236+
resp, err := s.client.Do(ctx, req, &membership)
237+
if err != nil {
238+
return nil, resp, err
239+
}
240+
241+
return membership, resp, nil
242+
}
243+
244+
// AddTeamMember adds a member to an enterprise team.
245+
//
246+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#add-team-member
247+
//
248+
//meta:operation PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
249+
func (s *EnterpriseService) AddTeamMember(ctx context.Context, enterprise, enterpriseTeam, username string) (*User, *Response, error) {
250+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)
251+
252+
req, err := s.client.NewRequest("PUT", u, nil)
253+
if err != nil {
254+
return nil, nil, err
255+
}
256+
257+
var member *User
258+
resp, err := s.client.Do(ctx, req, &member)
259+
if err != nil {
260+
return nil, resp, err
261+
}
262+
263+
return member, resp, nil
264+
}
265+
266+
// RemoveTeamMember removes a member from an enterprise team.
267+
//
268+
// GitHub API docs: https://docs.github.com/rest/enterprise-teams/enterprise-team-members#remove-team-membership
269+
//
270+
//meta:operation DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
271+
func (s *EnterpriseService) RemoveTeamMember(ctx context.Context, enterprise, enterpriseTeam, username string) (*Response, error) {
272+
u := fmt.Sprintf("enterprises/%v/teams/%v/memberships/%v", enterprise, enterpriseTeam, username)
273+
274+
req, err := s.client.NewRequest("DELETE", u, nil)
275+
if err != nil {
276+
return nil, err
277+
}
278+
279+
resp, err := s.client.Do(ctx, req, nil)
280+
if err != nil {
281+
return resp, err
282+
}
283+
284+
return resp, nil
285+
}

github/enterprise_team_test.go

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,248 @@ func TestEnterpriseService_DeleteTeam(t *testing.T) {
234234
return client.Enterprise.DeleteTeam(ctx, "e", "t1")
235235
})
236236
}
237+
238+
func TestEnterpriseService_ListTeamMembers(t *testing.T) {
239+
t.Parallel()
240+
client, mux, _ := setup(t)
241+
242+
mux.HandleFunc("/enterprises/e/teams/t1/memberships", func(w http.ResponseWriter, r *http.Request) {
243+
testMethod(t, r, "GET")
244+
fmt.Fprint(w, `[{
245+
"login": "user1",
246+
"id": 1001,
247+
"url": "https://example.com/user1"
248+
}]`)
249+
})
250+
ctx := t.Context()
251+
opts := &ListOptions{Page: 1, PerPage: 10}
252+
got, _, err := client.Enterprise.ListTeamMembers(ctx, "e", "t1", opts)
253+
if err != nil {
254+
t.Fatalf("Enterprise.ListTeamMembers returned error: %v", err)
255+
}
256+
257+
want := []*User{
258+
{
259+
Login: Ptr("user1"),
260+
ID: Ptr(int64(1001)),
261+
URL: Ptr("https://example.com/user1"),
262+
},
263+
}
264+
265+
if !cmp.Equal(got, want) {
266+
t.Errorf("Enterprise.ListTeamMembers = %+v, want %+v", got, want)
267+
}
268+
269+
const methodName = "ListTeamMembers"
270+
testBadOptions(t, methodName, func() error {
271+
_, _, err := client.Enterprise.ListTeamMembers(ctx, "\n", "t1", opts)
272+
return err
273+
})
274+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
275+
got, resp, err := client.Enterprise.ListTeamMembers(ctx, "e", "t1", opts)
276+
if got != nil {
277+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
278+
}
279+
return resp, err
280+
})
281+
}
282+
283+
func TestEnterpriseService_BulkAddTeamMembers(t *testing.T) {
284+
t.Parallel()
285+
client, mux, _ := setup(t)
286+
287+
mux.HandleFunc("/enterprises/e/teams/t1/memberships/add", func(w http.ResponseWriter, r *http.Request) {
288+
testMethod(t, r, "POST")
289+
290+
fmt.Fprint(w, `[{
291+
"login": "u1",
292+
"id": 1
293+
},{
294+
"login": "u2",
295+
"id": 2
296+
}]`)
297+
})
298+
299+
ctx := t.Context()
300+
got, _, err := client.Enterprise.BulkAddTeamMembers(ctx, "e", "t1", []string{"u1", "u2"})
301+
if err != nil {
302+
t.Fatalf("BulkAddTeamMembers returned error: %v", err)
303+
}
304+
305+
want := []*User{
306+
{Login: Ptr("u1"), ID: Ptr(int64(1))},
307+
{Login: Ptr("u2"), ID: Ptr(int64(2))},
308+
}
309+
310+
if !cmp.Equal(got, want) {
311+
t.Errorf("BulkAddTeamMembers = %+v, want %+v", got, want)
312+
}
313+
314+
const methodName = "BulkAddTeamMembers"
315+
testBadOptions(t, methodName, func() error {
316+
_, _, err := client.Enterprise.BulkAddTeamMembers(ctx, "\n", "t1", []string{"u1"})
317+
return err
318+
})
319+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
320+
got, resp, err := client.Enterprise.BulkAddTeamMembers(ctx, "e", "t1", []string{"u1"})
321+
if got != nil {
322+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
323+
}
324+
return resp, err
325+
})
326+
}
327+
328+
func TestEnterpriseService_BulkRemoveTeamMembers(t *testing.T) {
329+
t.Parallel()
330+
client, mux, _ := setup(t)
331+
332+
mux.HandleFunc("/enterprises/e/teams/t1/memberships/remove", func(w http.ResponseWriter, r *http.Request) {
333+
testMethod(t, r, "POST")
334+
335+
fmt.Fprint(w, `[{
336+
"login": "u1",
337+
"id": 1
338+
},{
339+
"login": "u2",
340+
"id": 2
341+
}]`)
342+
})
343+
344+
ctx := t.Context()
345+
got, _, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "e", "t1", []string{"u1", "u2"})
346+
if err != nil {
347+
t.Fatalf("BulkRemoveTeamMembers returned error: %v", err)
348+
}
349+
350+
want := []*User{
351+
{Login: Ptr("u1"), ID: Ptr(int64(1))},
352+
{Login: Ptr("u2"), ID: Ptr(int64(2))},
353+
}
354+
355+
if !cmp.Equal(got, want) {
356+
t.Errorf("BulkRemoveTeamMembers = %+v, want %+v", got, want)
357+
}
358+
359+
const methodName = "BulkRemoveTeamMembers"
360+
testBadOptions(t, methodName, func() error {
361+
_, _, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "\n", "t1", []string{"u1"})
362+
return err
363+
})
364+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
365+
got, resp, err := client.Enterprise.BulkRemoveTeamMembers(ctx, "e", "t1", []string{"u1"})
366+
if got != nil {
367+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
368+
}
369+
return resp, err
370+
})
371+
}
372+
373+
func TestEnterpriseService_GetTeamMembership(t *testing.T) {
374+
t.Parallel()
375+
client, mux, _ := setup(t)
376+
377+
mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
378+
testMethod(t, r, "GET")
379+
fmt.Fprint(w, `{
380+
"login": "u1",
381+
"id": 10
382+
}`)
383+
})
384+
385+
ctx := t.Context()
386+
got, _, err := client.Enterprise.GetTeamMembership(ctx, "e", "t1", "u1")
387+
if err != nil {
388+
t.Fatalf("GetTeamMembership returned error: %v", err)
389+
}
390+
391+
want := &User{
392+
Login: Ptr("u1"),
393+
ID: Ptr(int64(10)),
394+
}
395+
396+
if !cmp.Equal(got, want) {
397+
t.Errorf("GetTeamMembership = %+v, want %+v", got, want)
398+
}
399+
400+
const methodName = "GetTeamMembership"
401+
testBadOptions(t, methodName, func() error {
402+
_, _, err := client.Enterprise.GetTeamMembership(ctx, "\n", "t1", "u1")
403+
return err
404+
})
405+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
406+
got, resp, err := client.Enterprise.GetTeamMembership(ctx, "e", "t1", "u1")
407+
if got != nil {
408+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
409+
}
410+
return resp, err
411+
})
412+
}
413+
414+
func TestEnterpriseService_AddTeamMember(t *testing.T) {
415+
t.Parallel()
416+
client, mux, _ := setup(t)
417+
418+
mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
419+
testMethod(t, r, "PUT")
420+
fmt.Fprint(w, `{
421+
"login": "u1",
422+
"id": 5
423+
}`)
424+
})
425+
426+
ctx := t.Context()
427+
got, _, err := client.Enterprise.AddTeamMember(ctx, "e", "t1", "u1")
428+
if err != nil {
429+
t.Fatalf("AddTeamMember returned error: %v", err)
430+
}
431+
432+
want := &User{
433+
Login: Ptr("u1"),
434+
ID: Ptr(int64(5)),
435+
}
436+
437+
if !cmp.Equal(got, want) {
438+
t.Errorf("AddTeamMember = %+v, want %+v", got, want)
439+
}
440+
441+
const methodName = "AddTeamMember"
442+
testBadOptions(t, methodName, func() error {
443+
_, _, err := client.Enterprise.AddTeamMember(ctx, "\n", "t1", "u1")
444+
return err
445+
})
446+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
447+
got, resp, err := client.Enterprise.AddTeamMember(ctx, "e", "t1", "u1")
448+
if got != nil {
449+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
450+
}
451+
return resp, err
452+
})
453+
}
454+
455+
func TestEnterpriseService_RemoveTeamMember(t *testing.T) {
456+
t.Parallel()
457+
client, mux, _ := setup(t)
458+
459+
mux.HandleFunc("/enterprises/e/teams/t1/memberships/u1", func(w http.ResponseWriter, r *http.Request) {
460+
testMethod(t, r, "DELETE")
461+
w.WriteHeader(http.StatusNoContent)
462+
})
463+
464+
ctx := t.Context()
465+
resp, err := client.Enterprise.RemoveTeamMember(ctx, "e", "t1", "u1")
466+
if err != nil {
467+
t.Fatalf("RemoveTeamMember returned error: %v", err)
468+
}
469+
if resp == nil {
470+
t.Fatal("RemoveTeamMember returned nil Response")
471+
}
472+
473+
const methodName = "RemoveTeamMember"
474+
testBadOptions(t, methodName, func() error {
475+
_, err := client.Enterprise.RemoveTeamMember(ctx, "\n", "t1", "u1")
476+
return err
477+
})
478+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
479+
return client.Enterprise.RemoveTeamMember(ctx, "e", "t1", "u1")
480+
})
481+
}

0 commit comments

Comments
 (0)