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