github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/cmd/workflow/disable/disable_test.go (about)

     1  package disable
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/cli/cli/internal/ghrepo"
    10  	"github.com/cli/cli/pkg/cmd/workflow/shared"
    11  	"github.com/cli/cli/pkg/cmdutil"
    12  	"github.com/cli/cli/pkg/httpmock"
    13  	"github.com/cli/cli/pkg/iostreams"
    14  	"github.com/cli/cli/pkg/prompt"
    15  	"github.com/google/shlex"
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestNewCmdDisable(t *testing.T) {
    20  	tests := []struct {
    21  		name     string
    22  		cli      string
    23  		tty      bool
    24  		wants    DisableOptions
    25  		wantsErr bool
    26  	}{
    27  		{
    28  			name: "blank tty",
    29  			tty:  true,
    30  			wants: DisableOptions{
    31  				Prompt: true,
    32  			},
    33  		},
    34  		{
    35  			name:     "blank nontty",
    36  			wantsErr: true,
    37  		},
    38  		{
    39  			name: "arg tty",
    40  			cli:  "123",
    41  			tty:  true,
    42  			wants: DisableOptions{
    43  				Selector: "123",
    44  			},
    45  		},
    46  		{
    47  			name: "arg nontty",
    48  			cli:  "123",
    49  			wants: DisableOptions{
    50  				Selector: "123",
    51  			},
    52  		},
    53  	}
    54  
    55  	for _, tt := range tests {
    56  		t.Run(tt.name, func(t *testing.T) {
    57  			io, _, _, _ := iostreams.Test()
    58  			io.SetStdinTTY(tt.tty)
    59  			io.SetStdoutTTY(tt.tty)
    60  
    61  			f := &cmdutil.Factory{
    62  				IOStreams: io,
    63  			}
    64  
    65  			argv, err := shlex.Split(tt.cli)
    66  			assert.NoError(t, err)
    67  
    68  			var gotOpts *DisableOptions
    69  			cmd := NewCmdDisable(f, func(opts *DisableOptions) error {
    70  				gotOpts = opts
    71  				return nil
    72  			})
    73  			cmd.SetArgs(argv)
    74  			cmd.SetIn(&bytes.Buffer{})
    75  			cmd.SetOut(ioutil.Discard)
    76  			cmd.SetErr(ioutil.Discard)
    77  
    78  			_, err = cmd.ExecuteC()
    79  			if tt.wantsErr {
    80  				assert.Error(t, err)
    81  				return
    82  			}
    83  
    84  			assert.NoError(t, err)
    85  
    86  			assert.Equal(t, tt.wants.Selector, gotOpts.Selector)
    87  			assert.Equal(t, tt.wants.Prompt, gotOpts.Prompt)
    88  		})
    89  	}
    90  }
    91  
    92  func TestDisableRun(t *testing.T) {
    93  	tests := []struct {
    94  		name       string
    95  		opts       *DisableOptions
    96  		httpStubs  func(*httpmock.Registry)
    97  		askStubs   func(*prompt.AskStubber)
    98  		tty        bool
    99  		wantOut    string
   100  		wantErrOut string
   101  		wantErr    bool
   102  	}{
   103  		{
   104  			name: "tty no arg",
   105  			opts: &DisableOptions{
   106  				Prompt: true,
   107  			},
   108  			tty: true,
   109  			httpStubs: func(reg *httpmock.Registry) {
   110  				reg.Register(
   111  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows"),
   112  					httpmock.JSONResponse(shared.WorkflowsPayload{
   113  						Workflows: []shared.Workflow{
   114  							shared.AWorkflow,
   115  							shared.DisabledWorkflow,
   116  							shared.AnotherWorkflow,
   117  						},
   118  					}))
   119  				reg.Register(
   120  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/789/disable"),
   121  					httpmock.StatusStringResponse(204, "{}"))
   122  			},
   123  			askStubs: func(as *prompt.AskStubber) {
   124  				as.StubOne(1)
   125  			},
   126  			wantOut: "✓ Disabled another workflow\n",
   127  		},
   128  		{
   129  			name: "tty name arg",
   130  			opts: &DisableOptions{
   131  				Selector: "a workflow",
   132  			},
   133  			tty: true,
   134  			httpStubs: func(reg *httpmock.Registry) {
   135  				reg.Register(
   136  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/a workflow"),
   137  					httpmock.StatusStringResponse(404, "not found"))
   138  				reg.Register(
   139  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows"),
   140  					httpmock.JSONResponse(shared.WorkflowsPayload{
   141  						Workflows: []shared.Workflow{
   142  							shared.AWorkflow,
   143  							shared.DisabledWorkflow,
   144  							shared.AnotherWorkflow,
   145  						},
   146  					}))
   147  				reg.Register(
   148  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/123/disable"),
   149  					httpmock.StatusStringResponse(204, "{}"))
   150  			},
   151  			wantOut: "✓ Disabled a workflow\n",
   152  		},
   153  		{
   154  			name: "tty name arg nonunique",
   155  			opts: &DisableOptions{
   156  				Selector: "another workflow",
   157  			},
   158  			tty: true,
   159  			httpStubs: func(reg *httpmock.Registry) {
   160  				reg.Register(
   161  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/another workflow"),
   162  					httpmock.StatusStringResponse(404, "not found"))
   163  				reg.Register(
   164  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows"),
   165  					httpmock.JSONResponse(shared.WorkflowsPayload{
   166  						Workflows: []shared.Workflow{
   167  							shared.AWorkflow,
   168  							shared.DisabledWorkflow,
   169  							shared.AnotherWorkflow,
   170  							shared.YetAnotherWorkflow,
   171  							shared.AnotherDisabledWorkflow,
   172  						},
   173  					}))
   174  				reg.Register(
   175  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/1011/disable"),
   176  					httpmock.StatusStringResponse(204, "{}"))
   177  			},
   178  			askStubs: func(as *prompt.AskStubber) {
   179  				as.StubOne(1)
   180  			},
   181  			wantOut: "✓ Disabled another workflow\n",
   182  		},
   183  		{
   184  			name: "tty ID arg",
   185  			opts: &DisableOptions{
   186  				Selector: "123",
   187  			},
   188  			tty: true,
   189  			httpStubs: func(reg *httpmock.Registry) {
   190  				reg.Register(
   191  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/123"),
   192  					httpmock.JSONResponse(shared.AWorkflow))
   193  				reg.Register(
   194  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/123/disable"),
   195  					httpmock.StatusStringResponse(204, "{}"))
   196  			},
   197  			wantOut: "✓ Disabled a workflow\n",
   198  		},
   199  		{
   200  			name: "nontty ID arg",
   201  			opts: &DisableOptions{
   202  				Selector: "123",
   203  			},
   204  			httpStubs: func(reg *httpmock.Registry) {
   205  				reg.Register(
   206  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/123"),
   207  					httpmock.JSONResponse(shared.AWorkflow))
   208  				reg.Register(
   209  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/123/disable"),
   210  					httpmock.StatusStringResponse(204, "{}"))
   211  			},
   212  		},
   213  		{
   214  			name: "nontty name arg",
   215  			opts: &DisableOptions{
   216  				Selector: "a workflow",
   217  			},
   218  			httpStubs: func(reg *httpmock.Registry) {
   219  				reg.Register(
   220  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/a workflow"),
   221  					httpmock.StatusStringResponse(404, "not found"))
   222  				reg.Register(
   223  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows"),
   224  					httpmock.JSONResponse(shared.WorkflowsPayload{
   225  						Workflows: []shared.Workflow{
   226  							shared.AWorkflow,
   227  							shared.DisabledWorkflow,
   228  							shared.AnotherWorkflow,
   229  							shared.AnotherDisabledWorkflow,
   230  							shared.UniqueDisabledWorkflow,
   231  						},
   232  					}))
   233  				reg.Register(
   234  					httpmock.REST("PUT", "repos/OWNER/REPO/actions/workflows/123/disable"),
   235  					httpmock.StatusStringResponse(204, "{}"))
   236  			},
   237  		},
   238  		{
   239  			name: "nontty name arg nonunique",
   240  			opts: &DisableOptions{
   241  				Selector: "another workflow",
   242  			},
   243  			httpStubs: func(reg *httpmock.Registry) {
   244  				reg.Register(
   245  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/another workflow"),
   246  					httpmock.StatusStringResponse(404, "not found"))
   247  				reg.Register(
   248  					httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows"),
   249  					httpmock.JSONResponse(shared.WorkflowsPayload{
   250  						Workflows: []shared.Workflow{
   251  							shared.AWorkflow,
   252  							shared.DisabledWorkflow,
   253  							shared.AnotherWorkflow,
   254  							shared.YetAnotherWorkflow,
   255  							shared.AnotherDisabledWorkflow,
   256  							shared.UniqueDisabledWorkflow,
   257  						},
   258  					}))
   259  			},
   260  			wantErr:    true,
   261  			wantErrOut: "could not resolve to a unique workflow; found: another.yml yetanother.yml",
   262  		},
   263  	}
   264  
   265  	for _, tt := range tests {
   266  		reg := &httpmock.Registry{}
   267  		tt.httpStubs(reg)
   268  		tt.opts.HttpClient = func() (*http.Client, error) {
   269  			return &http.Client{Transport: reg}, nil
   270  		}
   271  
   272  		io, _, stdout, _ := iostreams.Test()
   273  		io.SetStdoutTTY(tt.tty)
   274  		io.SetStdinTTY(tt.tty)
   275  		tt.opts.IO = io
   276  		tt.opts.BaseRepo = func() (ghrepo.Interface, error) {
   277  			return ghrepo.FromFullName("OWNER/REPO")
   278  		}
   279  
   280  		as, teardown := prompt.InitAskStubber()
   281  		defer teardown()
   282  		if tt.askStubs != nil {
   283  			tt.askStubs(as)
   284  		}
   285  
   286  		t.Run(tt.name, func(t *testing.T) {
   287  			err := runDisable(tt.opts)
   288  			if tt.wantErr {
   289  				assert.Error(t, err)
   290  				assert.Equal(t, tt.wantErrOut, err.Error())
   291  				return
   292  			}
   293  			assert.NoError(t, err)
   294  			assert.Equal(t, tt.wantOut, stdout.String())
   295  			reg.Verify(t)
   296  		})
   297  	}
   298  }