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  })