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

     1  package list
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/cli/cli/internal/ghrepo"
    11  	"github.com/cli/cli/pkg/cmd/run/shared"
    12  	workflowShared "github.com/cli/cli/pkg/cmd/workflow/shared"
    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  )
    19  
    20  func TestNewCmdList(t *testing.T) {
    21  	tests := []struct {
    22  		name     string
    23  		cli      string
    24  		tty      bool
    25  		wants    ListOptions
    26  		wantsErr bool
    27  	}{
    28  		{
    29  			name: "blank",
    30  			wants: ListOptions{
    31  				Limit: defaultLimit,
    32  			},
    33  		},
    34  		{
    35  			name: "limit",
    36  			cli:  "--limit 100",
    37  			wants: ListOptions{
    38  				Limit: 100,
    39  			},
    40  		},
    41  		{
    42  			name:     "bad limit",
    43  			cli:      "--limit hi",
    44  			wantsErr: true,
    45  		},
    46  		{
    47  			name: "workflow",
    48  			cli:  "--workflow foo.yml",
    49  			wants: ListOptions{
    50  				Limit:            defaultLimit,
    51  				WorkflowSelector: "foo.yml",
    52  			},
    53  		},
    54  	}
    55  
    56  	for _, tt := range tests {
    57  		t.Run(tt.name, func(t *testing.T) {
    58  			io, _, _, _ := iostreams.Test()
    59  			io.SetStdinTTY(tt.tty)
    60  			io.SetStdoutTTY(tt.tty)
    61  
    62  			f := &cmdutil.Factory{
    63  				IOStreams: io,
    64  			}
    65  
    66  			argv, err := shlex.Split(tt.cli)
    67  			assert.NoError(t, err)
    68  
    69  			var gotOpts *ListOptions
    70  			cmd := NewCmdList(f, func(opts *ListOptions) error {
    71  				gotOpts = opts
    72  				return nil
    73  			})
    74  			cmd.SetArgs(argv)
    75  			cmd.SetIn(&bytes.Buffer{})
    76  			cmd.SetOut(ioutil.Discard)
    77  			cmd.SetErr(ioutil.Discard)
    78  
    79  			_, err = cmd.ExecuteC()
    80  			if tt.wantsErr {
    81  				assert.Error(t, err)
    82  				return
    83  			}
    84  
    85  			assert.Equal(t, tt.wants.Limit, gotOpts.Limit)
    86  		})
    87  	}
    88  }
    89  
    90  func TestListRun(t *testing.T) {
    91  	tests := []struct {
    92  		name       string
    93  		opts       *ListOptions
    94  		wantOut    string
    95  		wantErrOut string
    96  		stubs      func(*httpmock.Registry)
    97  		nontty     bool
    98  	}{
    99  		{
   100  			name: "blank tty",
   101  			opts: &ListOptions{
   102  				Limit: defaultLimit,
   103  			},
   104  			stubs: func(reg *httpmock.Registry) {
   105  				reg.Register(
   106  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   107  					httpmock.JSONResponse(shared.RunsPayload{
   108  						WorkflowRuns: shared.TestRuns,
   109  					}))
   110  			},
   111  			wantOut: "STATUS  NAME         WORKFLOW     BRANCH  EVENT  ID    ELAPSED  AGE\nX       cool commit  timed out    trunk   push   1     4m34s    Feb 23, 2021\n-       cool commit  in progress  trunk   push   2     4m34s    Feb 23, 2021\n✓       cool commit  successful   trunk   push   3     4m34s    Feb 23, 2021\n✓       cool commit  cancelled    trunk   push   4     4m34s    Feb 23, 2021\nX       cool commit  failed       trunk   push   1234  4m34s    Feb 23, 2021\n✓       cool commit  neutral      trunk   push   6     4m34s    Feb 23, 2021\n✓       cool commit  skipped      trunk   push   7     4m34s    Feb 23, 2021\n-       cool commit  requested    trunk   push   8     4m34s    Feb 23, 2021\n-       cool commit  queued       trunk   push   9     4m34s    Feb 23, 2021\nX       cool commit  stale        trunk   push   10    4m34s    Feb 23, 2021\n\nFor details on a run, try: gh run view <run-id>\n",
   112  		},
   113  		{
   114  			name: "blank nontty",
   115  			opts: &ListOptions{
   116  				Limit:       defaultLimit,
   117  				PlainOutput: true,
   118  			},
   119  			nontty: true,
   120  			stubs: func(reg *httpmock.Registry) {
   121  				reg.Register(
   122  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   123  					httpmock.JSONResponse(shared.RunsPayload{
   124  						WorkflowRuns: shared.TestRuns,
   125  					}))
   126  			},
   127  			wantOut: "completed\ttimed_out\tcool commit\ttimed out\ttrunk\tpush\t1\t4m34s\tFeb 23, 2021\nin_progress\t\tcool commit\tin progress\ttrunk\tpush\t2\t4m34s\tFeb 23, 2021\ncompleted\tsuccess\tcool commit\tsuccessful\ttrunk\tpush\t3\t4m34s\tFeb 23, 2021\ncompleted\tcancelled\tcool commit\tcancelled\ttrunk\tpush\t4\t4m34s\tFeb 23, 2021\ncompleted\tfailure\tcool commit\tfailed\ttrunk\tpush\t1234\t4m34s\tFeb 23, 2021\ncompleted\tneutral\tcool commit\tneutral\ttrunk\tpush\t6\t4m34s\tFeb 23, 2021\ncompleted\tskipped\tcool commit\tskipped\ttrunk\tpush\t7\t4m34s\tFeb 23, 2021\nrequested\t\tcool commit\trequested\ttrunk\tpush\t8\t4m34s\tFeb 23, 2021\nqueued\t\tcool commit\tqueued\ttrunk\tpush\t9\t4m34s\tFeb 23, 2021\ncompleted\tstale\tcool commit\tstale\ttrunk\tpush\t10\t4m34s\tFeb 23, 2021\n",
   128  		},
   129  		{
   130  			name: "pagination",
   131  			opts: &ListOptions{
   132  				Limit: 101,
   133  			},
   134  			stubs: func(reg *httpmock.Registry) {
   135  				var runID int64
   136  				runs := []shared.Run{}
   137  				for runID < 103 {
   138  					runs = append(runs, shared.TestRun(fmt.Sprintf("%d", runID), runID, shared.InProgress, ""))
   139  					runID++
   140  				}
   141  				reg.Register(
   142  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   143  					httpmock.JSONResponse(shared.RunsPayload{
   144  						WorkflowRuns: runs[0:100],
   145  					}))
   146  				reg.Register(
   147  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   148  					httpmock.JSONResponse(shared.RunsPayload{
   149  						WorkflowRuns: runs[100:],
   150  					}))
   151  			},
   152  			wantOut: longRunOutput,
   153  		},
   154  		{
   155  			name: "no results nontty",
   156  			opts: &ListOptions{
   157  				Limit:       defaultLimit,
   158  				PlainOutput: true,
   159  			},
   160  			stubs: func(reg *httpmock.Registry) {
   161  				reg.Register(
   162  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   163  					httpmock.JSONResponse(shared.RunsPayload{}),
   164  				)
   165  			},
   166  			nontty:  true,
   167  			wantOut: "",
   168  		},
   169  		{
   170  			name: "no results tty",
   171  			opts: &ListOptions{
   172  				Limit: defaultLimit,
   173  			},
   174  			stubs: func(reg *httpmock.Registry) {
   175  				reg.Register(
   176  					httpmock.REST("GET", "repos/OWNER/REPO/actions/runs"),
   177  					httpmock.JSONResponse(shared.RunsPayload{}),
   178  				)
   179  			},
   180  			wantOut:    "",
   181  			wantErrOut: "No runs found\n",
   182  		},
   183  		{
   184  			name: "workflow selector",
   185  			opts: &ListOptions{
   186  				Limit:            defaultLimit,
   187  				WorkflowSelector: "flow.yml",
   188  			},
   189  			stubs: func(reg *httpmock.Registry) {
   190  				reg.Register(
   191  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/flow.yml"),
   192  					httpmock.JSONResponse(workflowShared.AWorkflow))
   193  				reg.Register(
   194  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/123/runs"),
   195  					httpmock.JSONResponse(shared.RunsPayload{
   196  						WorkflowRuns: shared.WorkflowRuns,
   197  					}))
   198  			},
   199  			wantOut: "STATUS  NAME         WORKFLOW     BRANCH  EVENT  ID    ELAPSED  AGE\n-       cool commit  in progress  trunk   push   2     4m34s    Feb 23, 2021\n✓       cool commit  successful   trunk   push   3     4m34s    Feb 23, 2021\nX       cool commit  failed       trunk   push   1234  4m34s    Feb 23, 2021\n\nFor details on a run, try: gh run view <run-id>\n",
   200  		},
   201  	}
   202  
   203  	for _, tt := range tests {
   204  		t.Run(tt.name, func(t *testing.T) {
   205  			reg := &httpmock.Registry{}
   206  			tt.stubs(reg)
   207  
   208  			tt.opts.HttpClient = func() (*http.Client, error) {
   209  				return &http.Client{Transport: reg}, nil
   210  			}
   211  
   212  			io, _, stdout, stderr := iostreams.Test()
   213  			io.SetStdoutTTY(!tt.nontty)
   214  			tt.opts.IO = io
   215  			tt.opts.BaseRepo = func() (ghrepo.Interface, error) {
   216  				return ghrepo.FromFullName("OWNER/REPO")
   217  			}
   218  
   219  			err := listRun(tt.opts)
   220  			assert.NoError(t, err)
   221  
   222  			assert.Equal(t, tt.wantOut, stdout.String())
   223  			assert.Equal(t, tt.wantErrOut, stderr.String())
   224  			reg.Verify(t)
   225  		})
   226  	}
   227  }
   228  
   229  const longRunOutput = "STATUS  NAME         WORKFLOW  BRANCH  EVENT  ID   ELAPSED  AGE\n-       cool commit  0         trunk   push   0    4m34s    Feb 23, 2021\n-       cool commit  1         trunk   push   1    4m34s    Feb 23, 2021\n-       cool commit  2         trunk   push   2    4m34s    Feb 23, 2021\n-       cool commit  3         trunk   push   3    4m34s    Feb 23, 2021\n-       cool commit  4         trunk   push   4    4m34s    Feb 23, 2021\n-       cool commit  5         trunk   push   5    4m34s    Feb 23, 2021\n-       cool commit  6         trunk   push   6    4m34s    Feb 23, 2021\n-       cool commit  7         trunk   push   7    4m34s    Feb 23, 2021\n-       cool commit  8         trunk   push   8    4m34s    Feb 23, 2021\n-       cool commit  9         trunk   push   9    4m34s    Feb 23, 2021\n-       cool commit  10        trunk   push   10   4m34s    Feb 23, 2021\n-       cool commit  11        trunk   push   11   4m34s    Feb 23, 2021\n-       cool commit  12        trunk   push   12   4m34s    Feb 23, 2021\n-       cool commit  13        trunk   push   13   4m34s    Feb 23, 2021\n-       cool commit  14        trunk   push   14   4m34s    Feb 23, 2021\n-       cool commit  15        trunk   push   15   4m34s    Feb 23, 2021\n-       cool commit  16        trunk   push   16   4m34s    Feb 23, 2021\n-       cool commit  17        trunk   push   17   4m34s    Feb 23, 2021\n-       cool commit  18        trunk   push   18   4m34s    Feb 23, 2021\n-       cool commit  19        trunk   push   19   4m34s    Feb 23, 2021\n-       cool commit  20        trunk   push   20   4m34s    Feb 23, 2021\n-       cool commit  21        trunk   push   21   4m34s    Feb 23, 2021\n-       cool commit  22        trunk   push   22   4m34s    Feb 23, 2021\n-       cool commit  23        trunk   push   23   4m34s    Feb 23, 2021\n-       cool commit  24        trunk   push   24   4m34s    Feb 23, 2021\n-       cool commit  25        trunk   push   25   4m34s    Feb 23, 2021\n-       cool commit  26        trunk   push   26   4m34s    Feb 23, 2021\n-       cool commit  27        trunk   push   27   4m34s    Feb 23, 2021\n-       cool commit  28        trunk   push   28   4m34s    Feb 23, 2021\n-       cool commit  29        trunk   push   29   4m34s    Feb 23, 2021\n-       cool commit  30        trunk   push   30   4m34s    Feb 23, 2021\n-       cool commit  31        trunk   push   31   4m34s    Feb 23, 2021\n-       cool commit  32        trunk   push   32   4m34s    Feb 23, 2021\n-       cool commit  33        trunk   push   33   4m34s    Feb 23, 2021\n-       cool commit  34        trunk   push   34   4m34s    Feb 23, 2021\n-       cool commit  35        trunk   push   35   4m34s    Feb 23, 2021\n-       cool commit  36        trunk   push   36   4m34s    Feb 23, 2021\n-       cool commit  37        trunk   push   37   4m34s    Feb 23, 2021\n-       cool commit  38        trunk   push   38   4m34s    Feb 23, 2021\n-       cool commit  39        trunk   push   39   4m34s    Feb 23, 2021\n-       cool commit  40        trunk   push   40   4m34s    Feb 23, 2021\n-       cool commit  41        trunk   push   41   4m34s    Feb 23, 2021\n-       cool commit  42        trunk   push   42   4m34s    Feb 23, 2021\n-       cool commit  43        trunk   push   43   4m34s    Feb 23, 2021\n-       cool commit  44        trunk   push   44   4m34s    Feb 23, 2021\n-       cool commit  45        trunk   push   45   4m34s    Feb 23, 2021\n-       cool commit  46        trunk   push   46   4m34s    Feb 23, 2021\n-       cool commit  47        trunk   push   47   4m34s    Feb 23, 2021\n-       cool commit  48        trunk   push   48   4m34s    Feb 23, 2021\n-       cool commit  49        trunk   push   49   4m34s    Feb 23, 2021\n-       cool commit  50        trunk   push   50   4m34s    Feb 23, 2021\n-       cool commit  51        trunk   push   51   4m34s    Feb 23, 2021\n-       cool commit  52        trunk   push   52   4m34s    Feb 23, 2021\n-       cool commit  53        trunk   push   53   4m34s    Feb 23, 2021\n-       cool commit  54        trunk   push   54   4m34s    Feb 23, 2021\n-       cool commit  55        trunk   push   55   4m34s    Feb 23, 2021\n-       cool commit  56        trunk   push   56   4m34s    Feb 23, 2021\n-       cool commit  57        trunk   push   57   4m34s    Feb 23, 2021\n-       cool commit  58        trunk   push   58   4m34s    Feb 23, 2021\n-       cool commit  59        trunk   push   59   4m34s    Feb 23, 2021\n-       cool commit  60        trunk   push   60   4m34s    Feb 23, 2021\n-       cool commit  61        trunk   push   61   4m34s    Feb 23, 2021\n-       cool commit  62        trunk   push   62   4m34s    Feb 23, 2021\n-       cool commit  63        trunk   push   63   4m34s    Feb 23, 2021\n-       cool commit  64        trunk   push   64   4m34s    Feb 23, 2021\n-       cool commit  65        trunk   push   65   4m34s    Feb 23, 2021\n-       cool commit  66        trunk   push   66   4m34s    Feb 23, 2021\n-       cool commit  67        trunk   push   67   4m34s    Feb 23, 2021\n-       cool commit  68        trunk   push   68   4m34s    Feb 23, 2021\n-       cool commit  69        trunk   push   69   4m34s    Feb 23, 2021\n-       cool commit  70        trunk   push   70   4m34s    Feb 23, 2021\n-       cool commit  71        trunk   push   71   4m34s    Feb 23, 2021\n-       cool commit  72        trunk   push   72   4m34s    Feb 23, 2021\n-       cool commit  73        trunk   push   73   4m34s    Feb 23, 2021\n-       cool commit  74        trunk   push   74   4m34s    Feb 23, 2021\n-       cool commit  75        trunk   push   75   4m34s    Feb 23, 2021\n-       cool commit  76        trunk   push   76   4m34s    Feb 23, 2021\n-       cool commit  77        trunk   push   77   4m34s    Feb 23, 2021\n-       cool commit  78        trunk   push   78   4m34s    Feb 23, 2021\n-       cool commit  79        trunk   push   79   4m34s    Feb 23, 2021\n-       cool commit  80        trunk   push   80   4m34s    Feb 23, 2021\n-       cool commit  81        trunk   push   81   4m34s    Feb 23, 2021\n-       cool commit  82        trunk   push   82   4m34s    Feb 23, 2021\n-       cool commit  83        trunk   push   83   4m34s    Feb 23, 2021\n-       cool commit  84        trunk   push   84   4m34s    Feb 23, 2021\n-       cool commit  85        trunk   push   85   4m34s    Feb 23, 2021\n-       cool commit  86        trunk   push   86   4m34s    Feb 23, 2021\n-       cool commit  87        trunk   push   87   4m34s    Feb 23, 2021\n-       cool commit  88        trunk   push   88   4m34s    Feb 23, 2021\n-       cool commit  89        trunk   push   89   4m34s    Feb 23, 2021\n-       cool commit  90        trunk   push   90   4m34s    Feb 23, 2021\n-       cool commit  91        trunk   push   91   4m34s    Feb 23, 2021\n-       cool commit  92        trunk   push   92   4m34s    Feb 23, 2021\n-       cool commit  93        trunk   push   93   4m34s    Feb 23, 2021\n-       cool commit  94        trunk   push   94   4m34s    Feb 23, 2021\n-       cool commit  95        trunk   push   95   4m34s    Feb 23, 2021\n-       cool commit  96        trunk   push   96   4m34s    Feb 23, 2021\n-       cool commit  97        trunk   push   97   4m34s    Feb 23, 2021\n-       cool commit  98        trunk   push   98   4m34s    Feb 23, 2021\n-       cool commit  99        trunk   push   99   4m34s    Feb 23, 2021\n-       cool commit  100       trunk   push   100  4m34s    Feb 23, 2021\n\nFor details on a run, try: gh run view <run-id>\n"