diff --git a/github/orgs.go b/github/orgs.go index c69bb33..d987a08 100644 --- a/github/orgs.go +++ b/github/orgs.go @@ -86,9 +86,9 @@ func (s *OrganizationsService) Edit(name string, org *Organization) (*Organizati return nil, err } - updatedOrg := new(Organization) - _, err = s.client.Do(req, updatedOrg) - return updatedOrg, err + o := new(Organization) + _, err = s.client.Do(req, o) + return o, err } // List the members for an organization. If the authenticated user is an owner @@ -214,6 +214,57 @@ func (s *OrganizationsService) ListTeams(org string) ([]Team, error) { return *teams, err } +// GetTeam fetches a team by ID. +func (s *OrganizationsService) GetTeam(team int) (*Team, error) { + url_ := fmt.Sprintf("teams/%v", team) + req, err := s.client.NewRequest("GET", url_, nil) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// CreateTeam creates a new team. +func (s *OrganizationsService) CreateTeam(org string, team *Team) (*Team, error) { + url_ := fmt.Sprintf("orgs/%v/teams", org) + req, err := s.client.NewRequest("POST", url_, team) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// EditTeam edits a team. +func (s *OrganizationsService) EditTeam(id int, team *Team) (*Team, error) { + url_ := fmt.Sprintf("teams/%v", id) + req, err := s.client.NewRequest("PATCH", url_, team) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// DeleteTeam deletes a team. +func (s *OrganizationsService) DeleteTeam(team int) error { + url_ := fmt.Sprintf("teams/%v", team) + req, err := s.client.NewRequest("DELETE", url_, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + // Add a user to a team. func (s *OrganizationsService) AddTeamMember(team int, user string) error { url_ := fmt.Sprintf("teams/%v/members/%v", team, user) diff --git a/github/orgs_test.go b/github/orgs_test.go index ac2fb48..dbe20bc 100644 --- a/github/orgs_test.go +++ b/github/orgs_test.go @@ -419,6 +419,116 @@ func TestOrganizationsService_ListTeams_invalidOrg(t *testing.T) { } } +func TestOrganizationsService_GetTeam(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1", func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("Request method = %v, want %v", r.Method, "GET") + } + fmt.Fprint(w, `{"id":1, "name":"n", "url":"u", "slug": "s", "permission":"p"}`) + }) + + team, err := client.Organizations.GetTeam(1) + if err != nil { + t.Errorf("Organizations.GetTeam returned error: %v", err) + } + + want := &Team{ID: 1, Name: "n", URL: "u", Slug: "s", Permission: "p"} + if !reflect.DeepEqual(team, want) { + t.Errorf("Organizations.GetTeam returned %+v, want %+v", team, want) + } +} + +func TestOrganizationsService_CreateTeam(t *testing.T) { + setup() + defer teardown() + + input := &Team{Name: "n"} + + mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { + v := new(Team) + json.NewDecoder(r.Body).Decode(v) + + if r.Method != "POST" { + t.Errorf("Request method = %v, want %v", r.Method, "POST") + } + if !reflect.DeepEqual(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + + fmt.Fprint(w, `{"id":1}`) + }) + + team, err := client.Organizations.CreateTeam("o", input) + if err != nil { + t.Errorf("Organizations.CreateTeam returned error: %v", err) + } + + want := &Team{ID: 1} + if !reflect.DeepEqual(team, want) { + t.Errorf("Organizations.CreateTeam returned %+v, want %+v", team, want) + } +} + +func TestOrganizationsService_CreateTeam_invalidOrg(t *testing.T) { + _, err := client.Organizations.CreateTeam("%", nil) + if err == nil { + t.Errorf("Expected error to be returned") + } + if err, ok := err.(*url.Error); !ok { + t.Errorf("Expected URL parse error, got %+v", err) + } +} + +func TestOrganizationsService_EditTeam(t *testing.T) { + setup() + defer teardown() + + input := &Team{Name: "n"} + + mux.HandleFunc("/teams/1", func(w http.ResponseWriter, r *http.Request) { + v := new(Team) + json.NewDecoder(r.Body).Decode(v) + + if r.Method != "PATCH" { + t.Errorf("Request method = %v, want %v", r.Method, "PATCH") + } + if !reflect.DeepEqual(v, input) { + t.Errorf("Request body = %+v, want %+v", v, input) + } + + fmt.Fprint(w, `{"id":1}`) + }) + + team, err := client.Organizations.EditTeam(1, input) + if err != nil { + t.Errorf("Organizations.EditTeam returned error: %v", err) + } + + want := &Team{ID: 1} + if !reflect.DeepEqual(team, want) { + t.Errorf("Organizations.EditTeam returned %+v, want %+v", team, want) + } +} + +func TestOrganizationsService_DeleteTeam(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1", func(w http.ResponseWriter, r *http.Request) { + if r.Method != "DELETE" { + t.Errorf("Request method = %v, want %v", r.Method, "DELETE") + } + }) + + err := client.Organizations.DeleteTeam(1) + if err != nil { + t.Errorf("Organizations.DeleteTeam returned error: %v", err) + } +} + func TestOrganizationsService_AddTeamMember(t *testing.T) { setup() defer teardown()