github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/actor/v3action/build_test.go (about)

     1  package v3action_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	. "code.cloudfoundry.org/cli/actor/v3action"
     9  	"code.cloudfoundry.org/cli/actor/v3action/v3actionfakes"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Build Actions", func() {
    17  	var (
    18  		actor                     *Actor
    19  		fakeCloudControllerClient *v3actionfakes.FakeCloudControllerClient
    20  		fakeConfig                *v3actionfakes.FakeConfig
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient)
    25  		fakeConfig = new(v3actionfakes.FakeConfig)
    26  		actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, nil)
    27  	})
    28  
    29  	Describe("StagePackage", func() {
    30  		var (
    31  			dropletStream  <-chan Droplet
    32  			warningsStream <-chan Warnings
    33  			errorStream    <-chan error
    34  
    35  			buildGUID   string
    36  			dropletGUID string
    37  		)
    38  
    39  		AfterEach(func() {
    40  			Eventually(errorStream).Should(BeClosed())
    41  			Eventually(warningsStream).Should(BeClosed())
    42  			Eventually(dropletStream).Should(BeClosed())
    43  		})
    44  
    45  		JustBeforeEach(func() {
    46  			dropletStream, warningsStream, errorStream = actor.StagePackage("some-package-guid", "some-app")
    47  		})
    48  
    49  		Context("when the creation is successful", func() {
    50  			BeforeEach(func() {
    51  				buildGUID = "some-build-guid"
    52  				dropletGUID = "some-droplet-guid"
    53  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil)
    54  				fakeConfig.StagingTimeoutReturns(time.Minute)
    55  			})
    56  
    57  			Context("when the polling is successful", func() {
    58  				BeforeEach(func() {
    59  					fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil)
    60  					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)
    61  				})
    62  
    63  				//TODO: uncommend after #150569020
    64  				// FContext("when looking up the droplet fails", func() {
    65  				// 	BeforeEach(func() {
    66  				// 		fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, errors.New("some-droplet-error"))
    67  				// 	})
    68  
    69  				// 	It("returns the warnings and the droplet error", func() {
    70  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
    71  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
    72  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
    73  				// 		Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2")))
    74  
    75  				// 		Eventually(errorStream).Should(Receive(MatchError("some-droplet-error")))
    76  				// 	})
    77  				// })
    78  
    79  				// Context("when looking up the droplet succeeds", func() {
    80  				// 	BeforeEach(func() {
    81  				// 		fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: dropletGUID, State: ccv3.DropletStateStaged}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, nil)
    82  				// 	})
    83  
    84  				It("polls until build is finished and returns the final droplet", func() {
    85  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
    86  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
    87  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
    88  					// Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2")))
    89  
    90  					Eventually(dropletStream).Should(Receive(Equal(Droplet{GUID: dropletGUID, State: constant.DropletStaged, CreatedAt: "some-time"})))
    91  					Consistently(errorStream).ShouldNot(Receive())
    92  
    93  					Expect(fakeCloudControllerClient.CreateBuildCallCount()).To(Equal(1))
    94  					Expect(fakeCloudControllerClient.CreateBuildArgsForCall(0)).To(Equal(ccv3.Build{
    95  						PackageGUID: "some-package-guid",
    96  					}))
    97  
    98  					Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2))
    99  					Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID))
   100  					Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID))
   101  
   102  					Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1))
   103  				})
   104  				// })
   105  
   106  				Context("when polling returns a failed build", func() {
   107  					BeforeEach(func() {
   108  						fakeCloudControllerClient.GetBuildReturnsOnCall(
   109  							1,
   110  							ccv3.Build{
   111  								GUID:  buildGUID,
   112  								State: constant.BuildFailed,
   113  								Error: "some staging error",
   114  							},
   115  							ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil)
   116  					})
   117  
   118  					It("returns an error and all warnings", func() {
   119  						Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   120  						Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   121  						Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   122  						stagingErr := errors.New("some staging error")
   123  						Eventually(errorStream).Should(Receive(&stagingErr))
   124  						Eventually(dropletStream).ShouldNot(Receive())
   125  
   126  						Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2))
   127  						Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID))
   128  						Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID))
   129  
   130  						Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1))
   131  					})
   132  				})
   133  			})
   134  
   135  			Context("when polling times out", func() {
   136  				var expectedErr error
   137  
   138  				BeforeEach(func() {
   139  					expectedErr = actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 0}
   140  					fakeConfig.StagingTimeoutReturns(0)
   141  				})
   142  
   143  				It("returns the error and warnings", func() {
   144  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   145  					Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   146  				})
   147  			})
   148  
   149  			Context("when the polling errors", func() {
   150  				var expectedErr error
   151  
   152  				BeforeEach(func() {
   153  					expectedErr = errors.New("I am a banana")
   154  					fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil)
   155  					fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, expectedErr)
   156  				})
   157  
   158  				It("returns the error and warnings", func() {
   159  					Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   160  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2")))
   161  					Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4")))
   162  					Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   163  				})
   164  			})
   165  		})
   166  
   167  		Context("when creation errors", func() {
   168  			var expectedErr error
   169  			BeforeEach(func() {
   170  				expectedErr = errors.New("I am a banana")
   171  				fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, expectedErr)
   172  			})
   173  
   174  			It("returns the error and warnings", func() {
   175  				Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2")))
   176  				Eventually(errorStream).Should(Receive(MatchError(expectedErr)))
   177  			})
   178  		})
   179  	})
   180  })