From 3869beb56ac972fa282fb596c814c8949ef28f90 Mon Sep 17 00:00:00 2001 From: Billy Lynch Date: Thu, 1 Aug 2013 11:21:24 -0400 Subject: [PATCH] Restructured Orgs Service Files. --- github/orgs.go | 307 ------------------ github/orgs_members.go | 112 +++++++ github/orgs_members_test.go | 206 ++++++++++++ github/orgs_teams.go | 215 +++++++++++++ github/orgs_teams_test.go | 431 +++++++++++++++++++++++++ github/orgs_test.go | 610 ------------------------------------ 6 files changed, 964 insertions(+), 917 deletions(-) create mode 100644 github/orgs_members.go create mode 100644 github/orgs_members_test.go create mode 100644 github/orgs_teams.go create mode 100644 github/orgs_teams_test.go diff --git a/github/orgs.go b/github/orgs.go index 162c3e0..ced8fff 100644 --- a/github/orgs.go +++ b/github/orgs.go @@ -30,18 +30,6 @@ type Organization struct { CreatedAt *time.Time `json:"created_at,omitempty"` } -// Team represents a team within a GitHub organization. Teams are used to -// manage access to an organization's repositories. -type Team struct { - ID int `json:"id,omitempty"` - Name string `json:"name,omitempty"` - URL string `json:"url,omitempty"` - Slug string `json:"slug,omitempty"` - Permission string `json:"permission,omitempty"` - MembersCount int `json:"members_count,omitempty"` - ReposCount int `json:"repos_count,omitempty"` -} - // List the organizations for a user. Passing the empty string will list // organizations for the authenticated user. // @@ -99,298 +87,3 @@ func (s *OrganizationsService) Edit(name string, org *Organization) (*Organizati _, err = s.client.Do(req, o) return o, err } - -// ListMembers lists the members for an organization. If the authenticated -// user is an owner of the organization, this will return both concealed and -// public members, otherwise it will only return public members. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#members-list -func (s *OrganizationsService) ListMembers(org string) ([]User, error) { - u := fmt.Sprintf("orgs/%v/members", org) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - members := new([]User) - _, err = s.client.Do(req, members) - return *members, err -} - -// ListPublicMembers lists the public members for an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#public-members-list -func (s *OrganizationsService) ListPublicMembers(org string) ([]User, error) { - u := fmt.Sprintf("orgs/%v/public_members", org) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - members := new([]User) - _, err = s.client.Do(req, members) - return *members, err -} - -// CheckMembership checks if a user is a member of an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#check-membership -func (s *OrganizationsService) CheckMembership(org, user string) (bool, error) { - u := fmt.Sprintf("orgs/%v/members/%v", org, user) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return false, err - } - - _, err = s.client.Do(req, nil) - return parseBoolResponse(err) -} - -// CheckPublicMembership checks if a user is a public member of an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#check-public-membership -func (s *OrganizationsService) CheckPublicMembership(org, user string) (bool, error) { - u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return false, err - } - - _, err = s.client.Do(req, nil) - return parseBoolResponse(err) -} - -// RemoveMember removes a user from all teams of an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#remove-a-member -func (s *OrganizationsService) RemoveMember(org, user string) error { - u := fmt.Sprintf("orgs/%v/members/%v", org, user) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} - -// PublicizeMembership publicizes a user's membership in an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#publicize-a-users-membership -func (s *OrganizationsService) PublicizeMembership(org, user string) error { - u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) - req, err := s.client.NewRequest("PUT", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} - -// ConcealMembership conceals a user's membership in an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/members/#conceal-a-users-membership -func (s *OrganizationsService) ConcealMembership(org, user string) error { - u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} - -// ListTeams lists all of the teams for an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-teams -func (s *OrganizationsService) ListTeams(org string) ([]Team, error) { - u := fmt.Sprintf("orgs/%v/teams", org) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - teams := new([]Team) - _, err = s.client.Do(req, teams) - return *teams, err -} - -// GetTeam fetches a team by ID. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#get-team -func (s *OrganizationsService) GetTeam(team int) (*Team, error) { - u := fmt.Sprintf("teams/%v", team) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - t := new(Team) - _, err = s.client.Do(req, t) - return t, err -} - -// CreateTeam creates a new team within an organization. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#create-team -func (s *OrganizationsService) CreateTeam(org string, team *Team) (*Team, error) { - u := fmt.Sprintf("orgs/%v/teams", org) - req, err := s.client.NewRequest("POST", u, team) - if err != nil { - return nil, err - } - - t := new(Team) - _, err = s.client.Do(req, t) - return t, err -} - -// EditTeam edits a team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#edit-team -func (s *OrganizationsService) EditTeam(id int, team *Team) (*Team, error) { - u := fmt.Sprintf("teams/%v", id) - req, err := s.client.NewRequest("PATCH", u, team) - if err != nil { - return nil, err - } - - t := new(Team) - _, err = s.client.Do(req, t) - return t, err -} - -// DeleteTeam deletes a team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#delete-team -func (s *OrganizationsService) DeleteTeam(team int) error { - u := fmt.Sprintf("teams/%v", team) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} - -// ListTeamMembers lists all of the users who are members of the specified -// team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-team-members -func (s *OrganizationsService) ListTeamMembers(team int) ([]User, error) { - u := fmt.Sprintf("teams/%v/members", team) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - members := new([]User) - _, err = s.client.Do(req, members) - return *members, err -} - -// CheckTeamMembership checks if a user is a member of the specified team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#get-team-member -func (s *OrganizationsService) CheckTeamMembership(team int, user string) (bool, error) { - u := fmt.Sprintf("teams/%v/members/%v", team, user) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return false, err - } - - _, err = s.client.Do(req, nil) - return parseBoolResponse(err) -} - -// AddTeamMember adds a user to a team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#add-team-member -func (s *OrganizationsService) AddTeamMember(team int, user string) error { - u := fmt.Sprintf("teams/%v/members/%v", team, user) - req, err := s.client.NewRequest("PUT", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} - -// RemoveTeamMember removes a user from a team. -// -// GitHub API docs: http://developer.github.com/v3/orgs/teams/#remove-team-member -func (s *OrganizationsService) RemoveTeamMember(team int, user string) error { - u := fmt.Sprintf("teams/%v/members/%v", team, user) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - _, 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) { - u := fmt.Sprintf("teams/%v/repos", team) - req, err := s.client.NewRequest("GET", u, 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) { - u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) - req, err := s.client.NewRequest("GET", u, 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 { - u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) - req, err := s.client.NewRequest("PUT", u, 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 { - u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - _, err = s.client.Do(req, nil) - return err -} diff --git a/github/orgs_members.go b/github/orgs_members.go new file mode 100644 index 0000000..48a8c73 --- /dev/null +++ b/github/orgs_members.go @@ -0,0 +1,112 @@ +// Copyright 2013 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" +) + +// ListMembers lists the members for an organization. If the authenticated +// user is an owner of the organization, this will return both concealed and +// public members, otherwise it will only return public members. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#members-list +func (s *OrganizationsService) ListMembers(org string) ([]User, error) { + u := fmt.Sprintf("orgs/%v/members", org) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + members := new([]User) + _, err = s.client.Do(req, members) + return *members, err +} + +// ListPublicMembers lists the public members for an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#public-members-list +func (s *OrganizationsService) ListPublicMembers(org string) ([]User, error) { + u := fmt.Sprintf("orgs/%v/public_members", org) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + members := new([]User) + _, err = s.client.Do(req, members) + return *members, err +} + +// CheckMembership checks if a user is a member of an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#check-membership +func (s *OrganizationsService) CheckMembership(org, user string) (bool, error) { + u := fmt.Sprintf("orgs/%v/members/%v", org, user) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return false, err + } + + _, err = s.client.Do(req, nil) + return parseBoolResponse(err) +} + +// CheckPublicMembership checks if a user is a public member of an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#check-public-membership +func (s *OrganizationsService) CheckPublicMembership(org, user string) (bool, error) { + u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return false, err + } + + _, err = s.client.Do(req, nil) + return parseBoolResponse(err) +} + +// RemoveMember removes a user from all teams of an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#remove-a-member +func (s *OrganizationsService) RemoveMember(org, user string) error { + u := fmt.Sprintf("orgs/%v/members/%v", org, user) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + +// PublicizeMembership publicizes a user's membership in an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#publicize-a-users-membership +func (s *OrganizationsService) PublicizeMembership(org, user string) error { + u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) + req, err := s.client.NewRequest("PUT", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + +// ConcealMembership conceals a user's membership in an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/members/#conceal-a-users-membership +func (s *OrganizationsService) ConcealMembership(org, user string) error { + u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} diff --git a/github/orgs_members_test.go b/github/orgs_members_test.go new file mode 100644 index 0000000..fe28c7a --- /dev/null +++ b/github/orgs_members_test.go @@ -0,0 +1,206 @@ +// Copyright 2013 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" + "net/http" + "reflect" + "testing" +) + +func TestOrganizationsService_ListMembers(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/members", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[{"id":1}]`) + }) + + members, err := client.Organizations.ListMembers("o") + if err != nil { + t.Errorf("Organizations.ListMembers returned error: %v", err) + } + + want := []User{User{ID: 1}} + if !reflect.DeepEqual(members, want) { + t.Errorf("Organizations.ListMembers returned %+v, want %+v", members, want) + } +} + +func TestOrganizationsService_ListMembers_invalidOrg(t *testing.T) { + _, err := client.Organizations.ListMembers("%") + testURLParseError(t, err) +} + +func TestOrganizationsService_ListPublicMembers(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[{"id":1}]`) + }) + + members, err := client.Organizations.ListPublicMembers("o") + if err != nil { + t.Errorf("Organizations.ListPublicMembers returned error: %v", err) + } + + want := []User{User{ID: 1}} + if !reflect.DeepEqual(members, want) { + t.Errorf("Organizations.ListPublicMembers returned %+v, want %+v", members, want) + } +} + +func TestOrganizationsService_ListPublicMembers_invalidOrg(t *testing.T) { + _, err := client.Organizations.ListPublicMembers("%") + testURLParseError(t, err) +} + +func TestOrganizationsService_CheckMembership(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNoContent) + }) + + member, err := client.Organizations.CheckMembership("o", "u") + if err != nil { + t.Errorf("Organizations.CheckMembership returned error: %v", err) + } + if want := true; member != want { + t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 404 response is interpreted as "false" and not an error +func TestOrganizationsService_CheckMembership_notMember(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNotFound) + }) + + member, err := client.Organizations.CheckMembership("o", "u") + if err != nil { + t.Errorf("Organizations.CheckMembership returned error: %+v", err) + } + if want := false; member != want { + t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 400 response is interpreted as an actual error, and not simply +// as "false" like the above case of a 404 +func TestOrganizationsService_CheckMembership_error(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + http.Error(w, "BadRequest", http.StatusBadRequest) + }) + + member, err := client.Organizations.CheckMembership("o", "u") + if err == nil { + t.Errorf("Expected HTTP 400 response") + } + if want := false; member != want { + t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) + } +} + +func TestOrganizationsService_CheckMembership_invalidOrg(t *testing.T) { + _, err := client.Organizations.CheckMembership("%", "u") + testURLParseError(t, err) +} + +func TestOrganizationsService_CheckPublicMembership(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNoContent) + }) + + member, err := client.Organizations.CheckPublicMembership("o", "u") + if err != nil { + t.Errorf("Organizations.CheckPublicMembership returned error: %v", err) + } + if want := true; member != want { + t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 404 response is interpreted as "false" and not an error +func TestOrganizationsService_CheckPublicMembership_notMember(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNotFound) + }) + + member, err := client.Organizations.CheckPublicMembership("o", "u") + if err != nil { + t.Errorf("Organizations.CheckPublicMembership returned error: %v", err) + } + if want := false; member != want { + t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 400 response is interpreted as an actual error, and not simply +// as "false" like the above case of a 404 +func TestOrganizationsService_CheckPublicMembership_error(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + http.Error(w, "BadRequest", http.StatusBadRequest) + }) + + member, err := client.Organizations.CheckPublicMembership("o", "u") + if err == nil { + t.Errorf("Expected HTTP 400 response") + } + if want := false; member != want { + t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) + } +} + +func TestOrganizationsService_CheckPublicMembership_invalidOrg(t *testing.T) { + _, err := client.Organizations.CheckPublicMembership("%", "u") + testURLParseError(t, err) +} + +func TestOrganizationsService_RemoveMember(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + }) + + err := client.Organizations.RemoveMember("o", "u") + if err != nil { + t.Errorf("Organizations.RemoveMember returned error: %v", err) + } +} + +func TestOrganizationsService_RemoveMember_invalidOrg(t *testing.T) { + err := client.Organizations.RemoveMember("%", "u") + testURLParseError(t, err) +} diff --git a/github/orgs_teams.go b/github/orgs_teams.go new file mode 100644 index 0000000..b55dec7 --- /dev/null +++ b/github/orgs_teams.go @@ -0,0 +1,215 @@ +// Copyright 2013 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" +) + +// Team represents a team within a GitHub organization. Teams are used to +// manage access to an organization's repositories. +type Team struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + URL string `json:"url,omitempty"` + Slug string `json:"slug,omitempty"` + Permission string `json:"permission,omitempty"` + MembersCount int `json:"members_count,omitempty"` + ReposCount int `json:"repos_count,omitempty"` +} + +// ListTeams lists all of the teams for an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-teams +func (s *OrganizationsService) ListTeams(org string) ([]Team, error) { + u := fmt.Sprintf("orgs/%v/teams", org) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + teams := new([]Team) + _, err = s.client.Do(req, teams) + return *teams, err +} + +// GetTeam fetches a team by ID. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#get-team +func (s *OrganizationsService) GetTeam(team int) (*Team, error) { + u := fmt.Sprintf("teams/%v", team) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// CreateTeam creates a new team within an organization. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#create-team +func (s *OrganizationsService) CreateTeam(org string, team *Team) (*Team, error) { + u := fmt.Sprintf("orgs/%v/teams", org) + req, err := s.client.NewRequest("POST", u, team) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// EditTeam edits a team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#edit-team +func (s *OrganizationsService) EditTeam(id int, team *Team) (*Team, error) { + u := fmt.Sprintf("teams/%v", id) + req, err := s.client.NewRequest("PATCH", u, team) + if err != nil { + return nil, err + } + + t := new(Team) + _, err = s.client.Do(req, t) + return t, err +} + +// DeleteTeam deletes a team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#delete-team +func (s *OrganizationsService) DeleteTeam(team int) error { + u := fmt.Sprintf("teams/%v", team) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + +// ListTeamMembers lists all of the users who are members of the specified +// team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-team-members +func (s *OrganizationsService) ListTeamMembers(team int) ([]User, error) { + u := fmt.Sprintf("teams/%v/members", team) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, err + } + + members := new([]User) + _, err = s.client.Do(req, members) + return *members, err +} + +// CheckTeamMembership checks if a user is a member of the specified team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#get-team-member +func (s *OrganizationsService) CheckTeamMembership(team int, user string) (bool, error) { + u := fmt.Sprintf("teams/%v/members/%v", team, user) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return false, err + } + + _, err = s.client.Do(req, nil) + return parseBoolResponse(err) +} + +// AddTeamMember adds a user to a team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#add-team-member +func (s *OrganizationsService) AddTeamMember(team int, user string) error { + u := fmt.Sprintf("teams/%v/members/%v", team, user) + req, err := s.client.NewRequest("PUT", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} + +// RemoveTeamMember removes a user from a team. +// +// GitHub API docs: http://developer.github.com/v3/orgs/teams/#remove-team-member +func (s *OrganizationsService) RemoveTeamMember(team int, user string) error { + u := fmt.Sprintf("teams/%v/members/%v", team, user) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return err + } + + _, 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) { + u := fmt.Sprintf("teams/%v/repos", team) + req, err := s.client.NewRequest("GET", u, 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) { + u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("GET", u, 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 { + u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("PUT", u, 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 { + u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return err + } + + _, err = s.client.Do(req, nil) + return err +} diff --git a/github/orgs_teams_test.go b/github/orgs_teams_test.go new file mode 100644 index 0000000..00cdc78 --- /dev/null +++ b/github/orgs_teams_test.go @@ -0,0 +1,431 @@ +// Copyright 2013 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "encoding/json" + "fmt" + "net/http" + "reflect" + "testing" +) + +func TestOrganizationsService_ListTeams(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[{"id":1}]`) + }) + + teams, err := client.Organizations.ListTeams("o") + if err != nil { + t.Errorf("Organizations.ListTeams returned error: %v", err) + } + + want := []Team{Team{ID: 1}} + if !reflect.DeepEqual(teams, want) { + t.Errorf("Organizations.ListTeams returned %+v, want %+v", teams, want) + } +} + +func TestOrganizationsService_ListTeams_invalidOrg(t *testing.T) { + _, err := client.Organizations.ListTeams("%") + testURLParseError(t, err) +} + +func TestOrganizationsService_GetTeam(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "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) + + testMethod(t, r, "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) + testURLParseError(t, 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) + + testMethod(t, r, "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) { + testMethod(t, r, "DELETE") + }) + + err := client.Organizations.DeleteTeam(1) + if err != nil { + t.Errorf("Organizations.DeleteTeam returned error: %v", err) + } +} + +func TestOrganizationsService_ListTeamMembers(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[{"id":1}]`) + }) + + members, err := client.Organizations.ListTeamMembers(1) + if err != nil { + t.Errorf("Organizations.ListTeamMembers returned error: %v", err) + } + + want := []User{User{ID: 1}} + if !reflect.DeepEqual(members, want) { + t.Errorf("Organizations.ListTeamMembers returned %+v, want %+v", members, want) + } +} + +func TestOrganizationsService_CheckTeamMembership_true(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + }) + + member, err := client.Organizations.CheckTeamMembership(1, "u") + if err != nil { + t.Errorf("Organizations.CheckTeamMembership returned error: %v", err) + } + if want := true; member != want { + t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 404 response is interpreted as "false" and not an error +func TestOrganizationsService_CheckTeamMembership_false(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNotFound) + }) + + member, err := client.Organizations.CheckTeamMembership(1, "u") + if err != nil { + t.Errorf("Organizations.CheckTeamMembership returned error: %+v", err) + } + if want := false; member != want { + t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) + } +} + +// ensure that a 400 response is interpreted as an actual error, and not simply +// as "false" like the above case of a 404 +func TestOrganizationsService_CheckTeamMembership_error(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + http.Error(w, "BadRequest", http.StatusBadRequest) + }) + + member, err := client.Organizations.CheckTeamMembership(1, "u") + if err == nil { + t.Errorf("Expected HTTP 400 response") + } + if want := false; member != want { + t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) + } +} + +func TestOrganizationsService_CheckMembership_invalidUser(t *testing.T) { + _, err := client.Organizations.CheckTeamMembership(1, "%") + testURLParseError(t, err) +} + +func TestOrganizationsService_AddTeamMember(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.AddTeamMember(1, "u") + if err != nil { + t.Errorf("Organizations.AddTeamMember returned error: %v", err) + } +} + +func TestOrganizationsService_AddTeamMember_invalidUser(t *testing.T) { + err := client.Organizations.AddTeamMember(1, "%") + testURLParseError(t, err) +} + +func TestOrganizationsService_RemoveTeamMember(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.RemoveTeamMember(1, "u") + if err != nil { + t.Errorf("Organizations.RemoveTeamMember returned error: %v", err) + } +} + +func TestOrganizationsService_RemoveTeamMember_invalidUser(t *testing.T) { + err := client.Organizations.RemoveTeamMember(1, "%") + testURLParseError(t, err) +} + +func TestOrganizationsService_PublicizeMembership(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.PublicizeMembership("o", "u") + if err != nil { + t.Errorf("Organizations.PublicizeMembership returned error: %v", err) + } +} + +func TestOrganizationsService_PublicizeMembership_invalidOrg(t *testing.T) { + err := client.Organizations.PublicizeMembership("%", "u") + testURLParseError(t, err) +} + +func TestOrganizationsService_ConcealMembership(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + w.WriteHeader(http.StatusNoContent) + }) + + err := client.Organizations.ConcealMembership("o", "u") + if err != nil { + t.Errorf("Organizations.ConcealMembership returned error: %v", err) + } +} + +func TestOrganizationsService_ConcealMembership_invalidOrg(t *testing.T) { + err := client.Organizations.ConcealMembership("%", "u") + testURLParseError(t, err) +} + +func TestOrganizationsService_ListTeamRepos(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + 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) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNoContent) + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) + } + if want := true; 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) { + testMethod(t, r, "GET") + w.WriteHeader(http.StatusNotFound) + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err != nil { + t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) + } + if want := false; 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) { + testMethod(t, r, "GET") + http.Error(w, "BadRequest", http.StatusBadRequest) + }) + + managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") + if err == nil { + t.Errorf("Expected HTTP 400 response") + } + if want := false; 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") + testURLParseError(t, err) +} + +func TestOrganizationsService_AddTeamRepo(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + 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) { + testMethod(t, r, "PUT") + 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") + testURLParseError(t, err) +} + +func TestOrganizationsService_RemoveTeamRepo(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + 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") + testURLParseError(t, err) +} diff --git a/github/orgs_test.go b/github/orgs_test.go index 5e26107..dc3d8c3 100644 --- a/github/orgs_test.go +++ b/github/orgs_test.go @@ -118,613 +118,3 @@ func TestOrganizationsService_Edit_invalidOrg(t *testing.T) { _, err := client.Organizations.Edit("%", nil) testURLParseError(t, err) } - -func TestOrganizationsService_ListMembers(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/members", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - fmt.Fprint(w, `[{"id":1}]`) - }) - - members, err := client.Organizations.ListMembers("o") - if err != nil { - t.Errorf("Organizations.ListMembers returned error: %v", err) - } - - want := []User{User{ID: 1}} - if !reflect.DeepEqual(members, want) { - t.Errorf("Organizations.ListMembers returned %+v, want %+v", members, want) - } -} - -func TestOrganizationsService_ListMembers_invalidOrg(t *testing.T) { - _, err := client.Organizations.ListMembers("%") - testURLParseError(t, err) -} - -func TestOrganizationsService_ListPublicMembers(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - fmt.Fprint(w, `[{"id":1}]`) - }) - - members, err := client.Organizations.ListPublicMembers("o") - if err != nil { - t.Errorf("Organizations.ListPublicMembers returned error: %v", err) - } - - want := []User{User{ID: 1}} - if !reflect.DeepEqual(members, want) { - t.Errorf("Organizations.ListPublicMembers returned %+v, want %+v", members, want) - } -} - -func TestOrganizationsService_ListPublicMembers_invalidOrg(t *testing.T) { - _, err := client.Organizations.ListPublicMembers("%") - testURLParseError(t, err) -} - -func TestOrganizationsService_CheckMembership(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNoContent) - }) - - member, err := client.Organizations.CheckMembership("o", "u") - if err != nil { - t.Errorf("Organizations.CheckMembership returned error: %v", err) - } - if want := true; member != want { - t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 404 response is interpreted as "false" and not an error -func TestOrganizationsService_CheckMembership_notMember(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNotFound) - }) - - member, err := client.Organizations.CheckMembership("o", "u") - if err != nil { - t.Errorf("Organizations.CheckMembership returned error: %+v", err) - } - if want := false; member != want { - t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 400 response is interpreted as an actual error, and not simply -// as "false" like the above case of a 404 -func TestOrganizationsService_CheckMembership_error(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - http.Error(w, "BadRequest", http.StatusBadRequest) - }) - - member, err := client.Organizations.CheckMembership("o", "u") - if err == nil { - t.Errorf("Expected HTTP 400 response") - } - if want := false; member != want { - t.Errorf("Organizations.CheckMembership returned %+v, want %+v", member, want) - } -} - -func TestOrganizationsService_CheckMembership_invalidOrg(t *testing.T) { - _, err := client.Organizations.CheckMembership("%", "u") - testURLParseError(t, err) -} - -func TestOrganizationsService_CheckPublicMembership(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNoContent) - }) - - member, err := client.Organizations.CheckPublicMembership("o", "u") - if err != nil { - t.Errorf("Organizations.CheckPublicMembership returned error: %v", err) - } - if want := true; member != want { - t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 404 response is interpreted as "false" and not an error -func TestOrganizationsService_CheckPublicMembership_notMember(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNotFound) - }) - - member, err := client.Organizations.CheckPublicMembership("o", "u") - if err != nil { - t.Errorf("Organizations.CheckPublicMembership returned error: %v", err) - } - if want := false; member != want { - t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 400 response is interpreted as an actual error, and not simply -// as "false" like the above case of a 404 -func TestOrganizationsService_CheckPublicMembership_error(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - http.Error(w, "BadRequest", http.StatusBadRequest) - }) - - member, err := client.Organizations.CheckPublicMembership("o", "u") - if err == nil { - t.Errorf("Expected HTTP 400 response") - } - if want := false; member != want { - t.Errorf("Organizations.CheckPublicMembership returned %+v, want %+v", member, want) - } -} - -func TestOrganizationsService_CheckPublicMembership_invalidOrg(t *testing.T) { - _, err := client.Organizations.CheckPublicMembership("%", "u") - testURLParseError(t, err) -} - -func TestOrganizationsService_RemoveMember(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "DELETE") - }) - - err := client.Organizations.RemoveMember("o", "u") - if err != nil { - t.Errorf("Organizations.RemoveMember returned error: %v", err) - } -} - -func TestOrganizationsService_RemoveMember_invalidOrg(t *testing.T) { - err := client.Organizations.RemoveMember("%", "u") - testURLParseError(t, err) -} - -func TestOrganizationsService_ListTeams(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - fmt.Fprint(w, `[{"id":1}]`) - }) - - teams, err := client.Organizations.ListTeams("o") - if err != nil { - t.Errorf("Organizations.ListTeams returned error: %v", err) - } - - want := []Team{Team{ID: 1}} - if !reflect.DeepEqual(teams, want) { - t.Errorf("Organizations.ListTeams returned %+v, want %+v", teams, want) - } -} - -func TestOrganizationsService_ListTeams_invalidOrg(t *testing.T) { - _, err := client.Organizations.ListTeams("%") - testURLParseError(t, err) -} - -func TestOrganizationsService_GetTeam(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "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) - - testMethod(t, r, "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) - testURLParseError(t, 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) - - testMethod(t, r, "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) { - testMethod(t, r, "DELETE") - }) - - err := client.Organizations.DeleteTeam(1) - if err != nil { - t.Errorf("Organizations.DeleteTeam returned error: %v", err) - } -} - -func TestOrganizationsService_ListTeamMembers(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - fmt.Fprint(w, `[{"id":1}]`) - }) - - members, err := client.Organizations.ListTeamMembers(1) - if err != nil { - t.Errorf("Organizations.ListTeamMembers returned error: %v", err) - } - - want := []User{User{ID: 1}} - if !reflect.DeepEqual(members, want) { - t.Errorf("Organizations.ListTeamMembers returned %+v, want %+v", members, want) - } -} - -func TestOrganizationsService_CheckTeamMembership_true(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - }) - - member, err := client.Organizations.CheckTeamMembership(1, "u") - if err != nil { - t.Errorf("Organizations.CheckTeamMembership returned error: %v", err) - } - if want := true; member != want { - t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 404 response is interpreted as "false" and not an error -func TestOrganizationsService_CheckTeamMembership_false(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNotFound) - }) - - member, err := client.Organizations.CheckTeamMembership(1, "u") - if err != nil { - t.Errorf("Organizations.CheckTeamMembership returned error: %+v", err) - } - if want := false; member != want { - t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) - } -} - -// ensure that a 400 response is interpreted as an actual error, and not simply -// as "false" like the above case of a 404 -func TestOrganizationsService_CheckTeamMembership_error(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - http.Error(w, "BadRequest", http.StatusBadRequest) - }) - - member, err := client.Organizations.CheckTeamMembership(1, "u") - if err == nil { - t.Errorf("Expected HTTP 400 response") - } - if want := false; member != want { - t.Errorf("Organizations.CheckTeamMembership returned %+v, want %+v", member, want) - } -} - -func TestOrganizationsService_CheckMembership_invalidUser(t *testing.T) { - _, err := client.Organizations.CheckTeamMembership(1, "%") - testURLParseError(t, err) -} - -func TestOrganizationsService_AddTeamMember(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "PUT") - w.WriteHeader(http.StatusNoContent) - }) - - err := client.Organizations.AddTeamMember(1, "u") - if err != nil { - t.Errorf("Organizations.AddTeamMember returned error: %v", err) - } -} - -func TestOrganizationsService_AddTeamMember_invalidUser(t *testing.T) { - err := client.Organizations.AddTeamMember(1, "%") - testURLParseError(t, err) -} - -func TestOrganizationsService_RemoveTeamMember(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "DELETE") - w.WriteHeader(http.StatusNoContent) - }) - - err := client.Organizations.RemoveTeamMember(1, "u") - if err != nil { - t.Errorf("Organizations.RemoveTeamMember returned error: %v", err) - } -} - -func TestOrganizationsService_RemoveTeamMember_invalidUser(t *testing.T) { - err := client.Organizations.RemoveTeamMember(1, "%") - testURLParseError(t, err) -} - -func TestOrganizationsService_PublicizeMembership(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "PUT") - w.WriteHeader(http.StatusNoContent) - }) - - err := client.Organizations.PublicizeMembership("o", "u") - if err != nil { - t.Errorf("Organizations.PublicizeMembership returned error: %v", err) - } -} - -func TestOrganizationsService_PublicizeMembership_invalidOrg(t *testing.T) { - err := client.Organizations.PublicizeMembership("%", "u") - testURLParseError(t, err) -} - -func TestOrganizationsService_ConcealMembership(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "DELETE") - w.WriteHeader(http.StatusNoContent) - }) - - err := client.Organizations.ConcealMembership("o", "u") - if err != nil { - t.Errorf("Organizations.ConcealMembership returned error: %v", err) - } -} - -func TestOrganizationsService_ConcealMembership_invalidOrg(t *testing.T) { - err := client.Organizations.ConcealMembership("%", "u") - testURLParseError(t, err) -} - -func TestOrganizationsService_ListTeamRepos(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/repos", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "GET") - 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) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNoContent) - }) - - managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") - if err != nil { - t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) - } - if want := true; 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) { - testMethod(t, r, "GET") - w.WriteHeader(http.StatusNotFound) - }) - - managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") - if err != nil { - t.Errorf("Organizations.CheckTeamRepo returned error: %v", err) - } - if want := false; 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) { - testMethod(t, r, "GET") - http.Error(w, "BadRequest", http.StatusBadRequest) - }) - - managed, err := client.Organizations.CheckTeamRepo(1, "o", "r") - if err == nil { - t.Errorf("Expected HTTP 400 response") - } - if want := false; 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") - testURLParseError(t, err) -} - -func TestOrganizationsService_AddTeamRepo(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "PUT") - 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) { - testMethod(t, r, "PUT") - 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") - testURLParseError(t, err) -} - -func TestOrganizationsService_RemoveTeamRepo(t *testing.T) { - setup() - defer teardown() - - mux.HandleFunc("/teams/1/repos/o/r", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, "DELETE") - 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") - testURLParseError(t, err) -}