github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/run_task_command_test.go (about)

     1  package v6_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/v3action"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	. "code.cloudfoundry.org/cli/command/v6"
    12  	"code.cloudfoundry.org/cli/command/v6/v6fakes"
    13  	"code.cloudfoundry.org/cli/types"
    14  	"code.cloudfoundry.org/cli/util/configv3"
    15  	"code.cloudfoundry.org/cli/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("run-task Command", func() {
    22  	var (
    23  		cmd             RunTaskCommand
    24  		testUI          *ui.UI
    25  		fakeConfig      *commandfakes.FakeConfig
    26  		fakeSharedActor *commandfakes.FakeSharedActor
    27  		fakeActor       *v6fakes.FakeRunTaskActor
    28  		binaryName      string
    29  		executeErr      error
    30  	)
    31  
    32  	BeforeEach(func() {
    33  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    34  		fakeConfig = new(commandfakes.FakeConfig)
    35  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    36  		fakeActor = new(v6fakes.FakeRunTaskActor)
    37  
    38  		cmd = RunTaskCommand{
    39  			UI:          testUI,
    40  			Config:      fakeConfig,
    41  			SharedActor: fakeSharedActor,
    42  			Actor:       fakeActor,
    43  		}
    44  
    45  		cmd.RequiredArgs.AppName = "some-app-name"
    46  		cmd.RequiredArgs.Command = "some command"
    47  
    48  		binaryName = "faceman"
    49  		fakeConfig.BinaryNameReturns(binaryName)
    50  	})
    51  
    52  	JustBeforeEach(func() {
    53  		executeErr = cmd.Execute(nil)
    54  	})
    55  
    56  	When("checking target fails", func() {
    57  		BeforeEach(func() {
    58  			fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName})
    59  		})
    60  
    61  		It("returns an error", func() {
    62  			Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: binaryName}))
    63  
    64  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    65  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    66  			Expect(checkTargetedOrg).To(BeTrue())
    67  			Expect(checkTargetedSpace).To(BeTrue())
    68  		})
    69  	})
    70  
    71  	When("the user is logged in, and a space and org are targeted", func() {
    72  		BeforeEach(func() {
    73  			fakeConfig.HasTargetedOrganizationReturns(true)
    74  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
    75  				GUID: "some-org-guid",
    76  				Name: "some-org",
    77  			})
    78  			fakeConfig.HasTargetedSpaceReturns(true)
    79  			fakeConfig.TargetedSpaceReturns(configv3.Space{
    80  				GUID: "some-space-guid",
    81  				Name: "some-space",
    82  			})
    83  		})
    84  
    85  		When("getting the current user returns an error", func() {
    86  			var expectedErr error
    87  
    88  			BeforeEach(func() {
    89  				expectedErr = errors.New("got bananapants??")
    90  				fakeConfig.CurrentUserReturns(
    91  					configv3.User{},
    92  					expectedErr)
    93  			})
    94  
    95  			It("returns the error", func() {
    96  				Expect(executeErr).To(MatchError(expectedErr))
    97  			})
    98  		})
    99  
   100  		When("getting the current user does not return an error", func() {
   101  			BeforeEach(func() {
   102  				fakeConfig.CurrentUserReturns(
   103  					configv3.User{Name: "some-user"},
   104  					nil)
   105  			})
   106  
   107  			When("provided a valid application name", func() {
   108  				BeforeEach(func() {
   109  					fakeActor.GetApplicationByNameAndSpaceReturns(
   110  						v3action.Application{GUID: "some-app-guid"},
   111  						v3action.Warnings{"get-application-warning-1", "get-application-warning-2"},
   112  						nil)
   113  				})
   114  
   115  				When("the task name is not provided", func() {
   116  					BeforeEach(func() {
   117  						fakeActor.RunTaskReturns(
   118  							v3action.Task{
   119  								Name:       "31337ddd",
   120  								SequenceID: 3,
   121  							},
   122  							v3action.Warnings{"get-application-warning-3"},
   123  							nil)
   124  					})
   125  
   126  					It("creates a new task and displays all warnings", func() {
   127  						Expect(executeErr).ToNot(HaveOccurred())
   128  
   129  						Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1))
   130  						appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0)
   131  						Expect(appName).To(Equal("some-app-name"))
   132  						Expect(spaceGUID).To(Equal("some-space-guid"))
   133  
   134  						Expect(fakeActor.RunTaskCallCount()).To(Equal(1))
   135  						appGUID, task := fakeActor.RunTaskArgsForCall(0)
   136  						Expect(appGUID).To(Equal("some-app-guid"))
   137  						Expect(task).To(Equal(v3action.Task{Command: "some command"}))
   138  
   139  						Expect(testUI.Out).To(Say("Creating task for app some-app-name in org some-org / space some-space as some-user..."))
   140  						Expect(testUI.Out).To(Say("OK"))
   141  
   142  						Expect(testUI.Out).To(Say("Task has been submitted successfully for execution."))
   143  						Expect(testUI.Out).To(Say(`task name:\s+31337ddd`))
   144  						Expect(testUI.Out).To(Say(`task id:\s+3`))
   145  
   146  						Expect(testUI.Err).To(Say("get-application-warning-1"))
   147  						Expect(testUI.Err).To(Say("get-application-warning-2"))
   148  						Expect(testUI.Err).To(Say("get-application-warning-3"))
   149  					})
   150  				})
   151  
   152  				When("task disk space is provided", func() {
   153  					BeforeEach(func() {
   154  						cmd.Name = "some-task-name"
   155  						cmd.Disk = flag.Megabytes{NullUint64: types.NullUint64{Value: 321, IsSet: true}}
   156  						cmd.Memory = flag.Megabytes{NullUint64: types.NullUint64{Value: 123, IsSet: true}}
   157  						fakeActor.RunTaskReturns(
   158  							v3action.Task{
   159  								Name:       "some-task-name",
   160  								SequenceID: 3,
   161  							},
   162  							v3action.Warnings{"get-application-warning-3"},
   163  							nil)
   164  					})
   165  
   166  					It("creates a new task and outputs all warnings", func() {
   167  						Expect(executeErr).ToNot(HaveOccurred())
   168  
   169  						Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1))
   170  						appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0)
   171  						Expect(appName).To(Equal("some-app-name"))
   172  						Expect(spaceGUID).To(Equal("some-space-guid"))
   173  
   174  						Expect(fakeActor.RunTaskCallCount()).To(Equal(1))
   175  						appGUID, task := fakeActor.RunTaskArgsForCall(0)
   176  						Expect(appGUID).To(Equal("some-app-guid"))
   177  						Expect(task).To(Equal(v3action.Task{
   178  							Command:    "some command",
   179  							Name:       "some-task-name",
   180  							DiskInMB:   321,
   181  							MemoryInMB: 123,
   182  						}))
   183  
   184  						Expect(testUI.Out).To(Say("Creating task for app some-app-name in org some-org / space some-space as some-user..."))
   185  						Expect(testUI.Out).To(Say("OK"))
   186  
   187  						Expect(testUI.Out).To(Say("Task has been submitted successfully for execution."))
   188  						Expect(testUI.Out).To(Say(`task name:\s+some-task-name`))
   189  						Expect(testUI.Out).To(Say(`task id:\s+3`))
   190  
   191  						Expect(testUI.Err).To(Say("get-application-warning-1"))
   192  						Expect(testUI.Err).To(Say("get-application-warning-2"))
   193  						Expect(testUI.Err).To(Say("get-application-warning-3"))
   194  					})
   195  				})
   196  			})
   197  
   198  			When("there are errors", func() {
   199  				When("the error is translatable", func() {
   200  					When("getting the app returns the error", func() {
   201  						var (
   202  							returnedErr error
   203  							expectedErr error
   204  						)
   205  
   206  						BeforeEach(func() {
   207  							expectedErr = errors.New("request-error")
   208  							returnedErr = ccerror.RequestError{Err: expectedErr}
   209  							fakeActor.GetApplicationByNameAndSpaceReturns(
   210  								v3action.Application{GUID: "some-app-guid"},
   211  								nil,
   212  								returnedErr)
   213  						})
   214  
   215  						It("returns a translatable error", func() {
   216  							Expect(executeErr).To(MatchError(ccerror.RequestError{Err: expectedErr}))
   217  						})
   218  					})
   219  
   220  					When("running the task returns the error", func() {
   221  						var returnedErr error
   222  
   223  						BeforeEach(func() {
   224  							returnedErr = ccerror.UnverifiedServerError{URL: "some-url"}
   225  							fakeActor.GetApplicationByNameAndSpaceReturns(
   226  								v3action.Application{GUID: "some-app-guid"},
   227  								nil,
   228  								nil)
   229  							fakeActor.RunTaskReturns(
   230  								v3action.Task{},
   231  								nil,
   232  								returnedErr)
   233  						})
   234  
   235  						It("returns a translatable error", func() {
   236  							Expect(executeErr).To(MatchError(returnedErr))
   237  						})
   238  					})
   239  				})
   240  
   241  				When("the error is not translatable", func() {
   242  					When("getting the app returns the error", func() {
   243  						var expectedErr error
   244  
   245  						BeforeEach(func() {
   246  							expectedErr = errors.New("got bananapants??")
   247  							fakeActor.GetApplicationByNameAndSpaceReturns(
   248  								v3action.Application{GUID: "some-app-guid"},
   249  								v3action.Warnings{"get-application-warning-1", "get-application-warning-2"},
   250  								expectedErr)
   251  						})
   252  
   253  						It("return the error and all warnings", func() {
   254  							Expect(executeErr).To(MatchError(expectedErr))
   255  
   256  							Expect(testUI.Err).To(Say("get-application-warning-1"))
   257  							Expect(testUI.Err).To(Say("get-application-warning-2"))
   258  						})
   259  					})
   260  
   261  					When("running the task returns an error", func() {
   262  						var expectedErr error
   263  
   264  						BeforeEach(func() {
   265  							expectedErr = errors.New("got bananapants??")
   266  							fakeActor.GetApplicationByNameAndSpaceReturns(
   267  								v3action.Application{GUID: "some-app-guid"},
   268  								v3action.Warnings{"get-application-warning-1", "get-application-warning-2"},
   269  								nil)
   270  							fakeActor.RunTaskReturns(
   271  								v3action.Task{},
   272  								v3action.Warnings{"run-task-warning-1", "run-task-warning-2"},
   273  								expectedErr)
   274  						})
   275  
   276  						It("returns the error and all warnings", func() {
   277  							Expect(executeErr).To(MatchError(expectedErr))
   278  
   279  							Expect(testUI.Err).To(Say("get-application-warning-1"))
   280  							Expect(testUI.Err).To(Say("get-application-warning-2"))
   281  							Expect(testUI.Err).To(Say("run-task-warning-1"))
   282  							Expect(testUI.Err).To(Say("run-task-warning-2"))
   283  						})
   284  					})
   285  				})
   286  			})
   287  		})
   288  	})
   289  })