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  })