github.com/arunkumar7540/cli@v6.45.0+incompatible/actor/v7action/package_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/sharedaction" 10 . "code.cloudfoundry.org/cli/actor/v7action" 11 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 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/ginkgo/extensions/table" 17 . "github.com/onsi/gomega" 18 . "github.com/onsi/gomega/gstruct" 19 ) 20 21 var _ = Describe("Package Actions", func() { 22 var ( 23 actor *Actor 24 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 25 fakeSharedActor *v7actionfakes.FakeSharedActor 26 fakeConfig *v7actionfakes.FakeConfig 27 ) 28 29 BeforeEach(func() { 30 fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) 31 fakeConfig = new(v7actionfakes.FakeConfig) 32 fakeSharedActor = new(v7actionfakes.FakeSharedActor) 33 actor = NewActor(fakeCloudControllerClient, fakeConfig, fakeSharedActor, nil) 34 }) 35 36 Describe("GetApplicationPackages", func() { 37 When("there are no client errors", func() { 38 BeforeEach(func() { 39 fakeCloudControllerClient.GetApplicationsReturns( 40 []ccv3.Application{ 41 {GUID: "some-app-guid"}, 42 }, 43 ccv3.Warnings{"get-applications-warning"}, 44 nil, 45 ) 46 47 fakeCloudControllerClient.GetPackagesReturns( 48 []ccv3.Package{ 49 { 50 GUID: "some-package-guid-1", 51 State: constant.PackageReady, 52 CreatedAt: "2017-08-14T21:16:42Z", 53 }, 54 { 55 GUID: "some-package-guid-2", 56 State: constant.PackageFailed, 57 CreatedAt: "2017-08-16T00:18:24Z", 58 }, 59 }, 60 ccv3.Warnings{"get-application-packages-warning"}, 61 nil, 62 ) 63 }) 64 65 It("gets the app's packages", func() { 66 packages, warnings, err := actor.GetApplicationPackages("some-app-name", "some-space-guid") 67 68 Expect(err).ToNot(HaveOccurred()) 69 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-packages-warning")) 70 Expect(packages).To(Equal([]Package{ 71 { 72 GUID: "some-package-guid-1", 73 State: constant.PackageReady, 74 CreatedAt: "2017-08-14T21:16:42Z", 75 }, 76 { 77 GUID: "some-package-guid-2", 78 State: constant.PackageFailed, 79 CreatedAt: "2017-08-16T00:18:24Z", 80 }, 81 })) 82 83 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 84 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 85 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 86 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 87 )) 88 89 Expect(fakeCloudControllerClient.GetPackagesCallCount()).To(Equal(1)) 90 Expect(fakeCloudControllerClient.GetPackagesArgsForCall(0)).To(ConsistOf( 91 ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}}, 92 )) 93 }) 94 }) 95 96 When("getting the application fails", func() { 97 var expectedErr error 98 99 BeforeEach(func() { 100 expectedErr = errors.New("some get application error") 101 102 fakeCloudControllerClient.GetApplicationsReturns( 103 []ccv3.Application{}, 104 ccv3.Warnings{"get-applications-warning"}, 105 expectedErr, 106 ) 107 }) 108 109 It("returns the error", func() { 110 _, warnings, err := actor.GetApplicationPackages("some-app-name", "some-space-guid") 111 112 Expect(err).To(Equal(expectedErr)) 113 Expect(warnings).To(ConsistOf("get-applications-warning")) 114 }) 115 }) 116 117 When("getting the application packages fails", func() { 118 var expectedErr error 119 120 BeforeEach(func() { 121 expectedErr = errors.New("some get application error") 122 123 fakeCloudControllerClient.GetApplicationsReturns( 124 []ccv3.Application{ 125 {GUID: "some-app-guid"}, 126 }, 127 ccv3.Warnings{"get-applications-warning"}, 128 nil, 129 ) 130 131 fakeCloudControllerClient.GetPackagesReturns( 132 []ccv3.Package{}, 133 ccv3.Warnings{"get-application-packages-warning"}, 134 expectedErr, 135 ) 136 }) 137 138 It("returns the error", func() { 139 _, warnings, err := actor.GetApplicationPackages("some-app-name", "some-space-guid") 140 141 Expect(err).To(Equal(expectedErr)) 142 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-packages-warning")) 143 }) 144 }) 145 }) 146 147 Describe("CreateDockerPackageByApplicationNameAndSpace", func() { 148 var ( 149 dockerPackage Package 150 warnings Warnings 151 executeErr error 152 ) 153 154 JustBeforeEach(func() { 155 dockerPackage, warnings, executeErr = actor.CreateDockerPackageByApplicationNameAndSpace("some-app-name", "some-space-guid", DockerImageCredentials{Path: "some-docker-image", Password: "some-password", Username: "some-username"}) 156 }) 157 158 When("the application can't be retrieved", func() { 159 BeforeEach(func() { 160 fakeCloudControllerClient.GetApplicationsReturns( 161 []ccv3.Application{}, 162 ccv3.Warnings{"some-app-warning"}, 163 errors.New("some-app-error"), 164 ) 165 }) 166 167 It("returns the error and all warnings", func() { 168 Expect(executeErr).To(MatchError("some-app-error")) 169 Expect(warnings).To(ConsistOf("some-app-warning")) 170 }) 171 }) 172 173 When("the application can be retrieved", func() { 174 BeforeEach(func() { 175 fakeCloudControllerClient.GetApplicationsReturns( 176 []ccv3.Application{ 177 { 178 Name: "some-app-name", 179 GUID: "some-app-guid", 180 }, 181 }, 182 ccv3.Warnings{"some-app-warning"}, 183 nil, 184 ) 185 }) 186 187 When("creating the package fails", func() { 188 BeforeEach(func() { 189 fakeCloudControllerClient.CreatePackageReturns( 190 ccv3.Package{}, 191 ccv3.Warnings{"some-create-package-warning"}, 192 errors.New("some-create-package-error"), 193 ) 194 }) 195 It("fails to create the package", func() { 196 Expect(executeErr).To(MatchError("some-create-package-error")) 197 Expect(warnings).To(ConsistOf("some-app-warning", "some-create-package-warning")) 198 }) 199 }) 200 201 When("creating the package succeeds", func() { 202 BeforeEach(func() { 203 createdPackage := ccv3.Package{ 204 DockerImage: "some-docker-image", 205 DockerUsername: "some-username", 206 DockerPassword: "some-password", 207 GUID: "some-pkg-guid", 208 State: constant.PackageReady, 209 Relationships: ccv3.Relationships{ 210 constant.RelationshipTypeApplication: ccv3.Relationship{ 211 GUID: "some-app-guid", 212 }, 213 }, 214 } 215 216 fakeCloudControllerClient.CreatePackageReturns( 217 createdPackage, 218 ccv3.Warnings{"some-create-package-warning"}, 219 nil, 220 ) 221 }) 222 223 It("calls CC to create the package and returns the package", func() { 224 Expect(executeErr).ToNot(HaveOccurred()) 225 Expect(warnings).To(ConsistOf("some-app-warning", "some-create-package-warning")) 226 227 expectedPackage := ccv3.Package{ 228 DockerImage: "some-docker-image", 229 DockerUsername: "some-username", 230 DockerPassword: "some-password", 231 GUID: "some-pkg-guid", 232 State: constant.PackageReady, 233 Relationships: ccv3.Relationships{ 234 constant.RelationshipTypeApplication: ccv3.Relationship{ 235 GUID: "some-app-guid", 236 }, 237 }, 238 } 239 Expect(dockerPackage).To(Equal(Package(expectedPackage))) 240 241 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 242 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 243 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 244 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 245 )) 246 247 Expect(fakeCloudControllerClient.CreatePackageCallCount()).To(Equal(1)) 248 Expect(fakeCloudControllerClient.CreatePackageArgsForCall(0)).To(Equal(ccv3.Package{ 249 Type: constant.PackageTypeDocker, 250 DockerImage: "some-docker-image", 251 DockerUsername: "some-username", 252 DockerPassword: "some-password", 253 Relationships: ccv3.Relationships{ 254 constant.RelationshipTypeApplication: ccv3.Relationship{GUID: "some-app-guid"}, 255 }, 256 })) 257 }) 258 }) 259 }) 260 }) 261 262 Describe("CreateBitsPackageByApplication", func() { 263 var ( 264 appGUID string 265 266 pkg Package 267 executeErr error 268 warnings Warnings 269 ) 270 271 JustBeforeEach(func() { 272 pkg, warnings, executeErr = actor.CreateBitsPackageByApplication(appGUID) 273 }) 274 275 When("creating the package fails", func() { 276 BeforeEach(func() { 277 fakeCloudControllerClient.CreatePackageReturns( 278 ccv3.Package{}, 279 ccv3.Warnings{"create-package-warning"}, 280 errors.New("some-create-error"), 281 ) 282 }) 283 284 It("returns the error", func() { 285 Expect(executeErr).To(MatchError("some-create-error")) 286 Expect(warnings).To(ConsistOf("create-package-warning")) 287 }) 288 }) 289 290 When("creating the package succeeds", func() { 291 var createdPackage ccv3.Package 292 293 BeforeEach(func() { 294 createdPackage = ccv3.Package{GUID: "some-pkg-guid"} 295 fakeCloudControllerClient.CreatePackageReturns( 296 createdPackage, 297 ccv3.Warnings{"create-package-warning"}, 298 nil, 299 ) 300 }) 301 302 It("returns all warnings and the package", func() { 303 Expect(executeErr).ToNot(HaveOccurred()) 304 305 Expect(fakeCloudControllerClient.CreatePackageCallCount()).To(Equal(1)) 306 Expect(fakeCloudControllerClient.CreatePackageArgsForCall(0)).To(Equal(ccv3.Package{ 307 Type: constant.PackageTypeBits, 308 Relationships: ccv3.Relationships{ 309 constant.RelationshipTypeApplication: ccv3.Relationship{GUID: appGUID}, 310 }, 311 })) 312 313 Expect(warnings).To(ConsistOf("create-package-warning")) 314 Expect(pkg).To(MatchFields(IgnoreExtras, Fields{ 315 "GUID": Equal("some-pkg-guid"), 316 })) 317 }) 318 }) 319 }) 320 321 Describe("UploadBitsPackage", func() { 322 var ( 323 pkg Package 324 matchedResources []sharedaction.V3Resource 325 reader io.Reader 326 readerLength int64 327 328 appPkg Package 329 warnings Warnings 330 executeErr error 331 ) 332 333 BeforeEach(func() { 334 pkg = Package{GUID: "some-package-guid"} 335 336 matchedResources = []sharedaction.V3Resource{{FilePath: "some-resource"}, {FilePath: "another-resource"}} 337 someString := "who reads these days" 338 reader = strings.NewReader(someString) 339 readerLength = int64(len([]byte(someString))) 340 }) 341 342 JustBeforeEach(func() { 343 appPkg, warnings, executeErr = actor.UploadBitsPackage(pkg, matchedResources, reader, readerLength) 344 }) 345 346 When("the upload is successful", func() { 347 BeforeEach(func() { 348 fakeCloudControllerClient.UploadBitsPackageReturns(ccv3.Package{GUID: "some-package-guid"}, ccv3.Warnings{"upload-warning-1", "upload-warning-2"}, nil) 349 }) 350 351 It("returns all warnings", func() { 352 Expect(executeErr).ToNot(HaveOccurred()) 353 Expect(warnings).To(ConsistOf("upload-warning-1", "upload-warning-2")) 354 Expect(appPkg).To(Equal(Package{GUID: "some-package-guid"})) 355 356 Expect(fakeCloudControllerClient.UploadBitsPackageCallCount()).To(Equal(1)) 357 passedPackage, passedExistingResources, passedReader, passedReaderLength := fakeCloudControllerClient.UploadBitsPackageArgsForCall(0) 358 Expect(passedPackage).To(Equal(ccv3.Package(appPkg))) 359 Expect(passedExistingResources).To(ConsistOf(ccv3.Resource{FilePath: "some-resource"}, ccv3.Resource{FilePath: "another-resource"})) 360 Expect(passedReader).To(Equal(reader)) 361 Expect(passedReaderLength).To(Equal(readerLength)) 362 }) 363 }) 364 365 When("the upload returns an error", func() { 366 var err error 367 368 BeforeEach(func() { 369 err = errors.New("some-error") 370 fakeCloudControllerClient.UploadBitsPackageReturns(ccv3.Package{}, ccv3.Warnings{"upload-warning-1", "upload-warning-2"}, err) 371 }) 372 373 It("returns the error", func() { 374 Expect(executeErr).To(MatchError(err)) 375 Expect(warnings).To(ConsistOf("upload-warning-1", "upload-warning-2")) 376 }) 377 }) 378 }) 379 380 Describe("PollPackage", func() { 381 Context("Polling Behavior", func() { 382 var ( 383 pkg Package 384 385 appPkg Package 386 warnings Warnings 387 executeErr error 388 ) 389 390 BeforeEach(func() { 391 pkg = Package{ 392 GUID: "some-pkg-guid", 393 } 394 395 warnings = nil 396 executeErr = nil 397 398 // putting this here so the tests don't hang on polling 399 fakeCloudControllerClient.GetPackageReturns( 400 ccv3.Package{ 401 GUID: "some-pkg-guid", 402 State: constant.PackageReady, 403 }, 404 ccv3.Warnings{}, 405 nil, 406 ) 407 }) 408 409 JustBeforeEach(func() { 410 appPkg, warnings, executeErr = actor.PollPackage(pkg) 411 }) 412 413 When("the polling errors", func() { 414 var expectedErr error 415 416 BeforeEach(func() { 417 expectedErr = errors.New("Fake error during polling") 418 fakeCloudControllerClient.GetPackageReturns( 419 ccv3.Package{}, 420 ccv3.Warnings{"some-get-pkg-warning"}, 421 expectedErr, 422 ) 423 }) 424 425 It("returns the error and warnings", func() { 426 Expect(executeErr).To(MatchError(expectedErr)) 427 Expect(warnings).To(ConsistOf("some-get-pkg-warning")) 428 }) 429 }) 430 431 When("the polling is successful", func() { 432 It("returns the package", func() { 433 Expect(executeErr).ToNot(HaveOccurred()) 434 435 expectedPackage := ccv3.Package{ 436 GUID: "some-pkg-guid", 437 State: constant.PackageReady, 438 } 439 440 Expect(appPkg).To(Equal(Package(expectedPackage))) 441 Expect(fakeCloudControllerClient.GetPackageCallCount()).To(Equal(1)) 442 Expect(fakeCloudControllerClient.GetPackageArgsForCall(0)).To(Equal("some-pkg-guid")) 443 }) 444 }) 445 }) 446 447 DescribeTable("Polling states", 448 func(finalState constant.PackageState, expectedErr error) { 449 fakeCloudControllerClient.GetPackageReturns( 450 ccv3.Package{GUID: "some-pkg-guid", State: constant.PackageAwaitingUpload}, 451 ccv3.Warnings{"poll-package-warning"}, 452 nil, 453 ) 454 455 fakeCloudControllerClient.GetPackageReturnsOnCall( 456 1, 457 ccv3.Package{State: finalState}, 458 ccv3.Warnings{"poll-package-warning"}, 459 nil, 460 ) 461 462 _, tableWarnings, err := actor.PollPackage(Package{ 463 GUID: "some-pkg-guid", 464 }) 465 466 if expectedErr == nil { 467 Expect(err).ToNot(HaveOccurred()) 468 } else { 469 Expect(err).To(MatchError(expectedErr)) 470 } 471 472 Expect(tableWarnings).To(ConsistOf("poll-package-warning", "poll-package-warning")) 473 474 Expect(fakeCloudControllerClient.GetPackageCallCount()).To(Equal(2)) 475 Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(2)) 476 }, 477 478 Entry("READY", constant.PackageReady, nil), 479 Entry("FAILED", constant.PackageFailed, actionerror.PackageProcessingFailedError{}), 480 Entry("EXPIRED", constant.PackageExpired, actionerror.PackageProcessingExpiredError{}), 481 ) 482 }) 483 })