X Tutup
Skip to content

Commit c4c233a

Browse files
committed
Make MetadataSurvey testable by accepting an interface
1 parent bb0ab3a commit c4c233a

File tree

4 files changed

+184
-13
lines changed

4 files changed

+184
-13
lines changed

pkg/cmd/issue/create/create.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,13 @@ func createRun(opts *CreateOptions) (err error) {
206206
}
207207

208208
if action == prShared.MetadataAction {
209-
err = prShared.MetadataSurvey(opts.IO, apiClient, baseRepo, &tb)
209+
fetcher := &prShared.MetadataFetcher{
210+
IO: opts.IO,
211+
APIClient: apiClient,
212+
Repo: baseRepo,
213+
State: &tb,
214+
}
215+
err = prShared.MetadataSurvey(opts.IO, baseRepo, fetcher, &tb)
210216
if err != nil {
211217
return
212218
}

pkg/cmd/pr/create/create.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,13 @@ func createRun(opts *CreateOptions) (err error) {
259259
}
260260

261261
if action == shared.MetadataAction {
262-
err = shared.MetadataSurvey(opts.IO, client, ctx.BaseRepo, state)
262+
fetcher := &shared.MetadataFetcher{
263+
IO: opts.IO,
264+
APIClient: client,
265+
Repo: ctx.BaseRepo,
266+
State: state,
267+
}
268+
err = shared.MetadataSurvey(opts.IO, ctx.BaseRepo, fetcher, state)
263269
if err != nil {
264270
return
265271
}

pkg/cmd/pr/shared/survey.go

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/cli/cli/pkg/iostreams"
1313
"github.com/cli/cli/pkg/prompt"
1414
"github.com/cli/cli/pkg/surveyext"
15-
"github.com/cli/cli/utils"
1615
)
1716

1817
type Action int
@@ -196,7 +195,26 @@ func TitleSurvey(state *IssueMetadataState) error {
196195
return nil
197196
}
198197

199-
func MetadataSurvey(io *iostreams.IOStreams, client *api.Client, baseRepo ghrepo.Interface, state *IssueMetadataState) error {
198+
type MetadataFetcher struct {
199+
IO *iostreams.IOStreams
200+
APIClient *api.Client
201+
Repo ghrepo.Interface
202+
State *IssueMetadataState
203+
}
204+
205+
func (mf *MetadataFetcher) RepoMetadataFetch(input api.RepoMetadataInput) (*api.RepoMetadataResult, error) {
206+
mf.IO.StartProgressIndicator()
207+
metadataResult, err := api.RepoMetadata(mf.APIClient, mf.Repo, input)
208+
mf.IO.StopProgressIndicator()
209+
mf.State.MetadataResult = metadataResult
210+
return metadataResult, err
211+
}
212+
213+
type RepoMetadataFetcher interface {
214+
RepoMetadataFetch(api.RepoMetadataInput) (*api.RepoMetadataResult, error)
215+
}
216+
217+
func MetadataSurvey(io *iostreams.IOStreams, baseRepo ghrepo.Interface, fetcher RepoMetadataFetcher, state *IssueMetadataState) error {
200218
isChosen := func(m string) bool {
201219
for _, c := range state.Metadata {
202220
if m == c {
@@ -234,32 +252,29 @@ func MetadataSurvey(io *iostreams.IOStreams, client *api.Client, baseRepo ghrepo
234252
Projects: isChosen("Projects"),
235253
Milestones: isChosen("Milestone"),
236254
}
237-
s := utils.Spinner(io.ErrOut)
238-
utils.StartSpinner(s)
239-
state.MetadataResult, err = api.RepoMetadata(client, baseRepo, metadataInput)
240-
utils.StopSpinner(s)
255+
metadataResult, err := fetcher.RepoMetadataFetch(metadataInput)
241256
if err != nil {
242257
return fmt.Errorf("error fetching metadata options: %w", err)
243258
}
244259

245260
var users []string
246-
for _, u := range state.MetadataResult.AssignableUsers {
261+
for _, u := range metadataResult.AssignableUsers {
247262
users = append(users, u.Login)
248263
}
249264
var teams []string
250-
for _, t := range state.MetadataResult.Teams {
265+
for _, t := range metadataResult.Teams {
251266
teams = append(teams, fmt.Sprintf("%s/%s", baseRepo.RepoOwner(), t.Slug))
252267
}
253268
var labels []string
254-
for _, l := range state.MetadataResult.Labels {
269+
for _, l := range metadataResult.Labels {
255270
labels = append(labels, l.Name)
256271
}
257272
var projects []string
258-
for _, l := range state.MetadataResult.Projects {
273+
for _, l := range metadataResult.Projects {
259274
projects = append(projects, l.Name)
260275
}
261276
milestones := []string{noMilestone}
262-
for _, m := range state.MetadataResult.Milestones {
277+
for _, m := range metadataResult.Milestones {
263278
milestones = append(milestones, m.Title)
264279
}
265280

pkg/cmd/pr/shared/survey_test.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package shared
2+
3+
import (
4+
"testing"
5+
6+
"github.com/cli/cli/api"
7+
"github.com/cli/cli/internal/ghrepo"
8+
"github.com/cli/cli/pkg/iostreams"
9+
"github.com/cli/cli/pkg/prompt"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
type metadataFetcher struct {
14+
metadataResult *api.RepoMetadataResult
15+
}
16+
17+
func (mf *metadataFetcher) RepoMetadataFetch(input api.RepoMetadataInput) (*api.RepoMetadataResult, error) {
18+
return mf.metadataResult, nil
19+
}
20+
21+
func TestMetadataSurvey_selectAll(t *testing.T) {
22+
io, _, stdout, stderr := iostreams.Test()
23+
24+
repo := ghrepo.New("OWNER", "REPO")
25+
26+
fetcher := &metadataFetcher{
27+
metadataResult: &api.RepoMetadataResult{
28+
AssignableUsers: []api.RepoAssignee{
29+
{Login: "hubot"},
30+
{Login: "monalisa"},
31+
},
32+
Labels: []api.RepoLabel{
33+
{Name: "help wanted"},
34+
{Name: "good first issue"},
35+
},
36+
Projects: []api.RepoProject{
37+
{Name: "Huge Refactoring"},
38+
{Name: "The road to 1.0"},
39+
},
40+
Milestones: []api.RepoMilestone{
41+
{Title: "1.2 patch release"},
42+
},
43+
},
44+
}
45+
46+
as, restoreAsk := prompt.InitAskStubber()
47+
defer restoreAsk()
48+
49+
as.Stub([]*prompt.QuestionStub{
50+
{
51+
Name: "metadata",
52+
Value: []string{"Labels", "Projects", "Assignees", "Reviewers", "Milestone"},
53+
},
54+
})
55+
as.Stub([]*prompt.QuestionStub{
56+
{
57+
Name: "reviewers",
58+
Value: []string{"monalisa"},
59+
},
60+
{
61+
Name: "assignees",
62+
Value: []string{"hubot"},
63+
},
64+
{
65+
Name: "labels",
66+
Value: []string{"good first issue"},
67+
},
68+
{
69+
Name: "projects",
70+
Value: []string{"The road to 1.0"},
71+
},
72+
{
73+
Name: "milestone",
74+
Value: []string{"(none)"},
75+
},
76+
})
77+
78+
state := &IssueMetadataState{
79+
Assignees: []string{"hubot"},
80+
}
81+
err := MetadataSurvey(io, repo, fetcher, state)
82+
assert.NoError(t, err)
83+
84+
assert.Equal(t, "", stdout.String())
85+
assert.Equal(t, "", stderr.String())
86+
87+
assert.Equal(t, []string{"hubot"}, state.Assignees)
88+
assert.Equal(t, []string{"monalisa"}, state.Reviewers)
89+
assert.Equal(t, []string{"good first issue"}, state.Labels)
90+
assert.Equal(t, []string{"The road to 1.0"}, state.Projects)
91+
assert.Equal(t, []string{}, state.Milestones)
92+
}
93+
94+
func TestMetadataSurvey_keepExisting(t *testing.T) {
95+
io, _, stdout, stderr := iostreams.Test()
96+
97+
repo := ghrepo.New("OWNER", "REPO")
98+
99+
fetcher := &metadataFetcher{
100+
metadataResult: &api.RepoMetadataResult{
101+
Labels: []api.RepoLabel{
102+
{Name: "help wanted"},
103+
{Name: "good first issue"},
104+
},
105+
Projects: []api.RepoProject{
106+
{Name: "Huge Refactoring"},
107+
{Name: "The road to 1.0"},
108+
},
109+
},
110+
}
111+
112+
as, restoreAsk := prompt.InitAskStubber()
113+
defer restoreAsk()
114+
115+
as.Stub([]*prompt.QuestionStub{
116+
{
117+
Name: "metadata",
118+
Value: []string{"Labels", "Projects"},
119+
},
120+
})
121+
as.Stub([]*prompt.QuestionStub{
122+
{
123+
Name: "labels",
124+
Value: []string{"good first issue"},
125+
},
126+
{
127+
Name: "projects",
128+
Value: []string{"The road to 1.0"},
129+
},
130+
})
131+
132+
state := &IssueMetadataState{
133+
Assignees: []string{"hubot"},
134+
}
135+
err := MetadataSurvey(io, repo, fetcher, state)
136+
assert.NoError(t, err)
137+
138+
assert.Equal(t, "", stdout.String())
139+
assert.Equal(t, "", stderr.String())
140+
141+
assert.Equal(t, []string{"hubot"}, state.Assignees)
142+
assert.Equal(t, []string{"good first issue"}, state.Labels)
143+
assert.Equal(t, []string{"The road to 1.0"}, state.Projects)
144+
}

0 commit comments

Comments
 (0)
X Tutup