github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/v3action/build_test.go (about)

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