github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/build_test.go (about)

     1  package v7action_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	. "code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    12  	"code.cloudfoundry.org/clock"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Build Actions", func() {
    18  	var (
    19  		actor                     *Actor
    20  		fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient
    21  		fakeConfig                *v7actionfakes.FakeConfig
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient)
    26  		fakeConfig = new(v7actionfakes.FakeConfig)
    27  		actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, nil, clock.NewClock())
    28  	})
    29  
    30  	Describe("StagePackage", func() {
    31  		var (
    32  			dropletStream  <-chan Droplet
    33  			warningsStream <-chan Warnings
    34  			errorStream    <-chan error
    35  
    36  			appName     string
    37  			appGUID     string
    38  			buildGUID   string
    39  			dropletGUID string
    40  			spaceGUID   string
    41  			packageGUID string
    42  		)
    43  
    44  		BeforeEach(func() {
    45  			appName = "some-app"
    46  			appGUID = "app-guid"
    47  			spaceGUID = "space-guid"
    48  			packageGUID = "some-package-guid"
    49  		})
    50  
    51  		AfterEach(func() {
    52  			Eventually(errorStream).Should(BeClosed())
    53  			Eventually(warningsStream).Should(BeClosed())
    54  			Eventually(dropletStream).Should(BeClosed())
    55  		})
    56  
    57  		JustBeforeEach(func() {
    58  			dropletStream, warningsStream, errorStream = actor.StagePackage(packageGUID, appName, spaceGUID)
    59  		})
    60  
    61  		When("finding the app fails", func() {
    62  			var expectedErr error
    63  
    64  			BeforeEach(func() {
    65  				expectedErr = errors.New("I am a tomato")
    66  				fakeCloudControllerClient.GetApplicationsReturns(nil, ccv3.Warnings{"get-apps-warning"}, expectedErr)
    67  			})
    68  
    69  			It("returns the error and warnings", func() {
    70  				Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
    71  				Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
    72  			})
    73  		})
    74  
    75  		When("app is not found", func() {
    76  			BeforeEach(func() {
    77  				fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{}, ccv3.Warnings{"get-apps-warning"}, nil)
    78  			})
    79  
    80  			It("returns the error and warnings", func() {
    81  				Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
    82  				Eventually(errorStream).Should(Receive(MatchError(actionerror.ApplicationNotFoundError{Name: appName})))
    83  			})
    84  		})
    85  
    86  		When("finding the package fails", func() {
    87  			var expectedErr error
    88  
    89  			BeforeEach(func() {
    90  				expectedErr = errors.New("I am a passion fruit")
    91  				fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil)
    92  				fakeCloudControllerClient.GetPackagesReturns([]ccv3.Package{}, ccv3.Warnings{"get-packages-warning"}, expectedErr)
    93  			})
    94  
    95  			It("returns the error and warnings", func() {
    96  				Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
    97  				Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
    98  				Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
    99  			})
   100  		})
   101  
   102  		When("the package belongs to a different app", func() {
   103  			BeforeEach(func() {
   104  				fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil)
   105  				fakeCloudControllerClient.GetPackagesReturns(
   106  					[]ccv3.Package{},
   107  					ccv3.Warnings{"get-packages-warning"},
   108  					nil,
   109  				)
   110  			})
   111  
   112  			It("returns a not found error and warnings", func() {
   113  				Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   114  				Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   115  				Eventually(errorStream).Should(Receive(MatchError(actionerror.PackageNotFoundInAppError{GUID: packageGUID, AppName: appName})))
   116  			})
   117  		})
   118  
   119  		When("the creation is successful", func() {
   120  			BeforeEach(func() {
   121  				fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil)
   122  				fakeCloudControllerClient.GetPackagesReturns(
   123  					[]ccv3.Package{{GUID: packageGUID}},
   124  					ccv3.Warnings{"get-packages-warning"},
   125  					nil,
   126  				)
   127  
   128  				buildGUID = "some-build-guid"
   129  				dropletGUID = "some-droplet-guid"
   130  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil)
   131  				fakeConfig.StagingTimeoutReturns(time.Minute)
   132  			})
   133  
   134  			When("the polling is successful", func() {
   135  				BeforeEach(func() {
   136  					fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil)
   137  					fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{CreatedAt: "some-time", GUID: buildGUID, State: constant.BuildStaged, DropletGUID: "some-droplet-guid"}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil)
   138  				})
   139  
   140  				//TODO: uncommend after #150569020
   141  				// FWhen("looking up the droplet fails", func() {
   142  				// 	BeforeEach(func() {
   143  				// 		fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, errors.New("some-droplet-error"))
   144  				// 	})
   145  
   146  				// 	It("returns the warnings and the droplet error", func() {
   147  				//    Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   148  				//    Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   149  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   150  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   151  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   152  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2")))
   153  
   154  				// 		Eventually(errorStream).Should(Receive(MatchError("some-droplet-error")))
   155  				// 	})
   156  				// })
   157  
   158  				// When("looking up the droplet succeeds", func() {
   159  				// 	BeforeEach(func() {
   160  				// 		fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: dropletGUID, State: ccv3.DropletStateStaged}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, nil)
   161  				// 	})
   162  
   163  				It("polls until build is finished and returns the final droplet", func() {
   164  					Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   165  					Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   166  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   167  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   168  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   169  					// Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2")))
   170  
   171  					Eventually(dropletStream).Should(Receive(Equal(Droplet{GUID: dropletGUID, State: constant.DropletStaged, CreatedAt: "some-time"})))
   172  					Consistently(errorStream).ShouldNot(Receive())
   173  
   174  					Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   175  					Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(Equal([]ccv3.Query{
   176  						{Key: ccv3.NameFilter, Values: []string{appName}},
   177  						{Key: ccv3.SpaceGUIDFilter, Values: []string{spaceGUID}},
   178  					}))
   179  
   180  					Expect(fakeCloudControllerClient.GetPackagesCallCount()).To(Equal(1))
   181  					Expect(fakeCloudControllerClient.GetPackagesArgsForCall(0)).To(Equal([]ccv3.Query{
   182  						{Key: ccv3.AppGUIDFilter, Values: []string{appGUID}},
   183  					}))
   184  
   185  					Expect(fakeCloudControllerClient.CreateBuildCallCount()).To(Equal(1))
   186  					Expect(fakeCloudControllerClient.CreateBuildArgsForCall(0)).To(Equal(ccv3.Build{
   187  						PackageGUID: "some-package-guid",
   188  					}))
   189  
   190  					Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2))
   191  					Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID))
   192  					Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID))
   193  
   194  					Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1))
   195  				})
   196  				// })
   197  
   198  				When("polling returns a failed build", func() {
   199  					BeforeEach(func() {
   200  						fakeCloudControllerClient.GetBuildReturnsOnCall(
   201  							1,
   202  							ccv3.Build{
   203  								GUID:  buildGUID,
   204  								State: constant.BuildFailed,
   205  								Error: "some staging error",
   206  							},
   207  							ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil)
   208  					})
   209  
   210  					It("returns an error and all warnings", func() {
   211  						Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   212  						Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   213  						Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   214  						Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   215  						Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   216  						stagingErr := errors.New("some staging error")
   217  						Eventually(errorStream).Should(Receive(&stagingErr))
   218  						Eventually(dropletStream).ShouldNot(Receive())
   219  
   220  						Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2))
   221  						Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID))
   222  						Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID))
   223  
   224  						Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1))
   225  					})
   226  				})
   227  			})
   228  
   229  			When("polling times out", func() {
   230  				var expectedErr error
   231  
   232  				BeforeEach(func() {
   233  					expectedErr = actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 0}
   234  					fakeConfig.StagingTimeoutReturns(0)
   235  				})
   236  
   237  				It("returns the error and warnings", func() {
   238  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   239  					Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   240  				})
   241  			})
   242  
   243  			When("the polling errors", func() {
   244  				var expectedErr error
   245  
   246  				BeforeEach(func() {
   247  					expectedErr = errors.New("I am a banana")
   248  					fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil)
   249  					fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, expectedErr)
   250  				})
   251  
   252  				It("returns the error and warnings", func() {
   253  					Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   254  					Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   255  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   256  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   257  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   258  					Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   259  				})
   260  			})
   261  		})
   262  
   263  		When("creation errors", func() {
   264  			var expectedErr error
   265  
   266  			BeforeEach(func() {
   267  				fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil)
   268  				fakeCloudControllerClient.GetPackagesReturns(
   269  					[]ccv3.Package{{GUID: packageGUID}},
   270  					ccv3.Warnings{"get-packages-warning"},
   271  					nil,
   272  				)
   273  
   274  				expectedErr = errors.New("I am a banana")
   275  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, expectedErr)
   276  			})
   277  
   278  			It("returns the error and warnings", func() {
   279  				Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning")))
   280  				Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning")))
   281  				Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   282  				Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   283  			})
   284  		})
   285  	})
   286  
   287  	Describe("StageApplicationPackage", func() {
   288  		var (
   289  			build      Build
   290  			warnings   Warnings
   291  			executeErr error
   292  		)
   293  
   294  		JustBeforeEach(func() {
   295  			build, warnings, executeErr = actor.StageApplicationPackage("some-package-guid")
   296  		})
   297  
   298  		When("the creation is successful", func() {
   299  			BeforeEach(func() {
   300  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: "some-build-guid"}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil)
   301  			})
   302  
   303  			It("returns the build and warnings", func() {
   304  				Expect(executeErr).ToNot(HaveOccurred())
   305  				Expect(build).To(Equal(Build{GUID: "some-build-guid"}))
   306  				Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2"))
   307  			})
   308  		})
   309  
   310  		When("the creation fails", func() {
   311  			BeforeEach(func() {
   312  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, errors.New("blurp"))
   313  			})
   314  
   315  			It("returns the error and warnings", func() {
   316  				Expect(executeErr).To(MatchError("blurp"))
   317  				Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2"))
   318  			})
   319  		})
   320  	})
   321  
   322  	Describe("PollBuild", func() {
   323  		var (
   324  			droplet    Droplet
   325  			warnings   Warnings
   326  			executeErr error
   327  		)
   328  
   329  		JustBeforeEach(func() {
   330  			droplet, warnings, executeErr = actor.PollBuild("some-build-guid", "some-app")
   331  		})
   332  
   333  		When("getting the build yields a 'Staged' build", func() {
   334  			BeforeEach(func() {
   335  				fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildStaging}, ccv3.Warnings{"some-get-build-warnings"}, nil)
   336  				fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{GUID: "some-build-guid", DropletGUID: "some-droplet-guid", State: constant.BuildStaged}, ccv3.Warnings{"some-get-build-warnings"}, nil)
   337  				fakeConfig.StagingTimeoutReturns(500 * time.Millisecond)
   338  			})
   339  
   340  			It("gets the droplet", func() {
   341  				Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2))
   342  
   343  				Expect(fakeCloudControllerClient.GetDropletCallCount()).To(Equal(1))
   344  				Expect(fakeCloudControllerClient.GetDropletArgsForCall(0)).To(Equal("some-droplet-guid"))
   345  			})
   346  
   347  			When("getting the droplet is successful", func() {
   348  				BeforeEach(func() {
   349  					fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: "some-droplet-guid", CreatedAt: "some-droplet-time", State: constant.DropletStaged}, ccv3.Warnings{"some-get-droplet-warnings"}, nil)
   350  				})
   351  
   352  				It("returns the droplet and warnings", func() {
   353  					Expect(executeErr).ToNot(HaveOccurred())
   354  
   355  					Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings"))
   356  					Expect(droplet).To(Equal(Droplet{
   357  						GUID:      "some-droplet-guid",
   358  						CreatedAt: "some-droplet-time",
   359  						State:     constant.DropletStaged,
   360  					}))
   361  				})
   362  			})
   363  
   364  			When("getting the droplet fails", func() {
   365  				BeforeEach(func() {
   366  					fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"some-get-droplet-warnings"}, errors.New("no rain"))
   367  				})
   368  
   369  				It("returns the error and warnings", func() {
   370  					Expect(executeErr).To(MatchError("no rain"))
   371  					Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings"))
   372  				})
   373  			})
   374  		})
   375  
   376  		When("getting the build yields a 'Failed' build", func() {
   377  			BeforeEach(func() {
   378  				fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildFailed, Error: "ded build"}, ccv3.Warnings{"some-get-build-warnings"}, nil)
   379  				fakeConfig.StagingTimeoutReturns(500 * time.Millisecond)
   380  			})
   381  
   382  			It("returns the error and warnings", func() {
   383  				Expect(executeErr).To(MatchError("ded build"))
   384  				Expect(warnings).To(ConsistOf("some-get-build-warnings"))
   385  			})
   386  		})
   387  
   388  		When("getting the build fails", func() {
   389  			BeforeEach(func() {
   390  				fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, errors.New("some-poll-build-error"))
   391  				fakeConfig.StagingTimeoutReturns(500 * time.Millisecond)
   392  			})
   393  
   394  			It("returns the error and warnings", func() {
   395  				Expect(executeErr).To(MatchError("some-poll-build-error"))
   396  				Expect(warnings).To(ConsistOf("some-get-build-warnings"))
   397  			})
   398  		})
   399  
   400  		When("polling the build times out", func() {
   401  			BeforeEach(func() {
   402  				fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, nil)
   403  				fakeConfig.StagingTimeoutReturns(500 * time.Millisecond)
   404  			})
   405  
   406  			It("returns the error and warnings", func() {
   407  				Expect(executeErr).To(MatchError(actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 500 * time.Millisecond}))
   408  				Expect(warnings).To(ConsistOf("some-get-build-warnings"))
   409  			})
   410  		})
   411  	})
   412  })