github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/release/delete/delete_test.go (about) 1 package delete 2 3 import ( 4 "bytes" 5 "io" 6 "net/http" 7 "testing" 8 9 "github.com/MakeNowJust/heredoc" 10 "github.com/ungtb10d/cli/v2/internal/ghrepo" 11 "github.com/ungtb10d/cli/v2/pkg/cmdutil" 12 "github.com/ungtb10d/cli/v2/pkg/httpmock" 13 "github.com/ungtb10d/cli/v2/pkg/iostreams" 14 "github.com/google/shlex" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func Test_NewCmdDelete(t *testing.T) { 20 tests := []struct { 21 name string 22 args string 23 isTTY bool 24 want DeleteOptions 25 wantErr string 26 }{ 27 { 28 name: "version argument", 29 args: "v1.2.3", 30 isTTY: true, 31 want: DeleteOptions{ 32 TagName: "v1.2.3", 33 SkipConfirm: false, 34 CleanupTag: false, 35 }, 36 }, 37 { 38 name: "skip confirm", 39 args: "v1.2.3 -y", 40 isTTY: true, 41 want: DeleteOptions{ 42 TagName: "v1.2.3", 43 SkipConfirm: true, 44 CleanupTag: false, 45 }, 46 }, 47 { 48 name: "cleanup tag", 49 args: "v1.2.3 --cleanup-tag", 50 isTTY: true, 51 want: DeleteOptions{ 52 TagName: "v1.2.3", 53 SkipConfirm: false, 54 CleanupTag: true, 55 }, 56 }, 57 { 58 name: "no arguments", 59 args: "", 60 isTTY: true, 61 wantErr: "accepts 1 arg(s), received 0", 62 }, 63 } 64 for _, tt := range tests { 65 t.Run(tt.name, func(t *testing.T) { 66 ios, _, _, _ := iostreams.Test() 67 ios.SetStdoutTTY(tt.isTTY) 68 ios.SetStdinTTY(tt.isTTY) 69 ios.SetStderrTTY(tt.isTTY) 70 71 f := &cmdutil.Factory{ 72 IOStreams: ios, 73 } 74 75 var opts *DeleteOptions 76 cmd := NewCmdDelete(f, func(o *DeleteOptions) error { 77 opts = o 78 return nil 79 }) 80 cmd.PersistentFlags().StringP("repo", "R", "", "") 81 82 argv, err := shlex.Split(tt.args) 83 require.NoError(t, err) 84 cmd.SetArgs(argv) 85 86 cmd.SetIn(&bytes.Buffer{}) 87 cmd.SetOut(io.Discard) 88 cmd.SetErr(io.Discard) 89 90 _, err = cmd.ExecuteC() 91 if tt.wantErr != "" { 92 require.EqualError(t, err, tt.wantErr) 93 return 94 } else { 95 require.NoError(t, err) 96 } 97 98 assert.Equal(t, tt.want.TagName, opts.TagName) 99 assert.Equal(t, tt.want.SkipConfirm, opts.SkipConfirm) 100 assert.Equal(t, tt.want.CleanupTag, opts.CleanupTag) 101 }) 102 } 103 } 104 105 func Test_deleteRun(t *testing.T) { 106 tests := []struct { 107 name string 108 isTTY bool 109 opts DeleteOptions 110 wantErr string 111 wantStdout string 112 wantStderr string 113 }{ 114 { 115 name: "skipping confirmation", 116 isTTY: true, 117 opts: DeleteOptions{ 118 TagName: "v1.2.3", 119 SkipConfirm: true, 120 CleanupTag: false, 121 }, 122 wantStdout: ``, 123 wantStderr: heredoc.Doc(` 124 ✓ Deleted release v1.2.3 125 ! Note that the v1.2.3 git tag still remains in the repository 126 `), 127 }, 128 { 129 name: "non-interactive", 130 isTTY: false, 131 opts: DeleteOptions{ 132 TagName: "v1.2.3", 133 SkipConfirm: false, 134 CleanupTag: false, 135 }, 136 wantStdout: ``, 137 wantStderr: ``, 138 }, 139 { 140 name: "cleanup-tag & skipping confirmation", 141 isTTY: true, 142 opts: DeleteOptions{ 143 TagName: "v1.2.3", 144 SkipConfirm: true, 145 CleanupTag: true, 146 }, 147 wantStdout: ``, 148 wantStderr: heredoc.Doc(` 149 ✓ Deleted release and tag v1.2.3 150 `), 151 }, 152 { 153 name: "cleanup-tag", 154 isTTY: false, 155 opts: DeleteOptions{ 156 TagName: "v1.2.3", 157 SkipConfirm: false, 158 CleanupTag: true, 159 }, 160 wantStdout: ``, 161 wantStderr: ``, 162 }, 163 } 164 for _, tt := range tests { 165 t.Run(tt.name, func(t *testing.T) { 166 ios, _, stdout, stderr := iostreams.Test() 167 ios.SetStdoutTTY(tt.isTTY) 168 ios.SetStdinTTY(tt.isTTY) 169 ios.SetStderrTTY(tt.isTTY) 170 171 fakeHTTP := &httpmock.Registry{} 172 fakeHTTP.Register(httpmock.REST("GET", "repos/OWNER/REPO/releases/tags/v1.2.3"), httpmock.StringResponse(`{ 173 "tag_name": "v1.2.3", 174 "draft": false, 175 "url": "https://api.github.com/repos/OWNER/REPO/releases/23456" 176 }`)) 177 178 fakeHTTP.Register(httpmock.REST("DELETE", "repos/OWNER/REPO/releases/23456"), httpmock.StatusStringResponse(204, "")) 179 fakeHTTP.Register(httpmock.REST("DELETE", "repos/OWNER/REPO/git/refs/tags/v1.2.3"), httpmock.StatusStringResponse(204, "")) 180 181 tt.opts.IO = ios 182 tt.opts.HttpClient = func() (*http.Client, error) { 183 return &http.Client{Transport: fakeHTTP}, nil 184 } 185 tt.opts.BaseRepo = func() (ghrepo.Interface, error) { 186 return ghrepo.FromFullName("OWNER/REPO") 187 } 188 189 err := deleteRun(&tt.opts) 190 if tt.wantErr != "" { 191 require.EqualError(t, err, tt.wantErr) 192 return 193 } else { 194 require.NoError(t, err) 195 } 196 197 assert.Equal(t, tt.wantStdout, stdout.String()) 198 assert.Equal(t, tt.wantStderr, stderr.String()) 199 }) 200 } 201 }