diff --git a/github/orgs_members.go b/github/orgs_members.go index 01a78c0..554cb1d 100644 --- a/github/orgs_members.go +++ b/github/orgs_members.go @@ -142,7 +142,8 @@ func (s *OrganizationsService) RemoveMember(org, user string) (*Response, error) return s.client.Do(req, nil) } -// PublicizeMembership publicizes a user's membership in an organization. +// PublicizeMembership publicizes a user's membership in an organization. (A +// user cannot publicize the membership for another user.) // // GitHub API docs: http://developer.github.com/v3/orgs/members/#publicize-a-users-membership func (s *OrganizationsService) PublicizeMembership(org, user string) (*Response, error) { @@ -202,12 +203,20 @@ func (s *OrganizationsService) ListOrgMemberships(opt *ListOrgMembershipsOptions return memberships, resp, err } -// GetOrgMembership gets the membership for the authenticated user for the -// specified organization. +// GetOrgMembership gets the membership for a user in a specified organization. +// Passing an empty string for user will get the membership for the +// authenticated user. // +// GitHub API docs: https://developer.github.com/v3/orgs/members/#get-organization-membership // GitHub API docs: https://developer.github.com/v3/orgs/members/#get-your-organization-membership -func (s *OrganizationsService) GetOrgMembership(org string) (*Membership, *Response, error) { - u := fmt.Sprintf("user/memberships/orgs/%v", org) +func (s *OrganizationsService) GetOrgMembership(user, org string) (*Membership, *Response, error) { + var u string + if user != "" { + u = fmt.Sprintf("orgs/%v/memberships/%v", org, user) + } else { + u = fmt.Sprintf("user/memberships/orgs/%v", org) + } + req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err @@ -222,12 +231,20 @@ func (s *OrganizationsService) GetOrgMembership(org string) (*Membership, *Respo return membership, resp, err } -// EditOrgMembership edits the membership for the authenticated user for the -// specified organization. +// EditOrgMembership edits the membership for user in specified organization. +// Passing an empty string for user will edit the membership for the +// authenticated user. // +// GitHub API docs: https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership // GitHub API docs: https://developer.github.com/v3/orgs/members/#edit-your-organization-membership -func (s *OrganizationsService) EditOrgMembership(org string, membership *Membership) (*Membership, *Response, error) { - u := fmt.Sprintf("user/memberships/orgs/%v", org) +func (s *OrganizationsService) EditOrgMembership(user, org string, membership *Membership) (*Membership, *Response, error) { + var u string + if user != "" { + u = fmt.Sprintf("orgs/%v/memberships/%v", org, user) + } else { + u = fmt.Sprintf("user/memberships/orgs/%v", org) + } + req, err := s.client.NewRequest("PATCH", u, membership) if err != nil { return nil, nil, err @@ -241,3 +258,17 @@ func (s *OrganizationsService) EditOrgMembership(org string, membership *Members return m, resp, err } + +// RemoveOrgMembership removes user from the specified organization. If the +// user has been invited to the organization, this will cancel their invitation. +// +// GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-organization-membership +func (s *OrganizationsService) RemoveOrgMembership(user, org string) (*Response, error) { + u := fmt.Sprintf("orgs/%v/memberships/%v", org, user) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} diff --git a/github/orgs_members_test.go b/github/orgs_members_test.go index 2bec813..973e3aa 100644 --- a/github/orgs_members_test.go +++ b/github/orgs_members_test.go @@ -242,7 +242,7 @@ func TestOrganizationsService_ListOrgMemberships(t *testing.T) { } } -func TestOrganizationsService_GetOrgMembership(t *testing.T) { +func TestOrganizationsService_GetOrgMembership_AuthenticatedUser(t *testing.T) { setup() defer teardown() @@ -251,7 +251,7 @@ func TestOrganizationsService_GetOrgMembership(t *testing.T) { fmt.Fprint(w, `{"url":"u"}`) }) - membership, _, err := client.Organizations.GetOrgMembership("o") + membership, _, err := client.Organizations.GetOrgMembership("", "o") if err != nil { t.Errorf("Organizations.GetOrgMembership returned error: %v", err) } @@ -262,7 +262,27 @@ func TestOrganizationsService_GetOrgMembership(t *testing.T) { } } -func TestOrganizationsService_EditOrgMembership(t *testing.T) { +func TestOrganizationsService_GetOrgMembership_SpecifiedUser(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"url":"u"}`) + }) + + membership, _, err := client.Organizations.GetOrgMembership("u", "o") + if err != nil { + t.Errorf("Organizations.GetOrgMembership returned error: %v", err) + } + + want := &Membership{URL: String("u")} + if !reflect.DeepEqual(membership, want) { + t.Errorf("Organizations.GetOrgMembership returned %+v, want %+v", membership, want) + } +} + +func TestOrganizationsService_EditOrgMembership_AuthenticatedUser(t *testing.T) { setup() defer teardown() @@ -280,7 +300,36 @@ func TestOrganizationsService_EditOrgMembership(t *testing.T) { fmt.Fprint(w, `{"url":"u"}`) }) - membership, _, err := client.Organizations.EditOrgMembership("o", input) + membership, _, err := client.Organizations.EditOrgMembership("", "o", input) + if err != nil { + t.Errorf("Organizations.EditOrgMembership returned error: %v", err) + } + + want := &Membership{URL: String("u")} + if !reflect.DeepEqual(membership, want) { + t.Errorf("Organizations.EditOrgMembership returned %+v, want %+v", membership, want) + } +} + +func TestOrganizationsService_EditOrgMembership_SpecifiedUser(t *testing.T) { + setup() + defer teardown() + + input := &Membership{State: String("active")} + + mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { + v := new(Membership) + json.NewDecoder(r.Body).Decode(v) + + testMethod(t, r, "PATCH") + if !reflect.DeepEqual(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + + fmt.Fprint(w, `{"url":"u"}`) + }) + + membership, _, err := client.Organizations.EditOrgMembership("u", "o", input) if err != nil { t.Errorf("Organizations.EditOrgMembership returned error: %v", err) } @@ -290,3 +339,18 @@ func TestOrganizationsService_EditOrgMembership(t *testing.T) { t.Errorf("Organizations.EditOrgMembership returned %+v, want %+v", membership, want) } } + +func TestOrganizationsService_RemoveOrgMembership(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + w.WriteHeader(http.StatusNoContent) + }) + + _, err := client.Organizations.RemoveOrgMembership("u", "o") + if err != nil { + t.Errorf("Organizations.RemoveOrgMembership returned error: %v", err) + } +}