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  }