github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/cmd/release/list/list_test.go (about)

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