diff --git a/gitea/issue.go b/gitea/issue.go index 73243ee..498fa34 100644 --- a/gitea/issue.go +++ b/gitea/issue.go @@ -117,8 +117,8 @@ func (c *Client) ListUserIssues(opt ListIssueOption) ([]*Issue, error) { // ListRepoIssues returns all issues for a given repository func (c *Client) ListRepoIssues(owner, repo string, opt ListIssueOption) ([]*Issue, error) { link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues", owner, repo)) - issues := make([]*Issue, 0, 10) link.RawQuery = opt.QueryEncode() + issues := make([]*Issue, 0, 10) return issues, c.getParsedResponse("GET", link.String(), jsonHeader, nil, &issues) } diff --git a/gitea/issue_milestone.go b/gitea/issue_milestone.go index f316e17..dfbe1cc 100644 --- a/gitea/issue_milestone.go +++ b/gitea/issue_milestone.go @@ -8,6 +8,7 @@ import ( "bytes" "encoding/json" "fmt" + "net/url" "time" ) @@ -35,10 +36,34 @@ type Milestone struct { Deadline *time.Time `json:"due_on"` } +// ListMilestoneOption list milestone options +type ListMilestoneOption struct { + ListOptions + // open, closed, all + State StateType +} + +// QueryEncode turns options into querystring argument +func (opt *ListMilestoneOption) QueryEncode() string { + query := make(url.Values) + if opt.Page > 0 { + query.Add("page", fmt.Sprintf("%d", opt.Page)) + } + if opt.PageSize > 0 { + query.Add("limit", fmt.Sprintf("%d", opt.PageSize)) + } + if opt.State != "" { + query.Add("state", string(opt.State)) + } + return query.Encode() +} + // ListRepoMilestones list all the milestones of one repository -func (c *Client) ListRepoMilestones(owner, repo string) ([]*Milestone, error) { +func (c *Client) ListRepoMilestones(owner, repo string, opt ListMilestoneOption) ([]*Milestone, error) { + link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/milestones", owner, repo)) + link.RawQuery = opt.QueryEncode() milestones := make([]*Milestone, 0, 10) - return milestones, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones", owner, repo), nil, nil, &milestones) + return milestones, c.getParsedResponse("GET", link.String(), nil, nil, &milestones) } // GetMilestone get one milestone by repo name and milestone id diff --git a/gitea/issue_milestone_test.go b/gitea/issue_milestone_test.go new file mode 100644 index 0000000..3b0989a --- /dev/null +++ b/gitea/issue_milestone_test.go @@ -0,0 +1,57 @@ +// Copyright 2020 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" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestMilestones(t *testing.T) { + log.Println("== TestMilestones ==") + c := newTestClient() + + repo, _ := createTestRepo(t, "TestMilestones", c) + now := time.Now() + future := time.Unix(1896134400, 0) //2030-02-01 + closed := "closed" + + // CreateMilestone 4x + m1, err := c.CreateMilestone(repo.Owner.UserName, repo.Name, CreateMilestoneOption{Title: "v1.0", Description: "First Version", Deadline: &now}) + assert.NoError(t, err) + _, err = c.CreateMilestone(repo.Owner.UserName, repo.Name, CreateMilestoneOption{Title: "v2.0", Description: "Second Version", Deadline: &future}) + assert.NoError(t, err) + _, err = c.CreateMilestone(repo.Owner.UserName, repo.Name, CreateMilestoneOption{Title: "v3.0", Description: "Third Version", Deadline: nil}) + assert.NoError(t, err) + m4, err := c.CreateMilestone(repo.Owner.UserName, repo.Name, CreateMilestoneOption{Title: "temp", Description: "part time milestone"}) + assert.NoError(t, err) + + // EditMilestone + m1, err = c.EditMilestone(repo.Owner.UserName, repo.Name, m1.ID, EditMilestoneOption{Description: &closed, State: &closed}) + assert.NoError(t, err) + + // DeleteMilestone + assert.NoError(t, c.DeleteMilestone(repo.Owner.UserName, repo.Name, m4.ID)) + + // ListRepoMilestones + ml, err := c.ListRepoMilestones(repo.Owner.UserName, repo.Name, ListMilestoneOption{}) + assert.NoError(t, err) + assert.Len(t, ml, 2) + ml, err = c.ListRepoMilestones(repo.Owner.UserName, repo.Name, ListMilestoneOption{State: "closed"}) + assert.NoError(t, err) + assert.Len(t, ml, 1) + ml, err = c.ListRepoMilestones(repo.Owner.UserName, repo.Name, ListMilestoneOption{State: "all"}) + assert.NoError(t, err) + assert.Len(t, ml, 3) + + // GetMilestone + _, err = c.GetMilestone(repo.Owner.UserName, repo.Name, m4.ID) + assert.Error(t, err) + m, err := c.GetMilestone(repo.Owner.UserName, repo.Name, m1.ID) + assert.EqualValues(t, m1, m) +}