github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/droplet_test.go (about) 1 package v7action_test 2 3 import ( 4 "errors" 5 "io" 6 "strings" 7 8 "code.cloudfoundry.org/cli/actor/actionerror" 9 . "code.cloudfoundry.org/cli/actor/v7action" 10 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 12 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 13 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 14 15 . "github.com/onsi/ginkgo" 16 . "github.com/onsi/gomega" 17 ) 18 19 var _ = Describe("Droplet Actions", func() { 20 var ( 21 actor *Actor 22 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 23 ) 24 25 BeforeEach(func() { 26 fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) 27 actor = NewActor(fakeCloudControllerClient, nil, nil, nil, nil) 28 }) 29 30 Describe("CreateApplicationDroplet", func() { 31 When("there are no client errors", func() { 32 BeforeEach(func() { 33 fakeCloudControllerClient.CreateDropletReturns( 34 ccv3.Droplet{ 35 GUID: "some-droplet-guid", 36 State: constant.DropletAwaitingUpload, 37 CreatedAt: "2017-08-14T21:16:42Z", 38 Image: "docker/some-image", 39 Stack: "penguin", 40 }, 41 ccv3.Warnings{"create-application-droplet-warning"}, 42 nil, 43 ) 44 }) 45 46 It("creates a droplet for the app", func() { 47 droplet, warnings, err := actor.CreateApplicationDroplet("some-app-guid") 48 49 Expect(err).ToNot(HaveOccurred()) 50 Expect(warnings).To(ConsistOf("create-application-droplet-warning")) 51 Expect(droplet).To(Equal(Droplet{ 52 GUID: "some-droplet-guid", 53 State: constant.DropletAwaitingUpload, 54 CreatedAt: "2017-08-14T21:16:42Z", 55 Image: "docker/some-image", 56 Stack: "penguin", 57 })) 58 59 Expect(fakeCloudControllerClient.CreateDropletCallCount()).To(Equal(1)) 60 Expect(fakeCloudControllerClient.CreateDropletArgsForCall(0)).To(Equal("some-app-guid")) 61 }) 62 }) 63 64 When("creating the application droplet fails", func() { 65 var expectedErr error 66 67 BeforeEach(func() { 68 expectedErr = errors.New("some upload droplet error") 69 70 fakeCloudControllerClient.CreateDropletReturns( 71 ccv3.Droplet{}, 72 ccv3.Warnings{"create-application-droplet-warning"}, 73 expectedErr, 74 ) 75 }) 76 77 It("returns the error", func() { 78 _, warnings, err := actor.CreateApplicationDroplet("some-app-guid") 79 80 Expect(err).To(Equal(expectedErr)) 81 Expect(warnings).To(ConsistOf("create-application-droplet-warning")) 82 }) 83 }) 84 }) 85 86 Describe("SetApplicationDropletByApplicationNameAndSpace", func() { 87 When("there are no client errors", func() { 88 BeforeEach(func() { 89 fakeCloudControllerClient.GetApplicationsReturns( 90 []ccv3.Application{ 91 {GUID: "some-app-guid"}, 92 }, 93 ccv3.Warnings{"get-applications-warning"}, 94 nil, 95 ) 96 97 fakeCloudControllerClient.SetApplicationDropletReturns( 98 ccv3.Relationship{GUID: "some-droplet-guid"}, 99 ccv3.Warnings{"set-application-droplet-warning"}, 100 nil, 101 ) 102 }) 103 104 It("sets the app's droplet", func() { 105 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 106 107 Expect(err).ToNot(HaveOccurred()) 108 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 109 110 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 111 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 112 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 113 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 114 )) 115 116 Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1)) 117 appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0) 118 Expect(appGUID).To(Equal("some-app-guid")) 119 Expect(dropletGUID).To(Equal("some-droplet-guid")) 120 }) 121 }) 122 123 When("getting the application fails", func() { 124 var expectedErr error 125 126 BeforeEach(func() { 127 expectedErr = errors.New("some get application error") 128 129 fakeCloudControllerClient.GetApplicationsReturns( 130 []ccv3.Application{}, 131 ccv3.Warnings{"get-applications-warning"}, 132 expectedErr, 133 ) 134 }) 135 136 It("returns the error", func() { 137 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 138 139 Expect(err).To(Equal(expectedErr)) 140 Expect(warnings).To(ConsistOf("get-applications-warning")) 141 }) 142 }) 143 144 When("setting the droplet fails", func() { 145 var expectedErr error 146 BeforeEach(func() { 147 expectedErr = errors.New("some set application-droplet error") 148 fakeCloudControllerClient.GetApplicationsReturns( 149 []ccv3.Application{ 150 {GUID: "some-app-guid"}, 151 }, 152 ccv3.Warnings{"get-applications-warning"}, 153 nil, 154 ) 155 156 fakeCloudControllerClient.SetApplicationDropletReturns( 157 ccv3.Relationship{}, 158 ccv3.Warnings{"set-application-droplet-warning"}, 159 expectedErr, 160 ) 161 }) 162 163 It("returns the error", func() { 164 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 165 166 Expect(err).To(Equal(expectedErr)) 167 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 168 }) 169 170 When("the cc client response contains an UnprocessableEntityError", func() { 171 BeforeEach(func() { 172 fakeCloudControllerClient.SetApplicationDropletReturns( 173 ccv3.Relationship{}, 174 ccv3.Warnings{"set-application-droplet-warning"}, 175 ccerror.UnprocessableEntityError{Message: "some-message"}, 176 ) 177 }) 178 179 It("raises the error as AssignDropletError and returns warnings", func() { 180 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 181 182 Expect(err).To(MatchError("some-message")) 183 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 184 }) 185 }) 186 187 }) 188 }) 189 190 Describe("SetApplicationDroplet", func() { 191 When("there are no client errors", func() { 192 BeforeEach(func() { 193 fakeCloudControllerClient.SetApplicationDropletReturns( 194 ccv3.Relationship{GUID: "some-droplet-guid"}, 195 ccv3.Warnings{"set-application-droplet-warning"}, 196 nil, 197 ) 198 }) 199 200 It("sets the app's droplet", func() { 201 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 202 203 Expect(err).ToNot(HaveOccurred()) 204 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 205 206 Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1)) 207 appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0) 208 Expect(appGUID).To(Equal("some-app-guid")) 209 Expect(dropletGUID).To(Equal("some-droplet-guid")) 210 }) 211 }) 212 213 When("setting the droplet fails", func() { 214 var expectedErr error 215 216 BeforeEach(func() { 217 expectedErr = errors.New("some set application-droplet error") 218 219 fakeCloudControllerClient.SetApplicationDropletReturns( 220 ccv3.Relationship{}, 221 ccv3.Warnings{"set-application-droplet-warning"}, 222 expectedErr, 223 ) 224 }) 225 226 It("returns the error", func() { 227 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 228 229 Expect(err).To(Equal(expectedErr)) 230 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 231 }) 232 233 When("the cc client response contains an UnprocessableEntityError", func() { 234 BeforeEach(func() { 235 fakeCloudControllerClient.SetApplicationDropletReturns( 236 ccv3.Relationship{}, 237 ccv3.Warnings{"set-application-droplet-warning"}, 238 ccerror.UnprocessableEntityError{Message: "some-message"}, 239 ) 240 }) 241 242 It("raises the error as AssignDropletError and returns warnings", func() { 243 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 244 245 Expect(err).To(MatchError("some-message")) 246 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 247 }) 248 }) 249 }) 250 }) 251 252 Describe("GetApplicationDroplets", func() { 253 When("there are no client errors", func() { 254 BeforeEach(func() { 255 fakeCloudControllerClient.GetApplicationsReturns( 256 []ccv3.Application{ 257 {GUID: "some-app-guid"}, 258 }, 259 ccv3.Warnings{"get-applications-warning"}, 260 nil, 261 ) 262 263 fakeCloudControllerClient.GetDropletsReturns( 264 []ccv3.Droplet{ 265 { 266 GUID: "some-droplet-guid-1", 267 State: constant.DropletStaged, 268 CreatedAt: "2017-08-14T21:16:42Z", 269 Buildpacks: []ccv3.DropletBuildpack{ 270 {Name: "ruby"}, 271 {Name: "nodejs"}, 272 }, 273 Image: "docker/some-image", 274 Stack: "penguin", 275 }, 276 { 277 GUID: "some-droplet-guid-2", 278 State: constant.DropletFailed, 279 CreatedAt: "2017-08-16T00:18:24Z", 280 Buildpacks: []ccv3.DropletBuildpack{ 281 {Name: "java"}, 282 }, 283 Stack: "windows", 284 }, 285 }, 286 ccv3.Warnings{"get-application-droplets-warning"}, 287 nil, 288 ) 289 }) 290 291 It("gets the app's droplets", func() { 292 droplets, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 293 294 Expect(err).ToNot(HaveOccurred()) 295 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning")) 296 Expect(droplets).To(Equal([]Droplet{ 297 { 298 GUID: "some-droplet-guid-1", 299 State: constant.DropletStaged, 300 CreatedAt: "2017-08-14T21:16:42Z", 301 Buildpacks: []DropletBuildpack{ 302 {Name: "ruby"}, 303 {Name: "nodejs"}, 304 }, 305 Image: "docker/some-image", 306 Stack: "penguin", 307 }, 308 { 309 GUID: "some-droplet-guid-2", 310 State: constant.DropletFailed, 311 CreatedAt: "2017-08-16T00:18:24Z", 312 Buildpacks: []DropletBuildpack{ 313 {Name: "java"}, 314 }, 315 Stack: "windows", 316 }, 317 })) 318 319 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 320 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 321 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 322 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 323 )) 324 325 Expect(fakeCloudControllerClient.GetDropletsCallCount()).To(Equal(1)) 326 Expect(fakeCloudControllerClient.GetDropletsArgsForCall(0)).To(ConsistOf( 327 ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}}, 328 )) 329 }) 330 }) 331 332 When("getting the application fails", func() { 333 var expectedErr error 334 335 BeforeEach(func() { 336 expectedErr = errors.New("some get application error") 337 338 fakeCloudControllerClient.GetApplicationsReturns( 339 []ccv3.Application{}, 340 ccv3.Warnings{"get-applications-warning"}, 341 expectedErr, 342 ) 343 }) 344 345 It("returns the error", func() { 346 _, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 347 348 Expect(err).To(Equal(expectedErr)) 349 Expect(warnings).To(ConsistOf("get-applications-warning")) 350 }) 351 }) 352 353 When("getting the application droplets fails", func() { 354 var expectedErr error 355 356 BeforeEach(func() { 357 expectedErr = errors.New("some get application error") 358 359 fakeCloudControllerClient.GetApplicationsReturns( 360 []ccv3.Application{ 361 {GUID: "some-app-guid"}, 362 }, 363 ccv3.Warnings{"get-applications-warning"}, 364 nil, 365 ) 366 367 fakeCloudControllerClient.GetDropletsReturns( 368 []ccv3.Droplet{}, 369 ccv3.Warnings{"get-application-droplets-warning"}, 370 expectedErr, 371 ) 372 }) 373 374 It("returns the error", func() { 375 _, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 376 377 Expect(err).To(Equal(expectedErr)) 378 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning")) 379 }) 380 }) 381 }) 382 383 Describe("GetCurrentDropletByApplication", func() { 384 var ( 385 appGUID string 386 387 currentDroplet Droplet 388 warnings Warnings 389 executionErr error 390 ) 391 392 BeforeEach(func() { 393 appGUID = "some-app-guid" 394 }) 395 396 JustBeforeEach(func() { 397 currentDroplet, warnings, executionErr = actor.GetCurrentDropletByApplication(appGUID) 398 }) 399 400 When("the current droplet exists", func() { 401 BeforeEach(func() { 402 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, nil) 403 }) 404 405 It("returns the current droplet", func() { 406 Expect(executionErr).ToNot(HaveOccurred()) 407 Expect(warnings).To(ConsistOf("some-warning")) 408 Expect(currentDroplet).To(Equal(Droplet{GUID: "some-droplet-guid"})) 409 410 Expect(fakeCloudControllerClient.GetApplicationDropletCurrentCallCount()).To(Equal(1)) 411 Expect(fakeCloudControllerClient.GetApplicationDropletCurrentArgsForCall(0)).To(Equal("some-app-guid")) 412 }) 413 }) 414 415 When("an error occurs", func() { 416 When("the app does not exist", func() { 417 BeforeEach(func() { 418 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, ccerror.ApplicationNotFoundError{}) 419 }) 420 421 It("returns an ApplicationNotFoundError and warnings", func() { 422 Expect(executionErr).To(MatchError(actionerror.ApplicationNotFoundError{GUID: appGUID})) 423 Expect(warnings).To(ConsistOf("some-warning")) 424 }) 425 }) 426 427 When("the current droplet does not exist", func() { 428 BeforeEach(func() { 429 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, ccerror.DropletNotFoundError{}) 430 }) 431 432 It("returns an DropletNotFoundError and warnings", func() { 433 Expect(executionErr).To(MatchError(actionerror.DropletNotFoundError{AppGUID: appGUID})) 434 Expect(warnings).To(ConsistOf("some-warning")) 435 }) 436 }) 437 438 When("a generic error occurs", func() { 439 var expectedErr error 440 441 BeforeEach(func() { 442 expectedErr = errors.New("some error") 443 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, expectedErr) 444 }) 445 446 It("returns the error and warnings", func() { 447 Expect(executionErr).To(MatchError(expectedErr)) 448 Expect(warnings).To(ConsistOf("some-warning")) 449 }) 450 }) 451 }) 452 }) 453 454 Describe("UploadDroplet", func() { 455 var ( 456 dropletGUID string 457 dropletFilePath string 458 reader io.Reader 459 readerLength int64 460 461 warnings Warnings 462 executeErr error 463 ) 464 465 BeforeEach(func() { 466 dropletGUID = "some-droplet-guid" 467 dropletContents := "i am a droplet" 468 reader = strings.NewReader(dropletContents) 469 readerLength = int64(len([]byte(dropletContents))) 470 }) 471 472 JustBeforeEach(func() { 473 dropletFilePath = "tmp/droplet.tgz" 474 warnings, executeErr = actor.UploadDroplet(dropletGUID, dropletFilePath, reader, readerLength) 475 }) 476 477 When("the upload is successful", func() { 478 BeforeEach(func() { 479 fakeCloudControllerClient.UploadDropletBitsReturns( 480 ccv3.JobURL("some-job-url"), 481 ccv3.Warnings{"some-upload-warning"}, 482 nil, 483 ) 484 485 fakeCloudControllerClient.PollJobReturns( 486 ccv3.Warnings{"some-job-warning"}, 487 nil, 488 ) 489 }) 490 491 It("returns any CC warnings", func() { 492 Expect(warnings).To(Equal(Warnings{"some-upload-warning", "some-job-warning"})) 493 Expect(executeErr).NotTo(HaveOccurred()) 494 }) 495 }) 496 497 When("the upload returns an error", func() { 498 var uploadErr = errors.New("upload failed") 499 500 BeforeEach(func() { 501 fakeCloudControllerClient.UploadDropletBitsReturns( 502 "", 503 ccv3.Warnings{"some-upload-warning"}, 504 uploadErr, 505 ) 506 }) 507 508 It("returns any warnings and the error", func() { 509 Expect(warnings).To(Equal(Warnings{"some-upload-warning"})) 510 Expect(executeErr).To(Equal(uploadErr)) 511 }) 512 }) 513 514 When("the upload job fails eventually", func() { 515 var jobErr = errors.New("job failed") 516 517 BeforeEach(func() { 518 fakeCloudControllerClient.UploadDropletBitsReturns( 519 ccv3.JobURL("some-job-url"), 520 ccv3.Warnings{"some-upload-warning"}, 521 nil, 522 ) 523 524 fakeCloudControllerClient.PollJobReturns( 525 ccv3.Warnings{"some-job-warning"}, 526 jobErr, 527 ) 528 }) 529 530 It("returns any warning and the error", func() { 531 Expect(warnings).To(Equal(Warnings{"some-upload-warning", "some-job-warning"})) 532 Expect(executeErr).To(Equal(jobErr)) 533 }) 534 }) 535 }) 536 })