github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/actor/v2action/route_test.go (about) 1 package v2action_test 2 3 import ( 4 "errors" 5 6 . "code.cloudfoundry.org/cli/actor/v2action" 7 "code.cloudfoundry.org/cli/actor/v2action/v2actionfakes" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 10 . "github.com/onsi/ginkgo" 11 . "github.com/onsi/ginkgo/extensions/table" 12 . "github.com/onsi/gomega" 13 ) 14 15 var _ = Describe("Route Actions", func() { 16 var ( 17 actor *Actor 18 fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient 19 ) 20 21 BeforeEach(func() { 22 fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient) 23 actor = NewActor(fakeCloudControllerClient, nil) 24 }) 25 26 Describe("Route", func() { 27 DescribeTable("String", func(host string, domain string, path string, port int, expectedValue string) { 28 route := Route{ 29 Host: host, 30 Domain: Domain{ 31 Name: domain, 32 }, 33 Path: path, 34 Port: port, 35 } 36 Expect(route.String()).To(Equal(expectedValue)) 37 }, 38 39 Entry("has domain", "", "domain.com", "", 0, "domain.com"), 40 Entry("has host, domain", "host", "domain.com", "", 0, "host.domain.com"), 41 Entry("has domain, path", "", "domain.com", "/path", 0, "domain.com/path"), 42 Entry("has host, domain, path", "host", "domain.com", "/path", 0, "host.domain.com/path"), 43 Entry("has domain, port", "", "domain.com", "", 3333, "domain.com:3333"), 44 Entry("has host, domain, path, port", "host", "domain.com", "/path", 3333, "domain.com:3333"), 45 ) 46 }) 47 48 Describe("BindRouteToApplication", func() { 49 Context("when no errors are encountered", func() { 50 BeforeEach(func() { 51 fakeCloudControllerClient.BindRouteToApplicationReturns( 52 ccv2.Route{}, 53 ccv2.Warnings{"bind warning"}, 54 nil) 55 }) 56 57 It("binds the route to the application and returns all warnings", func() { 58 warnings, err := actor.BindRouteToApplication("some-route-guid", "some-app-guid") 59 Expect(err).ToNot(HaveOccurred()) 60 Expect(warnings).To(ConsistOf("bind warning")) 61 62 Expect(fakeCloudControllerClient.BindRouteToApplicationCallCount()).To(Equal(1)) 63 routeGUID, appGUID := fakeCloudControllerClient.BindRouteToApplicationArgsForCall(0) 64 Expect(routeGUID).To(Equal("some-route-guid")) 65 Expect(appGUID).To(Equal("some-app-guid")) 66 }) 67 }) 68 69 Context("when an error is encountered", func() { 70 Context("InvalidRelationError", func() { 71 BeforeEach(func() { 72 fakeCloudControllerClient.BindRouteToApplicationReturns( 73 ccv2.Route{}, 74 ccv2.Warnings{"bind warning"}, 75 ccerror.InvalidRelationError{}) 76 }) 77 78 It("returns the error", func() { 79 warnings, err := actor.BindRouteToApplication("some-route-guid", "some-app-guid") 80 Expect(err).To(MatchError(RouteInDifferentSpaceError{})) 81 Expect(warnings).To(ConsistOf("bind warning")) 82 }) 83 }) 84 85 Context("generic error", func() { 86 var expectedErr error 87 88 BeforeEach(func() { 89 expectedErr = errors.New("bind route failed") 90 fakeCloudControllerClient.BindRouteToApplicationReturns( 91 ccv2.Route{}, 92 ccv2.Warnings{"bind warning"}, 93 expectedErr) 94 }) 95 96 It("returns the error", func() { 97 warnings, err := actor.BindRouteToApplication("some-route-guid", "some-app-guid") 98 Expect(err).To(MatchError(expectedErr)) 99 Expect(warnings).To(ConsistOf("bind warning")) 100 }) 101 }) 102 }) 103 }) 104 105 Describe("CreateRoute", func() { 106 Context("when no errors are encountered", func() { 107 BeforeEach(func() { 108 fakeCloudControllerClient.CreateRouteReturns( 109 ccv2.Route{ 110 GUID: "some-route-guid", 111 Host: "some-host", 112 Path: "some-path", 113 Port: 3333, 114 DomainGUID: "some-domain-guid", 115 SpaceGUID: "some-space-guid", 116 }, 117 ccv2.Warnings{"create route warning"}, 118 nil) 119 }) 120 121 It("creates the route and returns all warnings", func() { 122 route, warnings, err := actor.CreateRoute( 123 Route{ 124 Domain: Domain{ 125 Name: "some-domain", 126 GUID: "some-domain-guid", 127 }, 128 Host: "some-host", 129 Path: "some-path", 130 Port: 3333, 131 SpaceGUID: "some-space-guid", 132 }, 133 true) 134 Expect(err).ToNot(HaveOccurred()) 135 Expect(warnings).To(ConsistOf("create route warning")) 136 Expect(route).To(Equal(Route{ 137 Domain: Domain{ 138 Name: "some-domain", 139 GUID: "some-domain-guid", 140 }, 141 GUID: "some-route-guid", 142 Host: "some-host", 143 Path: "some-path", 144 Port: 3333, 145 SpaceGUID: "some-space-guid", 146 })) 147 148 Expect(fakeCloudControllerClient.CreateRouteCallCount()).To(Equal(1)) 149 passedRoute, generatePort := fakeCloudControllerClient.CreateRouteArgsForCall(0) 150 Expect(passedRoute).To(Equal(ccv2.Route{ 151 DomainGUID: "some-domain-guid", 152 Host: "some-host", 153 Path: "some-path", 154 Port: 3333, 155 SpaceGUID: "some-space-guid", 156 })) 157 Expect(generatePort).To(BeTrue()) 158 }) 159 }) 160 161 Context("when an error is encountered", func() { 162 var expectedErr error 163 164 BeforeEach(func() { 165 expectedErr = errors.New("bind route failed") 166 fakeCloudControllerClient.CreateRouteReturns( 167 ccv2.Route{}, 168 ccv2.Warnings{"create route warning"}, 169 expectedErr) 170 }) 171 172 It("returns the error", func() { 173 _, warnings, err := actor.CreateRoute(Route{}, true) 174 Expect(err).To(MatchError(expectedErr)) 175 Expect(warnings).To(ConsistOf("create route warning")) 176 }) 177 }) 178 }) 179 180 Describe("GetOrphanedRoutesBySpace", func() { 181 BeforeEach(func() { 182 fakeCloudControllerClient.GetRouteApplicationsStub = func(routeGUID string, queries []ccv2.Query) ([]ccv2.Application, ccv2.Warnings, error) { 183 switch routeGUID { 184 case "orphaned-route-guid-1": 185 return []ccv2.Application{}, nil, nil 186 case "orphaned-route-guid-2": 187 return []ccv2.Application{}, nil, nil 188 case "not-orphaned-route-guid-3": 189 return []ccv2.Application{ 190 {GUID: "app-guid"}, 191 }, nil, nil 192 } 193 Fail("Unexpected route-guid") 194 return []ccv2.Application{}, nil, nil 195 } 196 }) 197 198 Context("when there are orphaned routes", func() { 199 BeforeEach(func() { 200 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 201 { 202 GUID: "orphaned-route-guid-1", 203 DomainGUID: "some-domain-guid", 204 }, 205 { 206 GUID: "orphaned-route-guid-2", 207 DomainGUID: "some-other-domain-guid", 208 }, 209 { 210 GUID: "not-orphaned-route-guid-3", 211 DomainGUID: "not-orphaned-route-domain-guid", 212 }, 213 }, nil, nil) 214 fakeCloudControllerClient.GetSharedDomainStub = func(domainGUID string) (ccv2.Domain, ccv2.Warnings, error) { 215 switch domainGUID { 216 case "some-domain-guid": 217 return ccv2.Domain{ 218 GUID: "some-domain-guid", 219 Name: "some-domain.com", 220 }, nil, nil 221 case "some-other-domain-guid": 222 return ccv2.Domain{ 223 GUID: "some-other-domain-guid", 224 Name: "some-other-domain.com", 225 }, nil, nil 226 case "not-orphaned-route-domain-guid": 227 return ccv2.Domain{ 228 GUID: "not-orphaned-route-domain-guid", 229 Name: "not-orphaned-route-domain.com", 230 }, nil, nil 231 } 232 return ccv2.Domain{}, nil, errors.New("Unexpected domain GUID") 233 } 234 }) 235 236 It("returns the orphaned routes with the domain names", func() { 237 orphanedRoutes, _, err := actor.GetOrphanedRoutesBySpace("space-guid") 238 Expect(err).NotTo(HaveOccurred()) 239 Expect(orphanedRoutes).To(ConsistOf([]Route{ 240 { 241 GUID: "orphaned-route-guid-1", 242 Domain: Domain{ 243 Name: "some-domain.com", 244 GUID: "some-domain-guid", 245 }, 246 }, 247 { 248 GUID: "orphaned-route-guid-2", 249 Domain: Domain{ 250 Name: "some-other-domain.com", 251 GUID: "some-other-domain-guid", 252 }, 253 }, 254 })) 255 256 Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1)) 257 258 spaceGUID, queries := fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0) 259 Expect(spaceGUID).To(Equal("space-guid")) 260 Expect(queries).To(BeNil()) 261 262 Expect(fakeCloudControllerClient.GetRouteApplicationsCallCount()).To(Equal(3)) 263 264 routeGUID, queries := fakeCloudControllerClient.GetRouteApplicationsArgsForCall(0) 265 Expect(routeGUID).To(Equal("orphaned-route-guid-1")) 266 Expect(queries).To(BeNil()) 267 268 routeGUID, queries = fakeCloudControllerClient.GetRouteApplicationsArgsForCall(1) 269 Expect(routeGUID).To(Equal("orphaned-route-guid-2")) 270 Expect(queries).To(BeNil()) 271 272 routeGUID, queries = fakeCloudControllerClient.GetRouteApplicationsArgsForCall(2) 273 Expect(routeGUID).To(Equal("not-orphaned-route-guid-3")) 274 Expect(queries).To(BeNil()) 275 }) 276 }) 277 278 Context("when there are no orphaned routes", func() { 279 var expectedErr OrphanedRoutesNotFoundError 280 281 BeforeEach(func() { 282 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 283 ccv2.Route{GUID: "not-orphaned-route-guid-3"}, 284 }, nil, nil) 285 }) 286 287 It("returns an OrphanedRoutesNotFoundError", func() { 288 orphanedRoutes, _, err := actor.GetOrphanedRoutesBySpace("space-guid") 289 Expect(err).To(MatchError(expectedErr)) 290 Expect(orphanedRoutes).To(BeNil()) 291 292 Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1)) 293 294 spaceGUID, queries := fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0) 295 Expect(spaceGUID).To(Equal("space-guid")) 296 Expect(queries).To(BeNil()) 297 298 Expect(fakeCloudControllerClient.GetRouteApplicationsCallCount()).To(Equal(1)) 299 300 routeGUID, queries := fakeCloudControllerClient.GetRouteApplicationsArgsForCall(0) 301 Expect(routeGUID).To(Equal("not-orphaned-route-guid-3")) 302 Expect(queries).To(BeNil()) 303 }) 304 }) 305 306 Context("when there are warnings", func() { 307 BeforeEach(func() { 308 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 309 ccv2.Route{GUID: "route-guid-1"}, 310 ccv2.Route{GUID: "route-guid-2"}, 311 }, ccv2.Warnings{"get-routes-warning"}, nil) 312 fakeCloudControllerClient.GetRouteApplicationsReturns(nil, ccv2.Warnings{"get-applications-warning"}, nil) 313 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{GUID: "some-guid"}, ccv2.Warnings{"get-shared-domain-warning"}, nil) 314 }) 315 316 It("returns all the warnings", func() { 317 _, warnings, err := actor.GetOrphanedRoutesBySpace("space-guid") 318 Expect(err).NotTo(HaveOccurred()) 319 Expect(warnings).To(ConsistOf("get-routes-warning", "get-applications-warning", "get-shared-domain-warning", "get-applications-warning", "get-shared-domain-warning")) 320 }) 321 }) 322 323 Context("when the spaces routes API request returns an error", func() { 324 var expectedErr error 325 326 BeforeEach(func() { 327 expectedErr = errors.New("spaces routes error") 328 fakeCloudControllerClient.GetSpaceRoutesReturns(nil, nil, expectedErr) 329 }) 330 331 It("returns the error", func() { 332 routes, _, err := actor.GetOrphanedRoutesBySpace("space-guid") 333 Expect(err).To(Equal(expectedErr)) 334 Expect(routes).To(BeNil()) 335 }) 336 }) 337 338 Context("when a route's applications API request returns an error", func() { 339 var expectedErr error 340 341 BeforeEach(func() { 342 expectedErr = errors.New("application error") 343 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 344 ccv2.Route{GUID: "route-guid"}, 345 }, nil, nil) 346 fakeCloudControllerClient.GetRouteApplicationsReturns(nil, nil, expectedErr) 347 }) 348 349 It("returns the error", func() { 350 routes, _, err := actor.GetOrphanedRoutesBySpace("space-guid") 351 Expect(err).To(Equal(expectedErr)) 352 Expect(routes).To(BeNil()) 353 }) 354 }) 355 }) 356 357 Describe("DeleteRoute", func() { 358 Context("when the route exists", func() { 359 BeforeEach(func() { 360 fakeCloudControllerClient.DeleteRouteReturns(nil, nil) 361 }) 362 363 It("deletes the route", func() { 364 _, err := actor.DeleteRoute("some-route-guid") 365 Expect(err).NotTo(HaveOccurred()) 366 367 Expect(fakeCloudControllerClient.DeleteRouteCallCount()).To(Equal(1)) 368 Expect(fakeCloudControllerClient.DeleteRouteArgsForCall(0)).To(Equal("some-route-guid")) 369 }) 370 }) 371 372 Context("when the API returns both warnings and an error", func() { 373 var expectedErr error 374 375 BeforeEach(func() { 376 expectedErr = errors.New("bananahammock") 377 fakeCloudControllerClient.DeleteRouteReturns(ccv2.Warnings{"foo", "bar"}, expectedErr) 378 }) 379 380 It("returns both the warnings and the error", func() { 381 warnings, err := actor.DeleteRoute("some-route-guid") 382 Expect(err).To(MatchError(expectedErr)) 383 Expect(warnings).To(ConsistOf("foo", "bar")) 384 }) 385 }) 386 }) 387 388 Describe("GetApplicationRoutes", func() { 389 Context("when the CC API client does not return any errors", func() { 390 BeforeEach(func() { 391 fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{ 392 ccv2.Route{ 393 GUID: "route-guid-1", 394 SpaceGUID: "some-space-guid", 395 Host: "host", 396 Path: "/path", 397 Port: 1234, 398 DomainGUID: "domain-1-guid", 399 }, 400 ccv2.Route{ 401 GUID: "route-guid-2", 402 SpaceGUID: "some-space-guid", 403 Host: "host", 404 Path: "/path", 405 Port: 1234, 406 DomainGUID: "domain-2-guid", 407 }, 408 }, ccv2.Warnings{"get-application-routes-warning"}, nil) 409 410 fakeCloudControllerClient.GetSharedDomainReturnsOnCall(0, ccv2.Domain{Name: "domain.com"}, nil, nil) 411 fakeCloudControllerClient.GetSharedDomainReturnsOnCall(1, ccv2.Domain{Name: "other-domain.com"}, nil, nil) 412 }) 413 414 It("returns the application routes and any warnings", func() { 415 routes, warnings, err := actor.GetApplicationRoutes("application-guid") 416 Expect(fakeCloudControllerClient.GetApplicationRoutesCallCount()).To(Equal(1)) 417 Expect(fakeCloudControllerClient.GetApplicationRoutesArgsForCall(0)).To(Equal("application-guid")) 418 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(2)) 419 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid")) 420 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(1)).To(Equal("domain-2-guid")) 421 422 Expect(warnings).To(ConsistOf("get-application-routes-warning")) 423 Expect(err).NotTo(HaveOccurred()) 424 Expect(routes).To(ConsistOf([]Route{ 425 { 426 Domain: Domain{ 427 Name: "domain.com", 428 }, 429 GUID: "route-guid-1", 430 Host: "host", 431 Path: "/path", 432 Port: 1234, 433 SpaceGUID: "some-space-guid", 434 }, 435 { 436 Domain: Domain{ 437 Name: "other-domain.com", 438 }, 439 GUID: "route-guid-2", 440 Host: "host", 441 Path: "/path", 442 Port: 1234, 443 SpaceGUID: "some-space-guid", 444 }, 445 })) 446 }) 447 }) 448 449 Context("when the CC API client returns an error", func() { 450 Context("when getting application routes returns an error and warnings", func() { 451 BeforeEach(func() { 452 fakeCloudControllerClient.GetApplicationRoutesReturns( 453 []ccv2.Route{}, ccv2.Warnings{"application-routes-warning"}, errors.New("get-application-routes-error")) 454 }) 455 456 It("returns the error and warnings", func() { 457 routes, warnings, err := actor.GetApplicationRoutes("application-guid") 458 Expect(warnings).To(ConsistOf("application-routes-warning")) 459 Expect(err).To(MatchError("get-application-routes-error")) 460 Expect(routes).To(BeNil()) 461 }) 462 }) 463 464 Context("when getting the domain returns an error and warnings", func() { 465 BeforeEach(func() { 466 fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{ 467 ccv2.Route{ 468 GUID: "route-guid-1", 469 SpaceGUID: "some-space-guid", 470 Host: "host", 471 Path: "/path", 472 Port: 1234, 473 DomainGUID: "domain-1-guid", 474 }, 475 }, nil, nil) 476 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, errors.New("get-domain-error")) 477 }) 478 479 It("returns the error and warnings", func() { 480 routes, warnings, err := actor.GetApplicationRoutes("application-guid") 481 Expect(warnings).To(ConsistOf("domain-warning")) 482 Expect(err).To(MatchError("get-domain-error")) 483 Expect(routes).To(BeNil()) 484 485 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1)) 486 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid")) 487 }) 488 }) 489 }) 490 491 Context("when the CC API client returns warnings and no errors", func() { 492 BeforeEach(func() { 493 fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{ 494 ccv2.Route{ 495 GUID: "route-guid-1", 496 SpaceGUID: "some-space-guid", 497 Host: "host", 498 Path: "/path", 499 Port: 1234, 500 DomainGUID: "domain-1-guid", 501 }, 502 }, ccv2.Warnings{"application-routes-warning"}, nil) 503 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, nil) 504 }) 505 506 It("returns the warnings", func() { 507 _, warnings, _ := actor.GetApplicationRoutes("application-guid") 508 Expect(warnings).To(ConsistOf("application-routes-warning", "domain-warning")) 509 }) 510 }) 511 }) 512 513 Describe("GetSpaceRoutes", func() { 514 Context("when the CC API client does not return any errors", func() { 515 BeforeEach(func() { 516 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 517 ccv2.Route{ 518 GUID: "route-guid-1", 519 SpaceGUID: "some-space-guid", 520 Host: "host", 521 Path: "/path", 522 Port: 1234, 523 DomainGUID: "domain-1-guid", 524 }, 525 ccv2.Route{ 526 GUID: "route-guid-2", 527 SpaceGUID: "some-space-guid", 528 Host: "host", 529 Path: "/path", 530 Port: 1234, 531 DomainGUID: "domain-2-guid", 532 }, 533 }, ccv2.Warnings{"get-space-routes-warning"}, nil) 534 fakeCloudControllerClient.GetSharedDomainReturnsOnCall(0, ccv2.Domain{Name: "domain.com"}, nil, nil) 535 fakeCloudControllerClient.GetSharedDomainReturnsOnCall(1, ccv2.Domain{Name: "other-domain.com"}, nil, nil) 536 }) 537 538 It("returns the space routes and any warnings", func() { 539 routes, warnings, err := actor.GetSpaceRoutes("space-guid") 540 Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1)) 541 Expect(fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0)).To(Equal("space-guid")) 542 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(2)) 543 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid")) 544 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(1)).To(Equal("domain-2-guid")) 545 546 Expect(warnings).To(ConsistOf("get-space-routes-warning")) 547 Expect(err).NotTo(HaveOccurred()) 548 Expect(routes).To(ConsistOf([]Route{ 549 { 550 Domain: Domain{ 551 Name: "domain.com", 552 }, 553 GUID: "route-guid-1", 554 Host: "host", 555 Path: "/path", 556 Port: 1234, 557 SpaceGUID: "some-space-guid", 558 }, 559 { 560 Domain: Domain{ 561 Name: "other-domain.com", 562 }, 563 GUID: "route-guid-2", 564 Host: "host", 565 Path: "/path", 566 Port: 1234, 567 SpaceGUID: "some-space-guid", 568 }, 569 })) 570 }) 571 }) 572 573 Context("when the CC API client returns an error", func() { 574 Context("when getting space routes returns an error and warnings", func() { 575 BeforeEach(func() { 576 fakeCloudControllerClient.GetSpaceRoutesReturns( 577 []ccv2.Route{}, ccv2.Warnings{"space-routes-warning"}, errors.New("get-space-routes-error")) 578 }) 579 580 It("returns the error and warnings", func() { 581 routes, warnings, err := actor.GetSpaceRoutes("space-guid") 582 Expect(warnings).To(ConsistOf("space-routes-warning")) 583 Expect(err).To(MatchError("get-space-routes-error")) 584 Expect(routes).To(BeNil()) 585 }) 586 }) 587 588 Context("when getting the domain returns an error and warnings", func() { 589 BeforeEach(func() { 590 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 591 ccv2.Route{ 592 GUID: "route-guid-1", 593 SpaceGUID: "some-space-guid", 594 Host: "host", 595 Path: "/path", 596 Port: 1234, 597 DomainGUID: "domain-1-guid", 598 }, 599 }, nil, nil) 600 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, errors.New("get-domain-error")) 601 }) 602 603 It("returns the error and warnings", func() { 604 routes, warnings, err := actor.GetSpaceRoutes("space-guid") 605 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1)) 606 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid")) 607 608 Expect(warnings).To(ConsistOf("domain-warning")) 609 Expect(err).To(MatchError("get-domain-error")) 610 Expect(routes).To(BeNil()) 611 }) 612 }) 613 }) 614 615 Context("when the CC API client returns warnings and no errors", func() { 616 BeforeEach(func() { 617 fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{ 618 ccv2.Route{ 619 GUID: "route-guid-1", 620 SpaceGUID: "some-space-guid", 621 Host: "host", 622 Path: "/path", 623 Port: 1234, 624 DomainGUID: "domain-1-guid", 625 }, 626 }, ccv2.Warnings{"space-routes-warning"}, nil) 627 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, nil) 628 }) 629 630 It("returns the warnings", func() { 631 _, warnings, _ := actor.GetSpaceRoutes("space-guid") 632 Expect(warnings).To(ConsistOf("space-routes-warning", "domain-warning")) 633 }) 634 }) 635 }) 636 637 Describe("GetRouteByHostAndDomain", func() { 638 var ( 639 host string 640 domainGUID string 641 642 route Route 643 warnings Warnings 644 executeErr error 645 ) 646 647 BeforeEach(func() { 648 host = "some-host" 649 domainGUID = "some-domain-guid" 650 }) 651 652 JustBeforeEach(func() { 653 route, warnings, executeErr = actor.GetRouteByHostAndDomain(host, domainGUID) 654 }) 655 656 Context("when finding the route is successful", func() { 657 BeforeEach(func() { 658 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{ 659 { 660 GUID: "route-guid-1", 661 SpaceGUID: "some-space-guid", 662 Host: "host", 663 Path: "/path", 664 Port: 1234, 665 DomainGUID: "domain-1-guid", 666 }, 667 }, ccv2.Warnings{"get-routes-warning"}, nil) 668 }) 669 670 Context("when finding the domain is successful", func() { 671 BeforeEach(func() { 672 fakeCloudControllerClient.GetSharedDomainReturns( 673 ccv2.Domain{ 674 Name: "domain.com", 675 }, ccv2.Warnings{"get-domain-warning"}, nil) 676 }) 677 678 It("returns the routes and any warnings", func() { 679 Expect(warnings).To(ConsistOf("get-routes-warning", "get-domain-warning")) 680 Expect(executeErr).NotTo(HaveOccurred()) 681 Expect(route).To(Equal(Route{ 682 Domain: Domain{ 683 Name: "domain.com", 684 }, 685 GUID: "route-guid-1", 686 Host: "host", 687 Path: "/path", 688 Port: 1234, 689 SpaceGUID: "some-space-guid", 690 })) 691 692 Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1)) 693 Expect(fakeCloudControllerClient.GetRoutesArgsForCall(0)).To(Equal([]ccv2.Query{ 694 {Filter: ccv2.HostFilter, Operator: ccv2.EqualOperator, Value: host}, 695 {Filter: ccv2.DomainGUIDFilter, Operator: ccv2.EqualOperator, Value: domainGUID}, 696 })) 697 698 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1)) 699 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid")) 700 }) 701 }) 702 703 Context("when getting the domain returns an error and warnings", func() { 704 var expectedErr error 705 706 BeforeEach(func() { 707 expectedErr = errors.New("get-domain-error") 708 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"get-domain-warning"}, expectedErr) 709 }) 710 711 It("returns the error and warnings", func() { 712 Expect(executeErr).To(MatchError(expectedErr)) 713 Expect(warnings).To(ConsistOf("get-routes-warning", "get-domain-warning")) 714 }) 715 }) 716 }) 717 718 Context("when getting routes returns an error and warnings", func() { 719 var expectedErr error 720 721 BeforeEach(func() { 722 expectedErr = errors.New("get-routes-err") 723 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{}, ccv2.Warnings{"get-routes-warning"}, expectedErr) 724 }) 725 726 It("returns the error and warnings", func() { 727 Expect(executeErr).To(MatchError(expectedErr)) 728 Expect(warnings).To(ConsistOf("get-routes-warning")) 729 }) 730 }) 731 732 Context("when no route is found", func() { 733 BeforeEach(func() { 734 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{}, ccv2.Warnings{"get-routes-warning"}, nil) 735 }) 736 737 It("returns a RouteNotFoundError and warnings", func() { 738 Expect(executeErr).To(MatchError(RouteNotFoundError{Host: host, DomainGUID: domainGUID})) 739 Expect(warnings).To(ConsistOf("get-routes-warning")) 740 }) 741 }) 742 }) 743 744 Describe("CheckRoute", func() { 745 Context("when the API calls succeed", func() { 746 BeforeEach(func() { 747 fakeCloudControllerClient.CheckRouteReturns(true, ccv2.Warnings{"some-check-route-warnings"}, nil) 748 }) 749 750 It("returns the bool and warnings", func() { 751 exists, warnings, err := actor.CheckRoute(Route{ 752 Host: "some-host", 753 Domain: Domain{ 754 GUID: "some-domain-guid", 755 }, 756 Path: "some-path", 757 Port: 42, 758 }) 759 760 Expect(err).ToNot(HaveOccurred()) 761 Expect(warnings).To(ConsistOf("some-check-route-warnings")) 762 Expect(exists).To(BeTrue()) 763 764 Expect(fakeCloudControllerClient.CheckRouteCallCount()).To(Equal(1)) 765 Expect(fakeCloudControllerClient.CheckRouteArgsForCall(0)).To(Equal(ccv2.Route{ 766 Host: "some-host", 767 DomainGUID: "some-domain-guid", 768 Path: "some-path", 769 Port: 42, 770 })) 771 }) 772 }) 773 774 Context("when the cc returns an error", func() { 775 var expectedErr error 776 777 BeforeEach(func() { 778 expectedErr = errors.New("booo") 779 fakeCloudControllerClient.CheckRouteReturns(false, ccv2.Warnings{"some-check-route-warnings"}, expectedErr) 780 }) 781 782 It("returns the bool and warnings", func() { 783 exists, warnings, err := actor.CheckRoute(Route{ 784 Host: "some-host", 785 Domain: Domain{ 786 GUID: "some-domain-guid", 787 }, 788 }) 789 790 Expect(err).To(MatchError(expectedErr)) 791 Expect(warnings).To(ConsistOf("some-check-route-warnings")) 792 Expect(exists).To(BeFalse()) 793 }) 794 }) 795 }) 796 797 Describe("FindRouteBoundToSpaceWithSettings", func() { 798 var ( 799 route Route 800 801 returnedRoute Route 802 warnings Warnings 803 executeErr error 804 ) 805 806 BeforeEach(func() { 807 route = Route{ 808 Domain: Domain{ 809 Name: "some-domain.com", 810 GUID: "some-domain-guid", 811 }, 812 Host: "some-host", 813 SpaceGUID: "some-space-guid", 814 } 815 816 fakeCloudControllerClient.GetSharedDomainReturns( 817 ccv2.Domain{ 818 GUID: "some-domain-guid", 819 Name: "some-domain.com", 820 }, 821 ccv2.Warnings{"get domain warning"}, 822 nil) 823 }) 824 825 JustBeforeEach(func() { 826 returnedRoute, warnings, executeErr = actor.FindRouteBoundToSpaceWithSettings(route) 827 }) 828 829 Context("when the route exists in the current space", func() { 830 var existingRoute Route 831 832 BeforeEach(func() { 833 existingRoute = route 834 existingRoute.GUID = "some-route-guid" 835 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{ActorToCCRoute(existingRoute)}, ccv2.Warnings{"get route warning"}, nil) 836 }) 837 838 It("returns the route", func() { 839 Expect(executeErr).ToNot(HaveOccurred()) 840 Expect(returnedRoute).To(Equal(existingRoute)) 841 Expect(warnings).To(ConsistOf("get route warning", "get domain warning")) 842 }) 843 }) 844 845 Context("when the route exists in a different space", func() { 846 Context("when the user has access to the route", func() { 847 BeforeEach(func() { 848 existingRoute := route 849 existingRoute.GUID = "some-route-guid" 850 existingRoute.SpaceGUID = "some-other-space-guid" 851 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{ActorToCCRoute(existingRoute)}, ccv2.Warnings{"get route warning"}, nil) 852 }) 853 854 It("returns a RouteInDifferentSpaceError", func() { 855 Expect(executeErr).To(MatchError(RouteInDifferentSpaceError{Route: route.String()})) 856 Expect(warnings).To(ConsistOf("get route warning", "get domain warning")) 857 }) 858 }) 859 860 Context("when the user does not have access to the route", func() { 861 BeforeEach(func() { 862 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{}, ccv2.Warnings{"get route warning"}, nil) 863 fakeCloudControllerClient.CheckRouteReturns(true, ccv2.Warnings{"check route warning"}, nil) 864 }) 865 866 It("returns a RouteInDifferentSpaceError", func() { 867 Expect(executeErr).To(MatchError(RouteInDifferentSpaceError{Route: route.String()})) 868 Expect(warnings).To(ConsistOf("get route warning", "check route warning")) 869 }) 870 }) 871 }) 872 873 Context("when the route does not exist", func() { 874 var expectedErr error 875 876 BeforeEach(func() { 877 expectedErr = RouteNotFoundError{Host: route.Host, DomainGUID: route.Domain.GUID} 878 fakeCloudControllerClient.GetRoutesReturns([]ccv2.Route{}, ccv2.Warnings{"get route warning"}, nil) 879 fakeCloudControllerClient.CheckRouteReturns(false, ccv2.Warnings{"check route warning"}, nil) 880 }) 881 882 It("returns the route", func() { 883 Expect(executeErr).To(MatchError(expectedErr)) 884 Expect(warnings).To(ConsistOf("get route warning", "check route warning")) 885 }) 886 }) 887 888 Context("when finding the route errors", func() { 889 var expectedErr error 890 891 BeforeEach(func() { 892 expectedErr = errors.New("booo") 893 fakeCloudControllerClient.GetRoutesReturns(nil, ccv2.Warnings{"get route warning"}, expectedErr) 894 }) 895 896 It("the error and warnings", func() { 897 Expect(executeErr).To(MatchError(expectedErr)) 898 Expect(warnings).To(ConsistOf("get route warning")) 899 }) 900 }) 901 }) 902 })