github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+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 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 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 // FWhen("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 // 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 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 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 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 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 181 Describe("StageApplicationPackage", func() { 182 var ( 183 build Build 184 warnings Warnings 185 executeErr error 186 ) 187 188 JustBeforeEach(func() { 189 build, warnings, executeErr = actor.StageApplicationPackage("some-package-guid") 190 }) 191 192 When("the creation is successful", func() { 193 BeforeEach(func() { 194 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: "some-build-guid"}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil) 195 }) 196 197 It("returns the build and warnings", func() { 198 Expect(executeErr).ToNot(HaveOccurred()) 199 Expect(build).To(Equal(Build{GUID: "some-build-guid"})) 200 Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2")) 201 }) 202 }) 203 204 When("the creation fails", func() { 205 BeforeEach(func() { 206 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, errors.New("blurp")) 207 }) 208 209 It("returns the error and warnings", func() { 210 Expect(executeErr).To(MatchError("blurp")) 211 Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2")) 212 }) 213 }) 214 }) 215 216 Describe("PollBuild", func() { 217 var ( 218 droplet Droplet 219 warnings Warnings 220 executeErr error 221 ) 222 223 JustBeforeEach(func() { 224 droplet, warnings, executeErr = actor.PollBuild("some-build-guid", "some-app") 225 }) 226 227 When("getting the build yields a 'Staged' build", func() { 228 BeforeEach(func() { 229 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildStaging}, ccv3.Warnings{"some-get-build-warnings"}, nil) 230 fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{GUID: "some-build-guid", DropletGUID: "some-droplet-guid", State: constant.BuildStaged}, ccv3.Warnings{"some-get-build-warnings"}, nil) 231 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 232 }) 233 234 It("gets the droplet", func() { 235 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 236 237 Expect(fakeCloudControllerClient.GetDropletCallCount()).To(Equal(1)) 238 Expect(fakeCloudControllerClient.GetDropletArgsForCall(0)).To(Equal("some-droplet-guid")) 239 }) 240 241 When("getting the droplet is successful", func() { 242 BeforeEach(func() { 243 fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: "some-droplet-guid", CreatedAt: "some-droplet-time", State: constant.DropletStaged}, ccv3.Warnings{"some-get-droplet-warnings"}, nil) 244 }) 245 246 It("returns the droplet and warnings", func() { 247 Expect(executeErr).ToNot(HaveOccurred()) 248 249 Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings")) 250 Expect(droplet).To(Equal(Droplet{ 251 GUID: "some-droplet-guid", 252 CreatedAt: "some-droplet-time", 253 State: constant.DropletStaged, 254 })) 255 }) 256 }) 257 258 When("getting the droplet fails", func() { 259 BeforeEach(func() { 260 fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"some-get-droplet-warnings"}, errors.New("no rain")) 261 }) 262 263 It("returns the error and warnings", func() { 264 Expect(executeErr).To(MatchError("no rain")) 265 Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings")) 266 }) 267 }) 268 }) 269 270 When("getting the build yields a 'Failed' build", func() { 271 BeforeEach(func() { 272 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildFailed, Error: "ded build"}, ccv3.Warnings{"some-get-build-warnings"}, nil) 273 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 274 }) 275 276 It("returns the error and warnings", func() { 277 Expect(executeErr).To(MatchError("ded build")) 278 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 279 }) 280 }) 281 282 When("getting the build fails", func() { 283 BeforeEach(func() { 284 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, errors.New("some-poll-build-error")) 285 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 286 }) 287 288 It("returns the error and warnings", func() { 289 Expect(executeErr).To(MatchError("some-poll-build-error")) 290 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 291 }) 292 }) 293 294 When("polling the build times out", func() { 295 BeforeEach(func() { 296 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, nil) 297 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 298 }) 299 300 It("returns the error and warnings", func() { 301 Expect(executeErr).To(MatchError(actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 500 * time.Millisecond})) 302 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 303 }) 304 }) 305 }) 306 })