github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+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/v3action" 8 "code.cloudfoundry.org/cli/actor/v3action/v3actionfakes" 9 "code.cloudfoundry.org/cli/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 })