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  }