github.com/cloudfoundry/cli@v7.1.0+incompatible/actor/v3action/droplet_test.go (about) 1 package v3action_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 . "code.cloudfoundry.org/cli/actor/v3action" 8 "code.cloudfoundry.org/cli/actor/v3action/v3actionfakes" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 12 "code.cloudfoundry.org/cli/resources" 13 14 . "github.com/onsi/ginkgo" 15 . "github.com/onsi/gomega" 16 ) 17 18 var _ = Describe("Droplet Actions", func() { 19 var ( 20 actor *Actor 21 fakeCloudControllerClient *v3actionfakes.FakeCloudControllerClient 22 ) 23 24 BeforeEach(func() { 25 fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient) 26 actor = NewActor(fakeCloudControllerClient, nil, nil, nil) 27 }) 28 29 Describe("SetApplicationDropletByApplicationNameAndSpace", func() { 30 When("there are no client errors", func() { 31 BeforeEach(func() { 32 fakeCloudControllerClient.GetApplicationsReturns( 33 []resources.Application{ 34 {GUID: "some-app-guid"}, 35 }, 36 ccv3.Warnings{"get-applications-warning"}, 37 nil, 38 ) 39 40 fakeCloudControllerClient.SetApplicationDropletReturns( 41 resources.Relationship{GUID: "some-droplet-guid"}, 42 ccv3.Warnings{"set-application-droplet-warning"}, 43 nil, 44 ) 45 }) 46 47 It("sets the app's droplet", func() { 48 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 49 50 Expect(err).ToNot(HaveOccurred()) 51 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 52 53 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 54 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 55 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 56 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 57 )) 58 59 Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1)) 60 appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0) 61 Expect(appGUID).To(Equal("some-app-guid")) 62 Expect(dropletGUID).To(Equal("some-droplet-guid")) 63 }) 64 }) 65 66 When("getting the application fails", func() { 67 var expectedErr error 68 69 BeforeEach(func() { 70 expectedErr = errors.New("some get application error") 71 72 fakeCloudControllerClient.GetApplicationsReturns( 73 []resources.Application{}, 74 ccv3.Warnings{"get-applications-warning"}, 75 expectedErr, 76 ) 77 }) 78 79 It("returns the error", func() { 80 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 81 82 Expect(err).To(Equal(expectedErr)) 83 Expect(warnings).To(ConsistOf("get-applications-warning")) 84 }) 85 }) 86 87 When("setting the droplet fails", func() { 88 var expectedErr error 89 BeforeEach(func() { 90 expectedErr = errors.New("some set application-droplet error") 91 fakeCloudControllerClient.GetApplicationsReturns( 92 []resources.Application{ 93 {GUID: "some-app-guid"}, 94 }, 95 ccv3.Warnings{"get-applications-warning"}, 96 nil, 97 ) 98 99 fakeCloudControllerClient.SetApplicationDropletReturns( 100 resources.Relationship{}, 101 ccv3.Warnings{"set-application-droplet-warning"}, 102 expectedErr, 103 ) 104 }) 105 106 It("returns the error", func() { 107 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 108 109 Expect(err).To(Equal(expectedErr)) 110 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 111 }) 112 113 When("the cc client response contains an UnprocessableEntityError", func() { 114 BeforeEach(func() { 115 fakeCloudControllerClient.SetApplicationDropletReturns( 116 resources.Relationship{}, 117 ccv3.Warnings{"set-application-droplet-warning"}, 118 ccerror.UnprocessableEntityError{Message: "some-message"}, 119 ) 120 }) 121 122 It("raises the error as AssignDropletError and returns warnings", func() { 123 warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid") 124 125 Expect(err).To(MatchError("some-message")) 126 Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning")) 127 }) 128 }) 129 130 }) 131 }) 132 133 Describe("SetApplicationDroplet", func() { 134 When("there are no client errors", func() { 135 BeforeEach(func() { 136 fakeCloudControllerClient.SetApplicationDropletReturns( 137 resources.Relationship{GUID: "some-droplet-guid"}, 138 ccv3.Warnings{"set-application-droplet-warning"}, 139 nil, 140 ) 141 }) 142 143 It("sets the app's droplet", func() { 144 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 145 146 Expect(err).ToNot(HaveOccurred()) 147 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 148 149 Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1)) 150 appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0) 151 Expect(appGUID).To(Equal("some-app-guid")) 152 Expect(dropletGUID).To(Equal("some-droplet-guid")) 153 }) 154 }) 155 156 When("setting the droplet fails", func() { 157 var expectedErr error 158 159 BeforeEach(func() { 160 expectedErr = errors.New("some set application-droplet error") 161 162 fakeCloudControllerClient.SetApplicationDropletReturns( 163 resources.Relationship{}, 164 ccv3.Warnings{"set-application-droplet-warning"}, 165 expectedErr, 166 ) 167 }) 168 169 It("returns the error", func() { 170 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 171 172 Expect(err).To(Equal(expectedErr)) 173 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 174 }) 175 176 When("the cc client response contains an UnprocessableEntityError", func() { 177 BeforeEach(func() { 178 fakeCloudControllerClient.SetApplicationDropletReturns( 179 resources.Relationship{}, 180 ccv3.Warnings{"set-application-droplet-warning"}, 181 ccerror.UnprocessableEntityError{Message: "some-message"}, 182 ) 183 }) 184 185 It("raises the error as AssignDropletError and returns warnings", func() { 186 warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid") 187 188 Expect(err).To(MatchError("some-message")) 189 Expect(warnings).To(ConsistOf("set-application-droplet-warning")) 190 }) 191 }) 192 }) 193 }) 194 195 Describe("GetApplicationDroplets", func() { 196 When("there are no client errors", func() { 197 BeforeEach(func() { 198 fakeCloudControllerClient.GetApplicationsReturns( 199 []resources.Application{ 200 {GUID: "some-app-guid"}, 201 }, 202 ccv3.Warnings{"get-applications-warning"}, 203 nil, 204 ) 205 206 fakeCloudControllerClient.GetDropletsReturns( 207 []resources.Droplet{ 208 { 209 GUID: "some-droplet-guid-1", 210 State: constant.DropletStaged, 211 CreatedAt: "2017-08-14T21:16:42Z", 212 Buildpacks: []resources.DropletBuildpack{ 213 {Name: "ruby"}, 214 {Name: "nodejs"}, 215 }, 216 Image: "docker/some-image", 217 Stack: "penguin", 218 }, 219 { 220 GUID: "some-droplet-guid-2", 221 State: constant.DropletFailed, 222 CreatedAt: "2017-08-16T00:18:24Z", 223 Buildpacks: []resources.DropletBuildpack{ 224 {Name: "java"}, 225 }, 226 Stack: "windows", 227 }, 228 }, 229 ccv3.Warnings{"get-application-droplets-warning"}, 230 nil, 231 ) 232 }) 233 234 It("gets the app's droplets", func() { 235 droplets, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 236 237 Expect(err).ToNot(HaveOccurred()) 238 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning")) 239 Expect(droplets).To(Equal([]Droplet{ 240 { 241 GUID: "some-droplet-guid-1", 242 State: constant.DropletStaged, 243 CreatedAt: "2017-08-14T21:16:42Z", 244 Buildpacks: []Buildpack{ 245 {Name: "ruby"}, 246 {Name: "nodejs"}, 247 }, 248 Image: "docker/some-image", 249 Stack: "penguin", 250 }, 251 { 252 GUID: "some-droplet-guid-2", 253 State: constant.DropletFailed, 254 CreatedAt: "2017-08-16T00:18:24Z", 255 Buildpacks: []Buildpack{ 256 {Name: "java"}, 257 }, 258 Stack: "windows", 259 }, 260 })) 261 262 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 263 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf( 264 ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}}, 265 ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}}, 266 )) 267 268 Expect(fakeCloudControllerClient.GetDropletsCallCount()).To(Equal(1)) 269 Expect(fakeCloudControllerClient.GetDropletsArgsForCall(0)).To(ConsistOf( 270 ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}}, 271 )) 272 }) 273 }) 274 275 When("getting the application fails", func() { 276 var expectedErr error 277 278 BeforeEach(func() { 279 expectedErr = errors.New("some get application error") 280 281 fakeCloudControllerClient.GetApplicationsReturns( 282 []resources.Application{}, 283 ccv3.Warnings{"get-applications-warning"}, 284 expectedErr, 285 ) 286 }) 287 288 It("returns the error", func() { 289 _, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 290 291 Expect(err).To(Equal(expectedErr)) 292 Expect(warnings).To(ConsistOf("get-applications-warning")) 293 }) 294 }) 295 296 When("getting the application droplets fails", func() { 297 var expectedErr error 298 299 BeforeEach(func() { 300 expectedErr = errors.New("some get application error") 301 302 fakeCloudControllerClient.GetApplicationsReturns( 303 []resources.Application{ 304 {GUID: "some-app-guid"}, 305 }, 306 ccv3.Warnings{"get-applications-warning"}, 307 nil, 308 ) 309 310 fakeCloudControllerClient.GetDropletsReturns( 311 []resources.Droplet{}, 312 ccv3.Warnings{"get-application-droplets-warning"}, 313 expectedErr, 314 ) 315 }) 316 317 It("returns the error", func() { 318 _, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid") 319 320 Expect(err).To(Equal(expectedErr)) 321 Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning")) 322 }) 323 }) 324 }) 325 326 Describe("GetCurrentDropletByApplication", func() { 327 var ( 328 appGUID string 329 330 currentDroplet Droplet 331 warnings Warnings 332 executionErr error 333 ) 334 335 BeforeEach(func() { 336 appGUID = "some-app-guid" 337 }) 338 339 JustBeforeEach(func() { 340 currentDroplet, warnings, executionErr = actor.GetCurrentDropletByApplication(appGUID) 341 }) 342 343 When("the current droplet exists", func() { 344 BeforeEach(func() { 345 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, nil) 346 }) 347 348 It("returns the current droplet", func() { 349 Expect(executionErr).ToNot(HaveOccurred()) 350 Expect(warnings).To(ConsistOf("some-warning")) 351 Expect(currentDroplet).To(Equal(Droplet{GUID: "some-droplet-guid"})) 352 353 Expect(fakeCloudControllerClient.GetApplicationDropletCurrentCallCount()).To(Equal(1)) 354 Expect(fakeCloudControllerClient.GetApplicationDropletCurrentArgsForCall(0)).To(Equal("some-app-guid")) 355 }) 356 }) 357 358 When("an error occurs", func() { 359 When("the app does not exist", func() { 360 BeforeEach(func() { 361 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, ccerror.ApplicationNotFoundError{}) 362 }) 363 364 It("returns an ApplicationNotFoundError and warnings", func() { 365 Expect(executionErr).To(MatchError(actionerror.ApplicationNotFoundError{GUID: appGUID})) 366 Expect(warnings).To(ConsistOf("some-warning")) 367 }) 368 }) 369 370 When("the current droplet does not exist", func() { 371 BeforeEach(func() { 372 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{}, ccv3.Warnings{"some-warning"}, ccerror.DropletNotFoundError{}) 373 }) 374 375 It("returns an DropletNotFoundError and warnings", func() { 376 Expect(executionErr).To(MatchError(actionerror.DropletNotFoundError{AppGUID: appGUID})) 377 Expect(warnings).To(ConsistOf("some-warning")) 378 }) 379 }) 380 381 When("a generic error occurs", func() { 382 var expectedErr error 383 384 BeforeEach(func() { 385 expectedErr = errors.New("some error") 386 fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{}, ccv3.Warnings{"some-warning"}, expectedErr) 387 }) 388 389 It("returns the error and warnings", func() { 390 Expect(executionErr).To(MatchError(expectedErr)) 391 Expect(warnings).To(ConsistOf("some-warning")) 392 }) 393 }) 394 }) 395 }) 396 })