github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/release/list/list_test.go (about) 1 package list 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "net/http" 8 "testing" 9 "time" 10 11 "github.com/MakeNowJust/heredoc" 12 "github.com/ungtb10d/cli/v2/internal/ghrepo" 13 "github.com/ungtb10d/cli/v2/pkg/cmdutil" 14 "github.com/ungtb10d/cli/v2/pkg/httpmock" 15 "github.com/ungtb10d/cli/v2/pkg/iostreams" 16 "github.com/google/shlex" 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 ) 20 21 func Test_NewCmdList(t *testing.T) { 22 tests := []struct { 23 name string 24 args string 25 isTTY bool 26 want ListOptions 27 wantErr string 28 }{ 29 { 30 name: "no arguments", 31 args: "", 32 isTTY: true, 33 want: ListOptions{ 34 LimitResults: 30, 35 ExcludeDrafts: false, 36 }, 37 }, 38 { 39 name: "exclude drafts", 40 args: "--exclude-drafts", 41 want: ListOptions{ 42 LimitResults: 30, 43 ExcludeDrafts: true, 44 }, 45 }, 46 } 47 for _, tt := range tests { 48 t.Run(tt.name, func(t *testing.T) { 49 ios, _, _, _ := iostreams.Test() 50 ios.SetStdoutTTY(tt.isTTY) 51 ios.SetStdinTTY(tt.isTTY) 52 ios.SetStderrTTY(tt.isTTY) 53 54 f := &cmdutil.Factory{ 55 IOStreams: ios, 56 } 57 58 var opts *ListOptions 59 cmd := NewCmdList(f, func(o *ListOptions) error { 60 opts = o 61 return nil 62 }) 63 cmd.PersistentFlags().StringP("repo", "R", "", "") 64 65 argv, err := shlex.Split(tt.args) 66 require.NoError(t, err) 67 cmd.SetArgs(argv) 68 69 cmd.SetIn(&bytes.Buffer{}) 70 cmd.SetOut(io.Discard) 71 cmd.SetErr(io.Discard) 72 73 _, err = cmd.ExecuteC() 74 if tt.wantErr != "" { 75 require.EqualError(t, err, tt.wantErr) 76 return 77 } else { 78 require.NoError(t, err) 79 } 80 81 assert.Equal(t, tt.want.LimitResults, opts.LimitResults) 82 assert.Equal(t, tt.want.ExcludeDrafts, opts.ExcludeDrafts) 83 }) 84 } 85 } 86 87 func Test_listRun(t *testing.T) { 88 frozenTime, err := time.Parse(time.RFC3339, "2020-08-31T15:44:24+02:00") 89 require.NoError(t, err) 90 91 tests := []struct { 92 name string 93 isTTY bool 94 opts ListOptions 95 wantErr string 96 wantStdout string 97 wantStderr string 98 }{ 99 { 100 name: "list releases", 101 isTTY: true, 102 opts: ListOptions{ 103 LimitResults: 30, 104 }, 105 wantStdout: heredoc.Doc(` 106 TITLE TYPE TAG NAME PUBLISHED 107 v1.1.0 Draft v1.1.0 about 1 day ago 108 The big 1.0 Latest v1.0.0 about 1 day ago 109 1.0 release candidate Pre-release v1.0.0-pre.2 about 1 day ago 110 New features v0.9.2 about 1 day ago 111 `), 112 wantStderr: ``, 113 }, 114 { 115 name: "machine-readable", 116 isTTY: false, 117 opts: ListOptions{ 118 LimitResults: 30, 119 }, 120 wantStdout: heredoc.Doc(` 121 v1.1.0 Draft v1.1.0 2020-08-31T15:44:24+02:00 122 The big 1.0 Latest v1.0.0 2020-08-31T15:44:24+02:00 123 1.0 release candidate Pre-release v1.0.0-pre.2 2020-08-31T15:44:24+02:00 124 New features v0.9.2 2020-08-31T15:44:24+02:00 125 `), 126 wantStderr: ``, 127 }, 128 } 129 for _, tt := range tests { 130 t.Run(tt.name, func(t *testing.T) { 131 ios, _, stdout, stderr := iostreams.Test() 132 ios.SetStdoutTTY(tt.isTTY) 133 ios.SetStdinTTY(tt.isTTY) 134 ios.SetStderrTTY(tt.isTTY) 135 136 createdAt := frozenTime 137 if tt.isTTY { 138 createdAt = time.Now().Add(time.Duration(-24) * time.Hour) 139 } 140 141 fakeHTTP := &httpmock.Registry{} 142 fakeHTTP.Register(httpmock.GraphQL(`\bRepositoryReleaseList\(`), httpmock.StringResponse(fmt.Sprintf(` 143 { "data": { "repository": { "releases": { 144 "nodes": [ 145 { 146 "name": "", 147 "tagName": "v1.1.0", 148 "isLatest": false, 149 "isDraft": true, 150 "isPrerelease": false, 151 "createdAt": "%[1]s", 152 "publishedAt": "%[1]s" 153 }, 154 { 155 "name": "The big 1.0", 156 "tagName": "v1.0.0", 157 "isLatest": true, 158 "isDraft": false, 159 "isPrerelease": false, 160 "createdAt": "%[1]s", 161 "publishedAt": "%[1]s" 162 }, 163 { 164 "name": "1.0 release candidate", 165 "tagName": "v1.0.0-pre.2", 166 "isLatest": false, 167 "isDraft": false, 168 "isPrerelease": true, 169 "createdAt": "%[1]s", 170 "publishedAt": "%[1]s" 171 }, 172 { 173 "name": "New features", 174 "tagName": "v0.9.2", 175 "isLatest": false, 176 "isDraft": false, 177 "isPrerelease": false, 178 "createdAt": "%[1]s", 179 "publishedAt": "%[1]s" 180 } 181 ] 182 } } } }`, createdAt.Format(time.RFC3339)))) 183 184 tt.opts.IO = ios 185 tt.opts.HttpClient = func() (*http.Client, error) { 186 return &http.Client{Transport: fakeHTTP}, nil 187 } 188 tt.opts.BaseRepo = func() (ghrepo.Interface, error) { 189 return ghrepo.FromFullName("OWNER/REPO") 190 } 191 192 err := listRun(&tt.opts) 193 if tt.wantErr != "" { 194 require.EqualError(t, err, tt.wantErr) 195 return 196 } else { 197 require.NoError(t, err) 198 } 199 200 assert.Equal(t, tt.wantStdout, stdout.String()) 201 assert.Equal(t, tt.wantStderr, stderr.String()) 202 }) 203 } 204 }