github.com/arunkumar7540/cli@v6.45.0+incompatible/actor/v7action/route_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/api/cloudcontroller/ccerror" 8 9 . "code.cloudfoundry.org/cli/actor/v7action" 10 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("Route Actions", func() { 17 var ( 18 actor *Actor 19 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 20 ) 21 22 BeforeEach(func() { 23 actor, fakeCloudControllerClient, _, _, _ = NewTestActor() 24 }) 25 26 Describe("CreateRoute", func() { 27 var ( 28 warnings Warnings 29 executeErr error 30 path string 31 ) 32 33 JustBeforeEach(func() { 34 warnings, executeErr = actor.CreateRoute("org-name", "space-name", "domain-name", "hostname", path) 35 }) 36 37 When("the API layer calls are successful", func() { 38 BeforeEach(func() { 39 fakeCloudControllerClient.GetDomainsReturns( 40 []ccv3.Domain{ 41 {Name: "domain-name", GUID: "domain-guid"}, 42 }, 43 ccv3.Warnings{"get-domains-warning"}, 44 nil, 45 ) 46 47 fakeCloudControllerClient.GetOrganizationsReturns( 48 []ccv3.Organization{ 49 {Name: "org-name", GUID: "org-guid"}, 50 }, 51 ccv3.Warnings{"get-orgs-warning"}, 52 nil, 53 ) 54 55 fakeCloudControllerClient.GetSpacesReturns( 56 []ccv3.Space{ 57 {Name: "space-name", GUID: "space-guid"}, 58 }, 59 ccv3.Warnings{"get-spaces-warning"}, 60 nil, 61 ) 62 63 fakeCloudControllerClient.CreateRouteReturns( 64 ccv3.Route{GUID: "route-guid", SpaceGUID: "space-guid", DomainGUID: "domain-guid", Host: "hostname", Path: "path-name"}, 65 ccv3.Warnings{"create-warning-1", "create-warning-2"}, 66 nil) 67 }) 68 69 When("the input path starts with '/'", func() { 70 BeforeEach(func() { 71 path = "/path-name" 72 }) 73 It("returns the route with '/<path>' and prints warnings", func() { 74 Expect(warnings).To(ConsistOf("create-warning-1", "create-warning-2", "get-orgs-warning", "get-domains-warning", "get-spaces-warning")) 75 Expect(executeErr).ToNot(HaveOccurred()) 76 77 Expect(fakeCloudControllerClient.CreateRouteCallCount()).To(Equal(1)) 78 passedRoute := fakeCloudControllerClient.CreateRouteArgsForCall(0) 79 80 Expect(passedRoute).To(Equal( 81 ccv3.Route{ 82 SpaceGUID: "space-guid", 83 DomainGUID: "domain-guid", 84 Host: "hostname", 85 Path: "/path-name", 86 }, 87 )) 88 }) 89 }) 90 91 When("the input path does not start with '/'", func() { 92 BeforeEach(func() { 93 path = "path-name" 94 }) 95 96 It("returns the route with '/<path>' and prints warnings", func() { 97 Expect(warnings).To(ConsistOf("create-warning-1", "create-warning-2", "get-orgs-warning", "get-domains-warning", "get-spaces-warning")) 98 Expect(executeErr).ToNot(HaveOccurred()) 99 100 Expect(fakeCloudControllerClient.CreateRouteCallCount()).To(Equal(1)) 101 passedRoute := fakeCloudControllerClient.CreateRouteArgsForCall(0) 102 103 Expect(passedRoute).To(Equal( 104 ccv3.Route{ 105 SpaceGUID: "space-guid", 106 DomainGUID: "domain-guid", 107 Host: "hostname", 108 Path: "/path-name", 109 }, 110 )) 111 }) 112 }) 113 114 }) 115 116 When("the API call to get the domain returns an error", func() { 117 When("the cc client returns an RouteNotUniqueError", func() { 118 BeforeEach(func() { 119 fakeCloudControllerClient.GetDomainsReturns( 120 []ccv3.Domain{ 121 {Name: "domain-name", GUID: "domain-guid"}, 122 }, 123 ccv3.Warnings{"get-domains-warning"}, 124 nil, 125 ) 126 127 fakeCloudControllerClient.GetOrganizationsReturns( 128 []ccv3.Organization{ 129 {Name: "org-name", GUID: "org-guid"}, 130 }, 131 ccv3.Warnings{"get-orgs-warning"}, 132 nil, 133 ) 134 135 fakeCloudControllerClient.GetSpacesReturns( 136 []ccv3.Space{ 137 {Name: "space-name", GUID: "space-guid"}, 138 }, 139 ccv3.Warnings{"get-spaces-warning"}, 140 nil, 141 ) 142 143 fakeCloudControllerClient.CreateRouteReturns( 144 ccv3.Route{}, 145 ccv3.Warnings{"create-route-warning"}, 146 ccerror.RouteNotUniqueError{ 147 UnprocessableEntityError: ccerror.UnprocessableEntityError{Message: "some cool error"}, 148 }, 149 ) 150 }) 151 152 It("returns the RouteAlreadyExistsError and warnings", func() { 153 Expect(executeErr).To(MatchError(actionerror.RouteAlreadyExistsError{ 154 Err: ccerror.RouteNotUniqueError{ 155 UnprocessableEntityError: ccerror.UnprocessableEntityError{Message: "some cool error"}, 156 }, 157 })) 158 Expect(warnings).To(ConsistOf("get-domains-warning", 159 "get-orgs-warning", 160 "get-spaces-warning", 161 "create-route-warning")) 162 }) 163 }) 164 165 When("the cc client returns a different error", func() { 166 BeforeEach(func() { 167 fakeCloudControllerClient.GetDomainsReturns( 168 []ccv3.Domain{}, 169 ccv3.Warnings{"domain-warning-1", "domain-warning-2"}, 170 errors.New("api-domains-error"), 171 ) 172 }) 173 174 It("it returns an error and prints warnings", func() { 175 Expect(warnings).To(ConsistOf("domain-warning-1", "domain-warning-2")) 176 Expect(executeErr).To(MatchError("api-domains-error")) 177 178 Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1)) 179 Expect(fakeCloudControllerClient.CreateRouteCallCount()).To(Equal(0)) 180 }) 181 }) 182 }) 183 }) 184 185 Describe("GetRoutesBySpace", func() { 186 var ( 187 routes []Route 188 warnings Warnings 189 executeErr error 190 ) 191 192 BeforeEach(func() { 193 fakeCloudControllerClient.GetDomainsReturns( 194 []ccv3.Domain{ 195 {Name: "domain1-name", GUID: "domain1-guid"}, 196 {Name: "domain2-name", GUID: "domain2-guid"}, 197 }, 198 ccv3.Warnings{"get-domains-warning"}, 199 nil, 200 ) 201 202 fakeCloudControllerClient.GetSpacesReturns( 203 []ccv3.Space{ 204 {Name: "space-name", GUID: "space-guid"}, 205 }, 206 ccv3.Warnings{"get-spaces-warning"}, 207 nil, 208 ) 209 210 fakeCloudControllerClient.GetRoutesReturns( 211 []ccv3.Route{ 212 {GUID: "route1-guid", SpaceGUID: "space-guid", DomainGUID: "domain1-guid", Host: "hostname"}, 213 {GUID: "route2-guid", SpaceGUID: "space-guid", DomainGUID: "domain2-guid", Path: "/my-path"}, 214 {GUID: "route3-guid", SpaceGUID: "space-guid", DomainGUID: "domain1-guid"}, 215 }, 216 ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"}, 217 nil, 218 ) 219 }) 220 221 JustBeforeEach(func() { 222 routes, warnings, executeErr = actor.GetRoutesBySpace("space-guid") 223 }) 224 225 When("the API layer calls are successful", func() { 226 It("returns the routes and warnings", func() { 227 Expect(routes).To(Equal([]Route{ 228 {GUID: "route1-guid", SpaceGUID: "space-guid", DomainGUID: "domain1-guid", Host: "hostname", DomainName: "domain1-name", SpaceName: "space-name"}, 229 {GUID: "route2-guid", SpaceGUID: "space-guid", DomainGUID: "domain2-guid", Path: "/my-path", DomainName: "domain2-name", SpaceName: "space-name"}, 230 {GUID: "route3-guid", SpaceGUID: "space-guid", DomainGUID: "domain1-guid", DomainName: "domain1-name", SpaceName: "space-name"}, 231 })) 232 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-domains-warning", "get-spaces-warning")) 233 Expect(executeErr).ToNot(HaveOccurred()) 234 235 Expect(fakeCloudControllerClient.GetSpacesCallCount()).To(Equal(1)) 236 query := fakeCloudControllerClient.GetSpacesArgsForCall(0) 237 Expect(query).To(HaveLen(1)) 238 Expect(query[0].Key).To(Equal(ccv3.GUIDFilter)) 239 Expect(query[0].Values).To(ConsistOf("space-guid")) 240 241 Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1)) 242 query = fakeCloudControllerClient.GetRoutesArgsForCall(0) 243 Expect(query).To(HaveLen(1)) 244 Expect(query[0].Key).To(Equal(ccv3.SpaceGUIDFilter)) 245 Expect(query[0].Values).To(ConsistOf("space-guid")) 246 247 Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1)) 248 query = fakeCloudControllerClient.GetDomainsArgsForCall(0) 249 Expect(query).To(HaveLen(1)) 250 Expect(query[0].Key).To(Equal(ccv3.GUIDFilter)) 251 Expect(query[0].Values).To(ConsistOf("domain1-guid", "domain2-guid")) 252 }) 253 }) 254 255 When("getting routes fails", func() { 256 var err = errors.New("failed to get route") 257 258 BeforeEach(func() { 259 fakeCloudControllerClient.GetRoutesReturns( 260 nil, 261 ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"}, 262 err) 263 }) 264 265 It("returns the error and any warnings", func() { 266 Expect(executeErr).To(Equal(err)) 267 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2")) 268 }) 269 }) 270 271 When("getting spaces fails", func() { 272 var err = errors.New("failed to get spaces") 273 274 BeforeEach(func() { 275 fakeCloudControllerClient.GetSpacesReturns( 276 nil, 277 ccv3.Warnings{"get-spaces-warning"}, 278 err, 279 ) 280 }) 281 282 It("returns the error and any warnings", func() { 283 Expect(executeErr).To(Equal(err)) 284 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-spaces-warning")) 285 }) 286 }) 287 288 When("getting domains fails", func() { 289 var err = errors.New("failed to get domains") 290 291 BeforeEach(func() { 292 fakeCloudControllerClient.GetDomainsReturns( 293 nil, 294 ccv3.Warnings{"get-domains-warning"}, 295 err, 296 ) 297 }) 298 299 It("returns the error and any warnings", func() { 300 Expect(executeErr).To(Equal(err)) 301 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-spaces-warning", "get-domains-warning")) 302 }) 303 }) 304 }) 305 306 Describe("GetRoutesByOrg", func() { 307 var ( 308 routes []Route 309 warnings Warnings 310 executeErr error 311 ) 312 313 BeforeEach(func() { 314 fakeCloudControllerClient.GetDomainsReturns( 315 []ccv3.Domain{ 316 {Name: "domain1-name", GUID: "domain1-guid"}, 317 {Name: "domain2-name", GUID: "domain2-guid"}, 318 }, 319 ccv3.Warnings{"get-domains-warning"}, 320 nil, 321 ) 322 323 fakeCloudControllerClient.GetSpacesReturns( 324 []ccv3.Space{ 325 {Name: "space1-name", GUID: "space1-guid"}, 326 {Name: "space2-name", GUID: "space2-guid"}, 327 }, 328 ccv3.Warnings{"get-spaces-warning"}, 329 nil, 330 ) 331 332 fakeCloudControllerClient.GetRoutesReturns( 333 []ccv3.Route{ 334 {GUID: "route1-guid", SpaceGUID: "space1-guid", DomainGUID: "domain1-guid", Host: "hostname"}, 335 {GUID: "route2-guid", SpaceGUID: "space2-guid", DomainGUID: "domain2-guid", Path: "/my-path"}, 336 {GUID: "route3-guid", SpaceGUID: "space1-guid", DomainGUID: "domain1-guid"}, 337 }, 338 ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"}, 339 nil, 340 ) 341 }) 342 343 JustBeforeEach(func() { 344 routes, warnings, executeErr = actor.GetRoutesByOrg("org-guid") 345 }) 346 347 When("the API layer calls are successful", func() { 348 It("returns the routes and warnings", func() { 349 Expect(routes).To(Equal([]Route{ 350 { 351 GUID: "route1-guid", 352 SpaceGUID: "space1-guid", 353 DomainGUID: "domain1-guid", 354 Host: "hostname", 355 DomainName: "domain1-name", 356 SpaceName: "space1-name", 357 }, 358 { 359 GUID: "route2-guid", 360 SpaceGUID: "space2-guid", 361 DomainGUID: "domain2-guid", 362 Path: "/my-path", 363 DomainName: "domain2-name", 364 SpaceName: "space2-name", 365 }, 366 { 367 GUID: "route3-guid", 368 SpaceGUID: "space1-guid", 369 DomainGUID: "domain1-guid", 370 DomainName: "domain1-name", 371 SpaceName: "space1-name", 372 }, 373 })) 374 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-domains-warning", "get-spaces-warning")) 375 Expect(executeErr).ToNot(HaveOccurred()) 376 377 Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1)) 378 query := fakeCloudControllerClient.GetRoutesArgsForCall(0) 379 Expect(query).To(HaveLen(1)) 380 Expect(query[0].Key).To(Equal(ccv3.OrganizationGUIDFilter)) 381 Expect(query[0].Values).To(ConsistOf("org-guid")) 382 383 Expect(fakeCloudControllerClient.GetSpacesCallCount()).To(Equal(1)) 384 query = fakeCloudControllerClient.GetSpacesArgsForCall(0) 385 Expect(query).To(HaveLen(1)) 386 Expect(query[0].Key).To(Equal(ccv3.GUIDFilter)) 387 Expect(query[0].Values).To(ConsistOf("space1-guid", "space2-guid")) 388 389 Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1)) 390 query = fakeCloudControllerClient.GetDomainsArgsForCall(0) 391 Expect(query).To(HaveLen(1)) 392 Expect(query[0].Key).To(Equal(ccv3.GUIDFilter)) 393 Expect(query[0].Values).To(ConsistOf("domain1-guid", "domain2-guid")) 394 }) 395 }) 396 397 When("getting routes fails", func() { 398 var err = errors.New("failed to get route") 399 400 BeforeEach(func() { 401 fakeCloudControllerClient.GetRoutesReturns( 402 nil, 403 ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"}, 404 err) 405 }) 406 407 It("returns the error and any warnings", func() { 408 Expect(executeErr).To(Equal(err)) 409 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2")) 410 }) 411 }) 412 413 When("getting spaces fails", func() { 414 var err = errors.New("failed to get spaces") 415 416 BeforeEach(func() { 417 fakeCloudControllerClient.GetSpacesReturns( 418 nil, 419 ccv3.Warnings{"get-spaces-warning"}, 420 err, 421 ) 422 }) 423 424 It("returns the error and any warnings", func() { 425 Expect(executeErr).To(Equal(err)) 426 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-spaces-warning")) 427 }) 428 }) 429 430 When("getting domains fails", func() { 431 var err = errors.New("failed to get domains") 432 433 BeforeEach(func() { 434 fakeCloudControllerClient.GetDomainsReturns( 435 nil, 436 ccv3.Warnings{"get-domains-warning"}, 437 err, 438 ) 439 }) 440 441 It("returns the error and any warnings", func() { 442 Expect(executeErr).To(Equal(err)) 443 Expect(warnings).To(ConsistOf("get-route-warning-1", "get-route-warning-2", "get-spaces-warning", "get-domains-warning")) 444 }) 445 }) 446 }) 447 448 Describe("DeleteRoute", func() { 449 When("deleting a route", func() { 450 BeforeEach(func() { 451 fakeCloudControllerClient.GetDomainsReturns( 452 []ccv3.Domain{ 453 {GUID: "domain-guid"}, 454 }, 455 ccv3.Warnings{"get-domains-warning"}, 456 nil, 457 ) 458 fakeCloudControllerClient.GetRoutesReturns( 459 []ccv3.Route{ 460 {GUID: "route-guid"}, 461 }, 462 ccv3.Warnings{"get-routes-warning"}, 463 nil, 464 ) 465 fakeCloudControllerClient.DeleteRouteReturns(ccv3.JobURL("https://job.com"), ccv3.Warnings{"delete-warning"}, nil) 466 467 }) 468 469 It("delegates to the cloud controller client", func() { 470 warnings, executeErr := actor.DeleteRoute("domain.com", "hostname", "path") 471 Expect(executeErr).NotTo(HaveOccurred()) 472 Expect(warnings).To(ConsistOf("get-domains-warning", "get-routes-warning", "delete-warning")) 473 474 Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1)) 475 query := fakeCloudControllerClient.GetDomainsArgsForCall(0) 476 Expect(query).To(ConsistOf([]ccv3.Query{ 477 {Key: ccv3.NameFilter, Values: []string{"domain.com"}}, 478 })) 479 480 Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1)) 481 query = fakeCloudControllerClient.GetRoutesArgsForCall(0) 482 Expect(query).To(ConsistOf([]ccv3.Query{ 483 {Key: "domain_guids", Values: []string{"domain-guid"}}, 484 {Key: "hosts", Values: []string{"hostname"}}, 485 {Key: "paths", Values: []string{"/path"}}, 486 })) 487 488 Expect(fakeCloudControllerClient.DeleteRouteCallCount()).To(Equal(1)) 489 passedRouteGuid := fakeCloudControllerClient.DeleteRouteArgsForCall(0) 490 491 Expect(passedRouteGuid).To(Equal("route-guid")) 492 }) 493 494 When("getting domains fails", func() { 495 BeforeEach(func() { 496 fakeCloudControllerClient.GetDomainsReturns( 497 nil, 498 ccv3.Warnings{"get-domains-warning"}, 499 errors.New("get-domains-error"), 500 ) 501 }) 502 503 It("returns the error", func() { 504 warnings, err := actor.DeleteRoute("domain.com", "hostname", "path") 505 Expect(err).To(MatchError("get-domains-error")) 506 Expect(warnings).To(ConsistOf("get-domains-warning")) 507 }) 508 }) 509 510 When("getting routes fails", func() { 511 BeforeEach(func() { 512 fakeCloudControllerClient.GetRoutesReturns( 513 nil, 514 ccv3.Warnings{"get-routes-warning"}, 515 errors.New("get-routes-error"), 516 ) 517 }) 518 519 It("returns the error", func() { 520 warnings, err := actor.DeleteRoute("domain.com", "hostname", "path") 521 Expect(err).To(MatchError("get-routes-error")) 522 Expect(warnings).To(ConsistOf("get-domains-warning", "get-routes-warning")) 523 }) 524 }) 525 526 When("deleting route fails", func() { 527 BeforeEach(func() { 528 fakeCloudControllerClient.DeleteRouteReturns( 529 "", 530 ccv3.Warnings{"delete-route-warning"}, 531 errors.New("delete-route-error"), 532 ) 533 }) 534 535 It("returns the error", func() { 536 warnings, err := actor.DeleteRoute("domain.com", "hostname", "path") 537 Expect(err).To(MatchError("delete-route-error")) 538 Expect(warnings).To(ConsistOf("get-domains-warning", "get-routes-warning", "delete-route-warning")) 539 }) 540 }) 541 542 When("no routes are returned", func() { 543 BeforeEach(func() { 544 fakeCloudControllerClient.GetRoutesReturns( 545 []ccv3.Route{}, 546 ccv3.Warnings{"get-routes-warning"}, 547 nil, 548 ) 549 }) 550 551 It("returns the error", func() { 552 warnings, err := actor.DeleteRoute("domain.com", "hostname", "path") 553 Expect(err).To(Equal(actionerror.RouteNotFoundError{ 554 DomainName: "domain.com", 555 Host: "hostname", 556 Path: "/path", 557 })) 558 Expect(warnings).To(ConsistOf("get-domains-warning", "get-routes-warning")) 559 }) 560 }) 561 }) 562 }) 563 })