github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/release/delete-asset/delete_asset_test.go (about)

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