github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/command/v3/run_task_command_test.go (about) 1 package v3_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/sharedaction" 7 "code.cloudfoundry.org/cli/actor/v3action" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/command" 10 "code.cloudfoundry.org/cli/command/commandfakes" 11 "code.cloudfoundry.org/cli/command/flag" 12 "code.cloudfoundry.org/cli/command/v3" 13 "code.cloudfoundry.org/cli/command/v3/v3fakes" 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 v3.RunTaskCommand 24 testUI *ui.UI 25 fakeConfig *commandfakes.FakeConfig 26 fakeSharedActor *commandfakes.FakeSharedActor 27 fakeActor *v3fakes.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(v3fakes.FakeRunTaskActor) 37 38 cmd = v3.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 fakeActor.CloudControllerAPIVersionReturns(command.MinVersionRunTaskV3) 51 }) 52 53 JustBeforeEach(func() { 54 executeErr = cmd.Execute(nil) 55 }) 56 57 Context("when the API version is below the minimum", func() { 58 BeforeEach(func() { 59 fakeActor.CloudControllerAPIVersionReturns("0.0.0") 60 }) 61 62 It("returns a MinimumAPIVersionNotMetError", func() { 63 Expect(executeErr).To(MatchError(command.MinimumAPIVersionNotMetError{ 64 CurrentVersion: "0.0.0", 65 MinimumVersion: command.MinVersionRunTaskV3, 66 })) 67 }) 68 }) 69 70 Context("when checking target fails", func() { 71 BeforeEach(func() { 72 fakeSharedActor.CheckTargetReturns(sharedaction.NotLoggedInError{BinaryName: binaryName}) 73 }) 74 75 It("returns an error", func() { 76 Expect(executeErr).To(MatchError(command.NotLoggedInError{BinaryName: binaryName})) 77 78 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 79 _, checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 80 Expect(checkTargetedOrg).To(BeTrue()) 81 Expect(checkTargetedSpace).To(BeTrue()) 82 }) 83 }) 84 85 Context("when the user is logged in, and a space and org are targeted", func() { 86 BeforeEach(func() { 87 fakeConfig.HasTargetedOrganizationReturns(true) 88 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 89 GUID: "some-org-guid", 90 Name: "some-org", 91 }) 92 fakeConfig.HasTargetedSpaceReturns(true) 93 fakeConfig.TargetedSpaceReturns(configv3.Space{ 94 GUID: "some-space-guid", 95 Name: "some-space", 96 }) 97 }) 98 99 Context("when getting the current user returns an error", func() { 100 var expectedErr error 101 102 BeforeEach(func() { 103 expectedErr = errors.New("got bananapants??") 104 fakeConfig.CurrentUserReturns( 105 configv3.User{}, 106 expectedErr) 107 }) 108 109 It("returns the error", func() { 110 Expect(executeErr).To(MatchError(expectedErr)) 111 }) 112 }) 113 114 Context("when getting the current user does not return an error", func() { 115 BeforeEach(func() { 116 fakeConfig.CurrentUserReturns( 117 configv3.User{Name: "some-user"}, 118 nil) 119 }) 120 121 Context("when provided a valid application name", func() { 122 BeforeEach(func() { 123 fakeActor.GetApplicationByNameAndSpaceReturns( 124 v3action.Application{GUID: "some-app-guid"}, 125 v3action.Warnings{"get-application-warning-1", "get-application-warning-2"}, 126 nil) 127 }) 128 129 Context("when the task name is not provided", func() { 130 BeforeEach(func() { 131 fakeActor.RunTaskReturns( 132 v3action.Task{ 133 Name: "31337ddd", 134 SequenceID: 3, 135 }, 136 v3action.Warnings{"get-application-warning-3"}, 137 nil) 138 }) 139 140 It("creates a new task and displays all warnings", func() { 141 Expect(executeErr).ToNot(HaveOccurred()) 142 143 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 144 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 145 Expect(appName).To(Equal("some-app-name")) 146 Expect(spaceGUID).To(Equal("some-space-guid")) 147 148 Expect(fakeActor.RunTaskCallCount()).To(Equal(1)) 149 appGUID, task := fakeActor.RunTaskArgsForCall(0) 150 Expect(appGUID).To(Equal("some-app-guid")) 151 Expect(task).To(Equal(v3action.Task{Command: "some command"})) 152 153 Expect(testUI.Out).To(Say(`Creating task for app some-app-name in org some-org / space some-space as some-user... 154 OK 155 156 Task has been submitted successfully for execution. 157 task name: 31337ddd 158 task id: 3 159 `)) 160 Expect(testUI.Err).To(Say(`get-application-warning-1 161 get-application-warning-2 162 get-application-warning-3`)) 163 }) 164 }) 165 166 Context("when the task name is provided", func() { 167 BeforeEach(func() { 168 cmd.Name = "some-task-name" 169 fakeActor.RunTaskReturns( 170 v3action.Task{ 171 Name: "some-task-name", 172 SequenceID: 3, 173 }, 174 v3action.Warnings{"get-application-warning-3"}, 175 nil) 176 }) 177 178 It("creates a new task and outputs all warnings", func() { 179 Expect(executeErr).ToNot(HaveOccurred()) 180 181 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 182 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 183 Expect(appName).To(Equal("some-app-name")) 184 Expect(spaceGUID).To(Equal("some-space-guid")) 185 186 Expect(fakeActor.RunTaskCallCount()).To(Equal(1)) 187 appGUID, task := fakeActor.RunTaskArgsForCall(0) 188 Expect(appGUID).To(Equal("some-app-guid")) 189 Expect(task).To(Equal(v3action.Task{Command: "some command", Name: "some-task-name"})) 190 191 Expect(testUI.Out).To(Say(`Creating task for app some-app-name in org some-org / space some-space as some-user... 192 OK 193 194 Task has been submitted successfully for execution. 195 task name: some-task-name 196 task id: 3`, 197 )) 198 Expect(testUI.Err).To(Say(`get-application-warning-1 199 get-application-warning-2 200 get-application-warning-3`)) 201 }) 202 }) 203 204 Context("when task disk space is provided", func() { 205 BeforeEach(func() { 206 cmd.Name = "some-task-name" 207 cmd.Disk = flag.Megabytes{uint64(321)} 208 fakeActor.RunTaskReturns( 209 v3action.Task{ 210 Name: "some-task-name", 211 SequenceID: 3, 212 }, 213 v3action.Warnings{"get-application-warning-3"}, 214 nil) 215 }) 216 217 It("creates a new task and outputs all warnings", func() { 218 Expect(executeErr).ToNot(HaveOccurred()) 219 220 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 221 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 222 Expect(appName).To(Equal("some-app-name")) 223 Expect(spaceGUID).To(Equal("some-space-guid")) 224 225 Expect(fakeActor.RunTaskCallCount()).To(Equal(1)) 226 appGUID, task := fakeActor.RunTaskArgsForCall(0) 227 Expect(appGUID).To(Equal("some-app-guid")) 228 Expect(task).To(Equal(v3action.Task{ 229 Command: "some command", 230 Name: "some-task-name", 231 DiskInMB: 321, 232 })) 233 234 Expect(testUI.Out).To(Say(`Creating task for app some-app-name in org some-org / space some-space as some-user... 235 OK 236 237 Task has been submitted successfully for execution. 238 task name: some-task-name 239 task id: 3`, 240 )) 241 Expect(testUI.Err).To(Say(`get-application-warning-1 242 get-application-warning-2 243 get-application-warning-3`)) 244 }) 245 }) 246 247 Context("when task memory is provided", func() { 248 BeforeEach(func() { 249 cmd.Name = "some-task-name" 250 cmd.Memory = flag.Megabytes{uint64(123)} 251 fakeActor.RunTaskReturns( 252 v3action.Task{ 253 Name: "some-task-name", 254 SequenceID: 3, 255 }, 256 v3action.Warnings{"get-application-warning-3"}, 257 nil) 258 }) 259 260 It("creates a new task and outputs all warnings", func() { 261 Expect(executeErr).ToNot(HaveOccurred()) 262 263 Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 264 appName, spaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) 265 Expect(appName).To(Equal("some-app-name")) 266 Expect(spaceGUID).To(Equal("some-space-guid")) 267 268 Expect(fakeActor.RunTaskCallCount()).To(Equal(1)) 269 appGUID, task := fakeActor.RunTaskArgsForCall(0) 270 Expect(appGUID).To(Equal("some-app-guid")) 271 Expect(task).To(Equal(v3action.Task{ 272 Command: "some command", 273 Name: "some-task-name", 274 MemoryInMB: 123, 275 })) 276 277 Expect(testUI.Out).To(Say(`Creating task for app some-app-name in org some-org / space some-space as some-user... 278 OK 279 280 Task has been submitted successfully for execution. 281 task name: some-task-name 282 task id: 3`, 283 )) 284 Expect(testUI.Err).To(Say(`get-application-warning-1 285 get-application-warning-2 286 get-application-warning-3`)) 287 }) 288 }) 289 }) 290 291 Context("when there are errors", func() { 292 Context("when the error is translatable", func() { 293 Context("when getting the app returns the error", func() { 294 var ( 295 returnedErr error 296 expectedErr error 297 ) 298 299 BeforeEach(func() { 300 expectedErr = errors.New("request-error") 301 returnedErr = ccerror.RequestError{Err: expectedErr} 302 fakeActor.GetApplicationByNameAndSpaceReturns( 303 v3action.Application{GUID: "some-app-guid"}, 304 nil, 305 returnedErr) 306 }) 307 308 It("returns a translatable error", func() { 309 Expect(executeErr).To(MatchError(command.APIRequestError{Err: expectedErr})) 310 }) 311 }) 312 313 Context("when running the task returns the error", func() { 314 var returnedErr error 315 316 BeforeEach(func() { 317 returnedErr = ccerror.UnverifiedServerError{URL: "some-url"} 318 fakeActor.GetApplicationByNameAndSpaceReturns( 319 v3action.Application{GUID: "some-app-guid"}, 320 nil, 321 nil) 322 fakeActor.RunTaskReturns( 323 v3action.Task{}, 324 nil, 325 returnedErr) 326 }) 327 328 It("returns a translatable error", func() { 329 Expect(executeErr).To(MatchError(command.InvalidSSLCertError{API: "some-url"})) 330 }) 331 }) 332 }) 333 334 Context("when the error is not translatable", func() { 335 Context("when getting the app returns the error", func() { 336 var expectedErr error 337 338 BeforeEach(func() { 339 expectedErr = errors.New("got bananapants??") 340 fakeActor.GetApplicationByNameAndSpaceReturns( 341 v3action.Application{GUID: "some-app-guid"}, 342 v3action.Warnings{"get-application-warning-1", "get-application-warning-2"}, 343 expectedErr) 344 }) 345 346 It("return the error and all warnings", func() { 347 Expect(executeErr).To(MatchError(expectedErr)) 348 349 Expect(testUI.Err).To(Say("get-application-warning-1")) 350 Expect(testUI.Err).To(Say("get-application-warning-2")) 351 }) 352 }) 353 354 Context("when running the task returns an error", func() { 355 var expectedErr error 356 357 BeforeEach(func() { 358 expectedErr = errors.New("got bananapants??") 359 fakeActor.GetApplicationByNameAndSpaceReturns( 360 v3action.Application{GUID: "some-app-guid"}, 361 v3action.Warnings{"get-application-warning-1", "get-application-warning-2"}, 362 nil) 363 fakeActor.RunTaskReturns( 364 v3action.Task{}, 365 v3action.Warnings{"run-task-warning-1", "run-task-warning-2"}, 366 expectedErr) 367 }) 368 369 It("returns the error and all warnings", func() { 370 Expect(executeErr).To(MatchError(expectedErr)) 371 372 Expect(testUI.Err).To(Say("get-application-warning-1")) 373 Expect(testUI.Err).To(Say("get-application-warning-2")) 374 Expect(testUI.Err).To(Say("run-task-warning-1")) 375 Expect(testUI.Err).To(Say("run-task-warning-2")) 376 }) 377 }) 378 }) 379 }) 380 }) 381 }) 382 })