github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/actor/v7action/service_broker_test.go (about) 1 package v7action_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 . "code.cloudfoundry.org/cli/actor/v7action" 8 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 10 "code.cloudfoundry.org/cli/resources" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 ) 14 15 var _ = Describe("Service Broker Actions", func() { 16 var ( 17 actor *Actor 18 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 19 ) 20 21 BeforeEach(func() { 22 fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) 23 actor = NewActor(fakeCloudControllerClient, nil, nil, nil, nil, nil) 24 }) 25 26 Describe("GetServiceBrokers", func() { 27 var ( 28 serviceBrokers []resources.ServiceBroker 29 warnings Warnings 30 executionError error 31 ) 32 33 JustBeforeEach(func() { 34 serviceBrokers, warnings, executionError = actor.GetServiceBrokers() 35 }) 36 37 When("the cloud controller request is successful", func() { 38 When("the cloud controller returns service brokers", func() { 39 BeforeEach(func() { 40 fakeCloudControllerClient.GetServiceBrokersReturns([]resources.ServiceBroker{ 41 { 42 GUID: "service-broker-guid-1", 43 Name: "service-broker-1", 44 URL: "service-broker-url-1", 45 }, 46 { 47 GUID: "service-broker-guid-2", 48 Name: "service-broker-2", 49 URL: "service-broker-url-2", 50 }, 51 }, ccv3.Warnings{"some-service-broker-warning"}, nil) 52 }) 53 54 It("returns the service brokers and warnings", func() { 55 Expect(executionError).NotTo(HaveOccurred()) 56 57 Expect(serviceBrokers).To(ConsistOf( 58 resources.ServiceBroker{Name: "service-broker-1", GUID: "service-broker-guid-1", URL: "service-broker-url-1"}, 59 resources.ServiceBroker{Name: "service-broker-2", GUID: "service-broker-guid-2", URL: "service-broker-url-2"}, 60 )) 61 Expect(warnings).To(ConsistOf("some-service-broker-warning")) 62 Expect(fakeCloudControllerClient.GetServiceBrokersCallCount()).To(Equal(1)) 63 }) 64 }) 65 }) 66 67 When("the cloud controller returns an error", func() { 68 BeforeEach(func() { 69 fakeCloudControllerClient.GetServiceBrokersReturns( 70 nil, 71 ccv3.Warnings{"some-service-broker-warning"}, 72 errors.New("no service broker")) 73 }) 74 75 It("returns an error and warnings", func() { 76 Expect(executionError).To(MatchError("no service broker")) 77 Expect(warnings).To(ConsistOf("some-service-broker-warning")) 78 }) 79 }) 80 }) 81 82 Describe("GetServiceBrokerByName", func() { 83 const ( 84 serviceBroker1Name = "broker-name" 85 serviceBroker1Guid = "broker-guid" 86 ) 87 88 var ( 89 ccv3ServiceBrokers []resources.ServiceBroker 90 serviceBroker resources.ServiceBroker 91 warnings Warnings 92 executeErr error 93 ) 94 95 BeforeEach(func() { 96 ccv3ServiceBrokers = []resources.ServiceBroker{ 97 {Name: serviceBroker1Name, GUID: serviceBroker1Guid}, 98 } 99 }) 100 101 JustBeforeEach(func() { 102 serviceBroker, warnings, executeErr = actor.GetServiceBrokerByName(serviceBroker1Name) 103 }) 104 105 When("the service broker is found", func() { 106 BeforeEach(func() { 107 fakeCloudControllerClient.GetServiceBrokersReturns( 108 ccv3ServiceBrokers, 109 ccv3.Warnings{"some-service-broker-warning"}, 110 nil, 111 ) 112 }) 113 114 It("returns the service broker and warnings", func() { 115 Expect(fakeCloudControllerClient.GetServiceBrokersCallCount()).To(Equal(1)) 116 Expect(fakeCloudControllerClient.GetServiceBrokersArgsForCall(0)).To(ConsistOf(ccv3.Query{ 117 Key: ccv3.NameFilter, 118 Values: []string{serviceBroker1Name}, 119 })) 120 121 Expect(executeErr).ToNot(HaveOccurred()) 122 Expect(warnings).To(ConsistOf("some-service-broker-warning")) 123 Expect(serviceBroker).To(Equal( 124 resources.ServiceBroker{Name: serviceBroker1Name, GUID: serviceBroker1Guid}, 125 )) 126 }) 127 }) 128 129 When("the service broker is not found", func() { 130 BeforeEach(func() { 131 fakeCloudControllerClient.GetServiceBrokersReturns( 132 []resources.ServiceBroker{}, 133 ccv3.Warnings{"some-other-service-broker-warning"}, 134 nil, 135 ) 136 }) 137 138 It("returns an error and warnings", func() { 139 Expect(executeErr).To(MatchError(actionerror.ServiceBrokerNotFoundError{Name: serviceBroker1Name})) 140 Expect(warnings).To(ConsistOf("some-other-service-broker-warning")) 141 Expect(serviceBroker).To(Equal(resources.ServiceBroker{})) 142 }) 143 }) 144 145 When("when the API layer call returns an error", func() { 146 BeforeEach(func() { 147 fakeCloudControllerClient.GetServiceBrokersReturns( 148 []resources.ServiceBroker{}, 149 ccv3.Warnings{"some-service-broker-warning"}, 150 errors.New("list-error"), 151 ) 152 }) 153 154 It("returns the error and prints warnings", func() { 155 Expect(executeErr).To(MatchError("list-error")) 156 Expect(warnings).To(ConsistOf("some-service-broker-warning")) 157 Expect(serviceBroker).To(Equal(resources.ServiceBroker{})) 158 159 Expect(fakeCloudControllerClient.GetServiceBrokersCallCount()).To(Equal(1)) 160 }) 161 }) 162 }) 163 164 Describe("CreateServiceBroker", func() { 165 const ( 166 name = "name" 167 url = "url" 168 username = "username" 169 password = "password" 170 spaceGUID = "space-guid" 171 ) 172 173 var ( 174 warnings Warnings 175 executionError error 176 ) 177 178 JustBeforeEach(func() { 179 warnings, executionError = actor.CreateServiceBroker( 180 resources.ServiceBroker{ 181 Name: name, 182 URL: url, 183 Username: username, 184 Password: password, 185 SpaceGUID: spaceGUID, 186 }, 187 ) 188 }) 189 190 When("the client request is successful", func() { 191 var ( 192 expectedJobURL = ccv3.JobURL("some-job-url") 193 ) 194 195 BeforeEach(func() { 196 fakeCloudControllerClient.CreateServiceBrokerReturns( 197 expectedJobURL, ccv3.Warnings{"some-creation-warning"}, nil, 198 ) 199 }) 200 201 It("passes the service broker credentials to the client", func() { 202 Expect(fakeCloudControllerClient.CreateServiceBrokerCallCount()).To( 203 Equal(1), "Expected client.CreateServiceBroker to be called once", 204 ) 205 206 serviceBroker := fakeCloudControllerClient.CreateServiceBrokerArgsForCall(0) 207 Expect(serviceBroker.Name).To(Equal(name)) 208 Expect(serviceBroker.Username).To(Equal(username)) 209 Expect(serviceBroker.Password).To(Equal(password)) 210 Expect(serviceBroker.URL).To(Equal(url)) 211 Expect(serviceBroker.SpaceGUID).To(Equal(spaceGUID)) 212 }) 213 214 It("passes the job url to the client for polling", func() { 215 Expect(fakeCloudControllerClient.PollJobCallCount()).To( 216 Equal(1), "Expected client.PollJob to be called once", 217 ) 218 219 jobURL := fakeCloudControllerClient.PollJobArgsForCall(0) 220 Expect(jobURL).To(Equal(expectedJobURL)) 221 }) 222 223 When("async job succeeds", func() { 224 BeforeEach(func() { 225 fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"some-poll-warning"}, nil) 226 }) 227 228 It("succeeds and returns warnings", func() { 229 Expect(executionError).NotTo(HaveOccurred()) 230 231 Expect(warnings).To(ConsistOf("some-creation-warning", "some-poll-warning")) 232 }) 233 }) 234 235 When("async job fails", func() { 236 BeforeEach(func() { 237 fakeCloudControllerClient.PollJobReturns(nil, errors.New("oopsie")) 238 }) 239 240 It("succeeds and returns warnings", func() { 241 Expect(executionError).To(MatchError("oopsie")) 242 }) 243 }) 244 }) 245 246 When("the client returns an error", func() { 247 BeforeEach(func() { 248 fakeCloudControllerClient.CreateServiceBrokerReturns( 249 "", ccv3.Warnings{"some-other-warning"}, errors.New("invalid broker"), 250 ) 251 }) 252 253 It("fails and returns warnings", func() { 254 Expect(executionError).To(MatchError("invalid broker")) 255 256 Expect(warnings).To(ConsistOf("some-other-warning")) 257 }) 258 }) 259 }) 260 261 Describe("UpdateServiceBroker", func() { 262 const ( 263 guid = "broker-guid" 264 url = "url" 265 username = "username" 266 password = "password" 267 ) 268 269 var ( 270 expectedJobURL = ccv3.JobURL("some-job-url") 271 ) 272 273 It("passes the service broker creds and url to the client", func() { 274 _, executionError := actor.UpdateServiceBroker( 275 guid, 276 resources.ServiceBroker{ 277 Username: username, 278 Password: password, 279 URL: url, 280 }, 281 ) 282 Expect(executionError).ToNot(HaveOccurred()) 283 284 Expect(fakeCloudControllerClient.UpdateServiceBrokerCallCount()).To(Equal(1)) 285 guid, serviceBroker := fakeCloudControllerClient.UpdateServiceBrokerArgsForCall(0) 286 Expect(guid).To(Equal(guid)) 287 Expect(serviceBroker.Name).To(BeEmpty()) 288 Expect(serviceBroker.Username).To(Equal(username)) 289 Expect(serviceBroker.Password).To(Equal(password)) 290 Expect(serviceBroker.URL).To(Equal(url)) 291 }) 292 293 It("passes the job url to the client for polling", func() { 294 fakeCloudControllerClient.UpdateServiceBrokerReturns( 295 expectedJobURL, ccv3.Warnings{"some-update-warning"}, nil, 296 ) 297 298 _, executionError := actor.UpdateServiceBroker( 299 guid, 300 resources.ServiceBroker{ 301 Username: username, 302 Password: password, 303 URL: url, 304 }, 305 ) 306 Expect(executionError).ToNot(HaveOccurred()) 307 308 Expect(fakeCloudControllerClient.PollJobCallCount()).To( 309 Equal(1), "Expected client.PollJob to be called once", 310 ) 311 312 jobURL := fakeCloudControllerClient.PollJobArgsForCall(0) 313 Expect(jobURL).To(Equal(expectedJobURL)) 314 }) 315 316 When("async job succeeds", func() { 317 BeforeEach(func() { 318 fakeCloudControllerClient.UpdateServiceBrokerReturns( 319 expectedJobURL, ccv3.Warnings{"some-update-warning"}, nil, 320 ) 321 fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"some-poll-warning"}, nil) 322 }) 323 324 It("succeeds and returns warnings", func() { 325 warnings, executionError := actor.UpdateServiceBroker( 326 guid, 327 resources.ServiceBroker{ 328 Username: username, 329 Password: password, 330 URL: url, 331 }, 332 ) 333 334 Expect(executionError).NotTo(HaveOccurred()) 335 Expect(warnings).To(ConsistOf("some-update-warning", "some-poll-warning")) 336 }) 337 }) 338 339 When("async job fails", func() { 340 BeforeEach(func() { 341 fakeCloudControllerClient.UpdateServiceBrokerReturns( 342 expectedJobURL, ccv3.Warnings{"some-update-warning"}, nil, 343 ) 344 fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"some-poll-warning"}, errors.New("job-execution-failed")) 345 }) 346 347 It("succeeds and returns warnings", func() { 348 warnings, executionError := actor.UpdateServiceBroker( 349 guid, 350 resources.ServiceBroker{ 351 Username: username, 352 Password: password, 353 URL: url, 354 }, 355 ) 356 357 Expect(executionError).To(MatchError("job-execution-failed")) 358 Expect(warnings).To(ConsistOf("some-update-warning", "some-poll-warning")) 359 }) 360 }) 361 362 When("the client returns an error", func() { 363 BeforeEach(func() { 364 fakeCloudControllerClient.UpdateServiceBrokerReturns( 365 "", ccv3.Warnings{"some-other-warning"}, errors.New("invalid broker"), 366 ) 367 }) 368 369 It("fails and returns warnings", func() { 370 warnings, executionError := actor.UpdateServiceBroker( 371 guid, 372 resources.ServiceBroker{ 373 Username: username, 374 Password: password, 375 URL: url, 376 }, 377 ) 378 379 Expect(executionError).To(MatchError("invalid broker")) 380 Expect(warnings).To(ConsistOf("some-other-warning")) 381 Expect(fakeCloudControllerClient.PollJobCallCount()).To( 382 Equal(0), "Expected client.PollJob to not have been called", 383 ) 384 }) 385 }) 386 }) 387 388 Describe("DeleteServiceBroker", func() { 389 var ( 390 serviceBrokerGUID = "some-service-broker-guid" 391 warnings Warnings 392 executionError error 393 expectedJobURL = ccv3.JobURL("some-job-URL") 394 ) 395 396 JustBeforeEach(func() { 397 warnings, executionError = actor.DeleteServiceBroker(serviceBrokerGUID) 398 }) 399 400 When("the client request is successful", func() { 401 BeforeEach(func() { 402 fakeCloudControllerClient.DeleteServiceBrokerReturns(expectedJobURL, ccv3.Warnings{"some-deletion-warning"}, nil) 403 }) 404 405 It("passes the service broker credentials to the client", func() { 406 Expect(fakeCloudControllerClient.DeleteServiceBrokerCallCount()).To(Equal(1)) 407 actualServiceBrokerGUID := fakeCloudControllerClient.DeleteServiceBrokerArgsForCall(0) 408 Expect(actualServiceBrokerGUID).To(Equal(serviceBrokerGUID)) 409 }) 410 411 It("passes the job url to the client for polling", func() { 412 Expect(fakeCloudControllerClient.PollJobCallCount()).To( 413 Equal(1), "Expected client.PollJob to be called once", 414 ) 415 416 jobURL := fakeCloudControllerClient.PollJobArgsForCall(0) 417 Expect(jobURL).To(Equal(expectedJobURL)) 418 }) 419 420 When("the delete service broker job completes successfully", func() { 421 BeforeEach(func() { 422 fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"some-poll-warning"}, nil) 423 }) 424 425 It("succeeds and returns warnings", func() { 426 Expect(executionError).NotTo(HaveOccurred()) 427 428 Expect(warnings).To(ConsistOf("some-deletion-warning", "some-poll-warning")) 429 }) 430 }) 431 432 When("the delete service broker job fails", func() { 433 BeforeEach(func() { 434 fakeCloudControllerClient.PollJobReturns(nil, errors.New("oopsie")) 435 }) 436 437 It("succeeds and returns warnings", func() { 438 Expect(executionError).To(MatchError("oopsie")) 439 }) 440 }) 441 }) 442 443 When("the client returns an error", func() { 444 BeforeEach(func() { 445 fakeCloudControllerClient.DeleteServiceBrokerReturns("", ccv3.Warnings{"some-other-warning"}, errors.New("invalid broker")) 446 }) 447 448 It("fails and returns warnings", func() { 449 Expect(executionError).To(MatchError("invalid broker")) 450 451 Expect(warnings).To(ConsistOf("some-other-warning")) 452 }) 453 }) 454 }) 455 })