From dee0475f01641679431c7b81912329a9fa8c2bb9 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Fri, 13 Aug 2021 20:16:25 +0800 Subject: [PATCH] Add GetReviewers & GetAssignees (#534) close #525 Reviewed-on: https://gitea.com/gitea/go-sdk/pulls/534 Reviewed-by: Lunny Xiao Reviewed-by: Andrew Thornton Co-authored-by: 6543 <6543@obermui.de> Co-committed-by: 6543 <6543@obermui.de> --- gitea/repo_collaborator.go | 27 +++++++++++++++ gitea/repo_collaborator_test.go | 59 +++++++++++++++++++++++++++++++++ gitea/user_test.go | 9 +++++ 3 files changed, 95 insertions(+) create mode 100644 gitea/repo_collaborator_test.go diff --git a/gitea/repo_collaborator.go b/gitea/repo_collaborator.go index 2019e22..c766250 100644 --- a/gitea/repo_collaborator.go +++ b/gitea/repo_collaborator.go @@ -1,3 +1,4 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -107,3 +108,29 @@ func (c *Client) DeleteCollaborator(user, repo, collaborator string) (*Response, fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), nil, nil) return resp, err } + +// GetReviewers return all users that can be requested to review in this repo +func (c *Client) GetReviewers(user, repo string) ([]*User, *Response, error) { + if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { + return nil, nil, err + } + if err := escapeValidatePathSegments(&user, &repo); err != nil { + return nil, nil, err + } + reviewers := make([]*User, 0, 5) + resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/reviewers", user, repo), nil, nil, &reviewers) + return reviewers, resp, err +} + +// GetAssignees return all users that have write access and can be assigned to issues +func (c *Client) GetAssignees(user, repo string) ([]*User, *Response, error) { + if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { + return nil, nil, err + } + if err := escapeValidatePathSegments(&user, &repo); err != nil { + return nil, nil, err + } + assignees := make([]*User, 0, 5) + resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/assignees", user, repo), nil, nil, &assignees) + return assignees, resp, err +} diff --git a/gitea/repo_collaborator_test.go b/gitea/repo_collaborator_test.go new file mode 100644 index 0000000..b320b6a --- /dev/null +++ b/gitea/repo_collaborator_test.go @@ -0,0 +1,59 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package gitea + +import ( + "log" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRepoCollaborator(t *testing.T) { + log.Println("== TestRepoCollaborator ==") + c := newTestClient() + + repo, _ := createTestRepo(t, "RepoCollaborators", c) + createTestUser(t, "ping", c) + createTestUser(t, "pong", c) + defer c.AdminDeleteUser("ping") + defer c.AdminDeleteUser("pong") + + collaborators, _, err := c.ListCollaborators(repo.Owner.UserName, repo.Name, ListCollaboratorsOptions{}) + assert.NoError(t, err) + assert.Len(t, collaborators, 0) + + mode := AccessModeAdmin + resp, err := c.AddCollaborator(repo.Owner.UserName, repo.Name, "ping", AddCollaboratorOption{Permission: &mode}) + assert.NoError(t, err) + assert.EqualValues(t, 204, resp.StatusCode) + + mode = AccessModeRead + _, err = c.AddCollaborator(repo.Owner.UserName, repo.Name, "pong", AddCollaboratorOption{Permission: &mode}) + assert.NoError(t, err) + + collaborators, _, err = c.ListCollaborators(repo.Owner.UserName, repo.Name, ListCollaboratorsOptions{}) + assert.NoError(t, err) + assert.Len(t, collaborators, 2) + assert.EqualValues(t, []string{"ping", "pong"}, userToStringSlice(collaborators)) + + reviewers, _, err := c.GetReviewers(repo.Owner.UserName, repo.Name) + assert.NoError(t, err) + assert.Len(t, reviewers, 2) + assert.EqualValues(t, []string{"ping", "pong"}, userToStringSlice(reviewers)) + + assignees, _, err := c.GetAssignees(repo.Owner.UserName, repo.Name) + assert.NoError(t, err) + assert.Len(t, assignees, 2) + assert.EqualValues(t, []string{"ping", "test01"}, userToStringSlice(assignees)) + + resp, err = c.DeleteCollaborator(repo.Owner.UserName, repo.Name, "ping") + assert.NoError(t, err) + assert.EqualValues(t, 204, resp.StatusCode) + + collaborators, _, err = c.ListCollaborators(repo.Owner.UserName, repo.Name, ListCollaboratorsOptions{}) + assert.NoError(t, err) + assert.Len(t, collaborators, 1) +} diff --git a/gitea/user_test.go b/gitea/user_test.go index d12d409..246fe8b 100644 --- a/gitea/user_test.go +++ b/gitea/user_test.go @@ -206,3 +206,12 @@ func createTestUser(t *testing.T, username string, client *Client) *User { assert.NoError(t, err) return user } + +// userToStringSlice return string slice based on UserName of users +func userToStringSlice(users []*User) []string { + result := make([]string, 0, len(users)) + for i := range users { + result = append(result, users[i].UserName) + } + return result +}