diff --git a/github/orgs.go b/github/orgs.go index 2379d9a..4f74a32 100644 --- a/github/orgs.go +++ b/github/orgs.go @@ -334,3 +334,64 @@ func (s *OrganizationsService) RemoveTeamMember(team int, user string) error { _, err = s.client.Do(req, nil) return err } + +// ListTeamRepos lists the repositories that the specified team has access to. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-team-repos +func (s *OrganizationsService) ListTeamRepos(team int) ([]Repository, error) { + url_ := fmt.Sprintf("teams/%v/repos", team) + req, err := s.client.NewRequest("GET", url_, nil) + if err != nil { + return nil, err + } + + repos := new([]Repository) + _, err = s.client.Do(req, repos) + return *repos, err +} + +// CheckTeamRepo checks if a team manages the specified repository. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#get-team-repo +func (s *OrganizationsService) CheckTeamRepo(team int, owner string, repo string) (bool, error) { + url_ := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("GET", url_, nil) + if err != nil { + return false, err + } + + _, err = s.client.Do(req, nil) + return parseBoolResponse(err) +} + +// AddTeamRepo adds a repository to be managed by the specified team. The +// specified repository must be owned by the organization to which the team +// belongs, or a direct fork of a repository owned by the organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#add-team-repo +func (s *OrganizationsService) AddTeamRepo(team int, owner string, repo string) error { + url_ := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("PUT", url_, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + +// RemoveTeamRepo removes a repository from being managed by the specified +// team. Note that this does not delete the repository, it just removes it +// from the team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#remove-team-repo +func (s *OrganizationsService) RemoveTeamRepo(team int, owner string, repo string) error { + url_ := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("DELETE", url_, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} diff --git a/github/orgs_test.go b/github/orgs_test.go index 7cbddb5..fd958e6 100644 --- a/github/orgs_test.go +++ b/github/orgs_test.go @@ -729,3 +729,168 @@ func TestOrganizationsService_ConcealMembership_invalidOrg(t *testing.T) { t.Errorf("Expected URL parse error, got %+v", err) } } + +func TestOrganizationsService_ListTeamRepos(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos", func(w http.ResponseWriter, r *http.Request) { + if m := "GET"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + fmt.Fprint(w, `[{"id":1}]`) + }) + + members, err := client.Organizations.ListTeamRepos(1) + if err != nil { + t.Errorf("Organizations.ListTeamRepos returned error: %v", err) + } + + want := []Repository{Repository{ID: 1}} + if !reflect.DeepEqual(members, want) { + t.Errorf("Organizations.ListTeamRepos returned %+v, want %+v", members, want) + } +} + +func TestOrganizationsService_CheckTeamRepo_true(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "GET"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) + } + want := true + if managed != want { + t.Errorf("Organizations.CheckTeamRepo returned %+v, want %+v", managed, want) + } +} + +func TestOrganizationsService_CheckTeamRepo_false(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "GET"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + w.WriteHeader(http.StatusNotFound) + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) + } + want := false + if managed != want { + t.Errorf("Organizations.CheckTeamRepo returned %+v, want %+v", managed, want) + } +} + +func TestOrganizationsService_CheckTeamRepo_error(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "GET"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + http.Error(w, "BadRequest", http.StatusBadRequest) + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err == nil { + t.Errorf("Expected HTTP 400 response") + } + want := false + if managed != want { + t.Errorf("Organizations.CheckTeamRepo returned %+v, want %+v", managed, want) + } +} + +func TestOrganizationsService_CheckTeamRepo_invalidOwner(t *testing.T) { + _, err := client.Organizations.CheckTeamRepo(1, "%", "r") + 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_AddTeamRepo(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "PUT"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.AddTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.AddTeamRepo returned error: %v", err) + } +} + +func TestOrganizationsService_AddTeamRepo_noAccess(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "PUT"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + w.WriteHeader(422) + }) + + err := client.Organizations.AddTeamRepo(1, "o", "r") + if err == nil { + t.Errorf("Expcted error to be returned") + } +} + +func TestOrganizationsService_AddTeamRepo_invalidOwner(t *testing.T) { + err := client.Organizations.AddTeamRepo(1, "%", "r") + 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_RemoveTeamRepo(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + if m := "DELETE"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.RemoveTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.RemoveTeamRepo returned error: %v", err) + } +} + +func TestOrganizationsService_RemoveTeamRepo_invalidOwner(t *testing.T) { + err := client.Organizations.RemoveTeamRepo(1, "%", "r") + 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) + } +}