Skip to content

Commit 7512d91

Browse files
authored
Get open and closed milestones when milestones are filtered by title (cli#2209)
1 parent f31e49f commit 7512d91

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

api/queries_issue.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ func IssueList(client *Client, repo ghrepo.Interface, state string, labels []str
257257
return nil, err
258258
}
259259
} else {
260-
milestone, err = MilestoneByTitle(client, repo, milestoneString)
260+
milestone, err = MilestoneByTitle(client, repo, "all", milestoneString)
261261
if err != nil {
262262
return nil, err
263263
}

api/queries_repo.go

+19-6
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ func RepoMetadata(client *Client, repo ghrepo.Interface, input RepoMetadataInput
536536
if input.Milestones {
537537
count++
538538
go func() {
539-
milestones, err := RepoMilestones(client, repo)
539+
milestones, err := RepoMilestones(client, repo, "open")
540540
if err != nil {
541541
err = fmt.Errorf("error fetching milestones: %w", err)
542542
}
@@ -797,8 +797,8 @@ type RepoMilestone struct {
797797
Title string
798798
}
799799

800-
// RepoMilestones fetches all open milestones in a repository
801-
func RepoMilestones(client *Client, repo ghrepo.Interface) ([]RepoMilestone, error) {
800+
// RepoMilestones fetches milestones in a repository
801+
func RepoMilestones(client *Client, repo ghrepo.Interface, state string) ([]RepoMilestone, error) {
802802
type responseData struct {
803803
Repository struct {
804804
Milestones struct {
@@ -807,13 +807,26 @@ func RepoMilestones(client *Client, repo ghrepo.Interface) ([]RepoMilestone, err
807807
HasNextPage bool
808808
EndCursor string
809809
}
810-
} `graphql:"milestones(states: [OPEN], first: 100, after: $endCursor)"`
810+
} `graphql:"milestones(states: $states, first: 100, after: $endCursor)"`
811811
} `graphql:"repository(owner: $owner, name: $name)"`
812812
}
813813

814+
var states []githubv4.MilestoneState
815+
switch state {
816+
case "open":
817+
states = []githubv4.MilestoneState{"OPEN"}
818+
case "closed":
819+
states = []githubv4.MilestoneState{"CLOSED"}
820+
case "all":
821+
states = []githubv4.MilestoneState{"OPEN", "CLOSED"}
822+
default:
823+
return nil, fmt.Errorf("invalid state: %s", state)
824+
}
825+
814826
variables := map[string]interface{}{
815827
"owner": githubv4.String(repo.RepoOwner()),
816828
"name": githubv4.String(repo.RepoName()),
829+
"states": states,
817830
"endCursor": (*githubv4.String)(nil),
818831
}
819832

@@ -837,8 +850,8 @@ func RepoMilestones(client *Client, repo ghrepo.Interface) ([]RepoMilestone, err
837850
return milestones, nil
838851
}
839852

840-
func MilestoneByTitle(client *Client, repo ghrepo.Interface, title string) (*RepoMilestone, error) {
841-
milestones, err := RepoMilestones(client, repo)
853+
func MilestoneByTitle(client *Client, repo ghrepo.Interface, state, title string) (*RepoMilestone, error) {
854+
milestones, err := RepoMilestones(client, repo, state)
842855
if err != nil {
843856
return nil, err
844857
}

api/queries_repo_test.go

+51
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package api
22

33
import (
4+
"io"
5+
"net/http"
6+
"strings"
47
"testing"
58

69
"github.com/cli/cli/internal/ghrepo"
@@ -233,3 +236,51 @@ func sliceEqual(a, b []string) bool {
233236

234237
return true
235238
}
239+
240+
func Test_RepoMilestones(t *testing.T) {
241+
tests := []struct {
242+
state string
243+
want string
244+
wantErr bool
245+
}{
246+
{
247+
state: "open",
248+
want: `"states":["OPEN"]`,
249+
},
250+
{
251+
state: "closed",
252+
want: `"states":["CLOSED"]`,
253+
},
254+
{
255+
state: "all",
256+
want: `"states":["OPEN","CLOSED"]`,
257+
},
258+
{
259+
state: "invalid state",
260+
wantErr: true,
261+
},
262+
}
263+
for _, tt := range tests {
264+
var query string
265+
reg := &httpmock.Registry{}
266+
reg.Register(httpmock.MatchAny, func(req *http.Request) (*http.Response, error) {
267+
buf := new(strings.Builder)
268+
_, err := io.Copy(buf, req.Body)
269+
if err != nil {
270+
return nil, err
271+
}
272+
query = buf.String()
273+
return httpmock.StringResponse("{}")(req)
274+
})
275+
client := NewClient(ReplaceTripper(reg))
276+
277+
_, err := RepoMilestones(client, ghrepo.New("OWNER", "REPO"), tt.state)
278+
if (err != nil) != tt.wantErr {
279+
t.Errorf("RepoMilestones() error = %v, wantErr %v", err, tt.wantErr)
280+
return
281+
}
282+
if !strings.Contains(query, tt.want) {
283+
t.Errorf("query does not contain %v", tt.want)
284+
}
285+
}
286+
}

0 commit comments

Comments
 (0)