github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+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/ccv2"
     9  	. "github.com/onsi/ginkgo"
    10  	. "github.com/onsi/ginkgo/extensions/table"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("Route Actions", func() {
    15  	var (
    16  		actor                     Actor
    17  		fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient
    18  	)
    19  
    20  	BeforeEach(func() {
    21  		fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient)
    22  		actor = NewActor(fakeCloudControllerClient, nil)
    23  	})
    24  
    25  	Describe("GetOrphanedRoutesBySpace", func() {
    26  		BeforeEach(func() {
    27  			fakeCloudControllerClient.GetRouteApplicationsStub = func(routeGUID string, queries []ccv2.Query) ([]ccv2.Application, ccv2.Warnings, error) {
    28  				switch routeGUID {
    29  				case "orphaned-route-guid-1":
    30  					return []ccv2.Application{}, nil, nil
    31  				case "orphaned-route-guid-2":
    32  					return []ccv2.Application{}, nil, nil
    33  				case "not-orphaned-route-guid-3":
    34  					return []ccv2.Application{
    35  						{GUID: "app-guid"},
    36  					}, nil, nil
    37  				}
    38  				Fail("Unexpected route-guid")
    39  				return []ccv2.Application{}, nil, nil
    40  			}
    41  		})
    42  
    43  		Context("when there are orphaned routes", func() {
    44  			BeforeEach(func() {
    45  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
    46  					{
    47  						GUID:       "orphaned-route-guid-1",
    48  						DomainGUID: "some-domain-guid",
    49  					},
    50  					{
    51  						GUID:       "orphaned-route-guid-2",
    52  						DomainGUID: "some-other-domain-guid",
    53  					},
    54  					{
    55  						GUID:       "not-orphaned-route-guid-3",
    56  						DomainGUID: "not-orphaned-route-domain-guid",
    57  					},
    58  				}, nil, nil)
    59  				fakeCloudControllerClient.GetSharedDomainStub = func(domainGUID string) (ccv2.Domain, ccv2.Warnings, error) {
    60  					switch domainGUID {
    61  					case "some-domain-guid":
    62  						return ccv2.Domain{
    63  							GUID: "some-domain-guid",
    64  							Name: "some-domain.com",
    65  						}, nil, nil
    66  					case "some-other-domain-guid":
    67  						return ccv2.Domain{
    68  							GUID: "some-other-domain-guid",
    69  							Name: "some-other-domain.com",
    70  						}, nil, nil
    71  					case "not-orphaned-route-domain-guid":
    72  						return ccv2.Domain{
    73  							GUID: "not-orphaned-route-domain-guid",
    74  							Name: "not-orphaned-route-domain.com",
    75  						}, nil, nil
    76  					}
    77  					return ccv2.Domain{}, nil, errors.New("Unexpected domain GUID")
    78  				}
    79  			})
    80  
    81  			It("returns the orphaned routes with the domain names", func() {
    82  				orphanedRoutes, _, err := actor.GetOrphanedRoutesBySpace("space-guid")
    83  				Expect(err).NotTo(HaveOccurred())
    84  				Expect(orphanedRoutes).To(ConsistOf([]Route{
    85  					{
    86  						GUID:   "orphaned-route-guid-1",
    87  						Domain: "some-domain.com",
    88  					},
    89  					{
    90  						GUID:   "orphaned-route-guid-2",
    91  						Domain: "some-other-domain.com",
    92  					},
    93  				}))
    94  
    95  				Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1))
    96  
    97  				spaceGUID, queries := fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0)
    98  				Expect(spaceGUID).To(Equal("space-guid"))
    99  				Expect(queries).To(BeNil())
   100  
   101  				Expect(fakeCloudControllerClient.GetRouteApplicationsCallCount()).To(Equal(3))
   102  
   103  				routeGUID, queries := fakeCloudControllerClient.GetRouteApplicationsArgsForCall(0)
   104  				Expect(routeGUID).To(Equal("orphaned-route-guid-1"))
   105  				Expect(queries).To(BeNil())
   106  
   107  				routeGUID, queries = fakeCloudControllerClient.GetRouteApplicationsArgsForCall(1)
   108  				Expect(routeGUID).To(Equal("orphaned-route-guid-2"))
   109  				Expect(queries).To(BeNil())
   110  
   111  				routeGUID, queries = fakeCloudControllerClient.GetRouteApplicationsArgsForCall(2)
   112  				Expect(routeGUID).To(Equal("not-orphaned-route-guid-3"))
   113  				Expect(queries).To(BeNil())
   114  			})
   115  		})
   116  
   117  		Context("when there are no orphaned routes", func() {
   118  			var expectedErr OrphanedRoutesNotFoundError
   119  
   120  			BeforeEach(func() {
   121  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   122  					ccv2.Route{GUID: "not-orphaned-route-guid-3"},
   123  				}, nil, nil)
   124  			})
   125  
   126  			It("returns an OrphanedRoutesNotFoundError", func() {
   127  				orphanedRoutes, _, err := actor.GetOrphanedRoutesBySpace("space-guid")
   128  				Expect(err).To(MatchError(expectedErr))
   129  				Expect(orphanedRoutes).To(BeNil())
   130  
   131  				Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1))
   132  
   133  				spaceGUID, queries := fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0)
   134  				Expect(spaceGUID).To(Equal("space-guid"))
   135  				Expect(queries).To(BeNil())
   136  
   137  				Expect(fakeCloudControllerClient.GetRouteApplicationsCallCount()).To(Equal(1))
   138  
   139  				routeGUID, queries := fakeCloudControllerClient.GetRouteApplicationsArgsForCall(0)
   140  				Expect(routeGUID).To(Equal("not-orphaned-route-guid-3"))
   141  				Expect(queries).To(BeNil())
   142  			})
   143  		})
   144  
   145  		Context("when there are warnings", func() {
   146  			BeforeEach(func() {
   147  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   148  					ccv2.Route{GUID: "route-guid-1"},
   149  					ccv2.Route{GUID: "route-guid-2"},
   150  				}, ccv2.Warnings{"get-routes-warning"}, nil)
   151  				fakeCloudControllerClient.GetRouteApplicationsReturns(nil, ccv2.Warnings{"get-applications-warning"}, nil)
   152  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{GUID: "some-guid"}, ccv2.Warnings{"get-shared-domain-warning"}, nil)
   153  			})
   154  
   155  			It("returns all the warnings", func() {
   156  				_, warnings, err := actor.GetOrphanedRoutesBySpace("space-guid")
   157  				Expect(err).NotTo(HaveOccurred())
   158  				Expect(warnings).To(ConsistOf("get-routes-warning", "get-applications-warning", "get-shared-domain-warning", "get-applications-warning", "get-shared-domain-warning"))
   159  			})
   160  		})
   161  
   162  		Context("when the spaces routes API request returns an error", func() {
   163  			var expectedErr error
   164  
   165  			BeforeEach(func() {
   166  				expectedErr = errors.New("spaces routes error")
   167  				fakeCloudControllerClient.GetSpaceRoutesReturns(nil, nil, expectedErr)
   168  			})
   169  
   170  			It("returns the error", func() {
   171  				routes, _, err := actor.GetOrphanedRoutesBySpace("space-guid")
   172  				Expect(err).To(Equal(expectedErr))
   173  				Expect(routes).To(BeNil())
   174  			})
   175  		})
   176  
   177  		Context("when a route's applications API request returns an error", func() {
   178  			var expectedErr error
   179  
   180  			BeforeEach(func() {
   181  				expectedErr = errors.New("application error")
   182  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   183  					ccv2.Route{GUID: "route-guid"},
   184  				}, nil, nil)
   185  				fakeCloudControllerClient.GetRouteApplicationsReturns(nil, nil, expectedErr)
   186  			})
   187  
   188  			It("returns the error", func() {
   189  				routes, _, err := actor.GetOrphanedRoutesBySpace("space-guid")
   190  				Expect(err).To(Equal(expectedErr))
   191  				Expect(routes).To(BeNil())
   192  			})
   193  		})
   194  	})
   195  
   196  	Describe("DeleteRoute", func() {
   197  		Context("when the route exists", func() {
   198  			BeforeEach(func() {
   199  				fakeCloudControllerClient.DeleteRouteReturns(nil, nil)
   200  			})
   201  
   202  			It("deletes the route", func() {
   203  				_, err := actor.DeleteRoute("some-route-guid")
   204  				Expect(err).NotTo(HaveOccurred())
   205  
   206  				Expect(fakeCloudControllerClient.DeleteRouteCallCount()).To(Equal(1))
   207  				Expect(fakeCloudControllerClient.DeleteRouteArgsForCall(0)).To(Equal("some-route-guid"))
   208  			})
   209  		})
   210  
   211  		Context("when the API returns both warnings and an error", func() {
   212  			var expectedErr error
   213  
   214  			BeforeEach(func() {
   215  				expectedErr = errors.New("bananahammock")
   216  				fakeCloudControllerClient.DeleteRouteReturns(ccv2.Warnings{"foo", "bar"}, expectedErr)
   217  			})
   218  
   219  			It("returns both the warnings and the error", func() {
   220  				warnings, err := actor.DeleteRoute("some-route-guid")
   221  				Expect(err).To(MatchError(expectedErr))
   222  				Expect(warnings).To(ConsistOf("foo", "bar"))
   223  			})
   224  		})
   225  	})
   226  
   227  	Describe("GetApplicationRoutes", func() {
   228  		Context("when the CC API client does not return any errors", func() {
   229  			BeforeEach(func() {
   230  				fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{
   231  					ccv2.Route{
   232  						GUID:       "route-guid-1",
   233  						Host:       "host",
   234  						Path:       "/path",
   235  						Port:       1234,
   236  						DomainGUID: "domain-1-guid",
   237  					},
   238  					ccv2.Route{
   239  						GUID:       "route-guid-2",
   240  						Host:       "host",
   241  						Path:       "/path",
   242  						Port:       1234,
   243  						DomainGUID: "domain-2-guid",
   244  					},
   245  				}, ccv2.Warnings{"get-application-routes-warning"}, nil)
   246  				fakeCloudControllerClient.GetSharedDomainReturns(
   247  					ccv2.Domain{
   248  						Name: "domain",
   249  					}, nil, nil)
   250  			})
   251  
   252  			It("returns the application routes and any warnings", func() {
   253  				routes, warnings, err := actor.GetApplicationRoutes("application-guid", nil)
   254  				Expect(fakeCloudControllerClient.GetApplicationRoutesCallCount()).To(Equal(1))
   255  				Expect(fakeCloudControllerClient.GetApplicationRoutesArgsForCall(0)).To(Equal("application-guid"))
   256  				Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(2))
   257  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid"))
   258  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(1)).To(Equal("domain-2-guid"))
   259  
   260  				Expect(warnings).To(ConsistOf("get-application-routes-warning"))
   261  				Expect(err).NotTo(HaveOccurred())
   262  				Expect(routes).To(ConsistOf([]Route{
   263  					{
   264  						GUID:   "route-guid-1",
   265  						Host:   "host",
   266  						Domain: "domain",
   267  						Path:   "/path",
   268  						Port:   1234,
   269  					},
   270  					{
   271  						GUID:   "route-guid-2",
   272  						Host:   "host",
   273  						Domain: "domain",
   274  						Path:   "/path",
   275  						Port:   1234,
   276  					},
   277  				}))
   278  			})
   279  		})
   280  
   281  		Context("when the CC API client returns an error", func() {
   282  			Context("when getting application routes returns an error and warnings", func() {
   283  				BeforeEach(func() {
   284  					fakeCloudControllerClient.GetApplicationRoutesReturns(
   285  						[]ccv2.Route{}, ccv2.Warnings{"application-routes-warning"}, errors.New("get-application-routes-error"))
   286  				})
   287  
   288  				It("returns the error and warnings", func() {
   289  					routes, warnings, err := actor.GetApplicationRoutes("application-guid", nil)
   290  					Expect(warnings).To(ConsistOf("application-routes-warning"))
   291  					Expect(err).To(MatchError("get-application-routes-error"))
   292  					Expect(routes).To(BeNil())
   293  				})
   294  			})
   295  
   296  			Context("when getting the domain returns an error and warnings", func() {
   297  				BeforeEach(func() {
   298  					fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{
   299  						ccv2.Route{
   300  							GUID:       "route-guid-1",
   301  							Host:       "host",
   302  							Path:       "/path",
   303  							Port:       1234,
   304  							DomainGUID: "domain-1-guid",
   305  						},
   306  					}, nil, nil)
   307  					fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, errors.New("get-domain-error"))
   308  				})
   309  
   310  				It("returns the error and warnings", func() {
   311  					routes, warnings, err := actor.GetApplicationRoutes("application-guid", nil)
   312  					Expect(warnings).To(ConsistOf("domain-warning"))
   313  					Expect(err).To(MatchError("get-domain-error"))
   314  					Expect(routes).To(BeNil())
   315  
   316  					Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   317  					Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid"))
   318  				})
   319  			})
   320  		})
   321  
   322  		Context("when the CC API client returns warnings and no errors", func() {
   323  			BeforeEach(func() {
   324  				fakeCloudControllerClient.GetApplicationRoutesReturns([]ccv2.Route{
   325  					ccv2.Route{
   326  						GUID:       "route-guid-1",
   327  						Host:       "host",
   328  						Path:       "/path",
   329  						Port:       1234,
   330  						DomainGUID: "domain-1-guid",
   331  					},
   332  				}, ccv2.Warnings{"application-routes-warning"}, nil)
   333  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, nil)
   334  			})
   335  
   336  			It("returns the warnings", func() {
   337  				_, warnings, _ := actor.GetApplicationRoutes("application-guid", nil)
   338  				Expect(warnings).To(ConsistOf("application-routes-warning", "domain-warning"))
   339  			})
   340  		})
   341  
   342  		Context("when a query parameter exists", func() {
   343  			It("passes the query to the client", func() {
   344  				expectedQuery := []ccv2.Query{
   345  					{
   346  						Filter:   ccv2.AppGUIDFilter,
   347  						Operator: ccv2.EqualOperator,
   348  						Value:    "application-guid",
   349  					}}
   350  
   351  				_, _, err := actor.GetApplicationRoutes("application-guid", expectedQuery)
   352  				Expect(err).ToNot(HaveOccurred())
   353  
   354  				Expect(fakeCloudControllerClient.GetApplicationRoutesCallCount()).To(Equal(1))
   355  				_, query := fakeCloudControllerClient.GetApplicationRoutesArgsForCall(0)
   356  				Expect(query).To(Equal(expectedQuery))
   357  			})
   358  		})
   359  	})
   360  
   361  	Describe("GetSpaceRoutes", func() {
   362  		Context("when the CC API client does not return any errors", func() {
   363  			BeforeEach(func() {
   364  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   365  					ccv2.Route{
   366  						GUID:       "route-guid-1",
   367  						Host:       "host",
   368  						Path:       "/path",
   369  						Port:       1234,
   370  						DomainGUID: "domain-1-guid",
   371  					},
   372  					ccv2.Route{
   373  						GUID:       "route-guid-2",
   374  						Host:       "host",
   375  						Path:       "/path",
   376  						Port:       1234,
   377  						DomainGUID: "domain-2-guid",
   378  					},
   379  				}, ccv2.Warnings{"get-space-routes-warning"}, nil)
   380  				fakeCloudControllerClient.GetSharedDomainReturns(
   381  					ccv2.Domain{
   382  						Name: "domain",
   383  					}, nil, nil)
   384  			})
   385  
   386  			It("returns the space routes and any warnings", func() {
   387  				routes, warnings, err := actor.GetSpaceRoutes("space-guid", nil)
   388  				Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1))
   389  				Expect(fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0)).To(Equal("space-guid"))
   390  				Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(2))
   391  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid"))
   392  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(1)).To(Equal("domain-2-guid"))
   393  
   394  				Expect(warnings).To(ConsistOf("get-space-routes-warning"))
   395  				Expect(err).NotTo(HaveOccurred())
   396  				Expect(routes).To(ConsistOf([]Route{
   397  					{
   398  						GUID:   "route-guid-1",
   399  						Host:   "host",
   400  						Domain: "domain",
   401  						Path:   "/path",
   402  						Port:   1234,
   403  					},
   404  					{
   405  						GUID:   "route-guid-2",
   406  						Host:   "host",
   407  						Domain: "domain",
   408  						Path:   "/path",
   409  						Port:   1234,
   410  					},
   411  				}))
   412  			})
   413  		})
   414  
   415  		Context("when the CC API client returns an error", func() {
   416  			Context("when getting space routes returns an error and warnings", func() {
   417  				BeforeEach(func() {
   418  					fakeCloudControllerClient.GetSpaceRoutesReturns(
   419  						[]ccv2.Route{}, ccv2.Warnings{"space-routes-warning"}, errors.New("get-space-routes-error"))
   420  				})
   421  
   422  				It("returns the error and warnings", func() {
   423  					routes, warnings, err := actor.GetSpaceRoutes("space-guid", nil)
   424  					Expect(warnings).To(ConsistOf("space-routes-warning"))
   425  					Expect(err).To(MatchError("get-space-routes-error"))
   426  					Expect(routes).To(BeNil())
   427  				})
   428  			})
   429  
   430  			Context("when getting the domain returns an error and warnings", func() {
   431  				BeforeEach(func() {
   432  					fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   433  						ccv2.Route{
   434  							GUID:       "route-guid-1",
   435  							Host:       "host",
   436  							Path:       "/path",
   437  							Port:       1234,
   438  							DomainGUID: "domain-1-guid",
   439  						},
   440  					}, nil, nil)
   441  					fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, errors.New("get-domain-error"))
   442  				})
   443  
   444  				It("returns the error and warnings", func() {
   445  					routes, warnings, err := actor.GetSpaceRoutes("space-guid", nil)
   446  					Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   447  					Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("domain-1-guid"))
   448  
   449  					Expect(warnings).To(ConsistOf("domain-warning"))
   450  					Expect(err).To(MatchError("get-domain-error"))
   451  					Expect(routes).To(BeNil())
   452  				})
   453  			})
   454  		})
   455  
   456  		Context("when the CC API client returns warnings and no errors", func() {
   457  			BeforeEach(func() {
   458  				fakeCloudControllerClient.GetSpaceRoutesReturns([]ccv2.Route{
   459  					ccv2.Route{
   460  						GUID:       "route-guid-1",
   461  						Host:       "host",
   462  						Path:       "/path",
   463  						Port:       1234,
   464  						DomainGUID: "domain-1-guid",
   465  					},
   466  				}, ccv2.Warnings{"space-routes-warning"}, nil)
   467  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"domain-warning"}, nil)
   468  			})
   469  
   470  			It("returns the warnings", func() {
   471  				_, warnings, _ := actor.GetSpaceRoutes("space-guid", nil)
   472  				Expect(warnings).To(ConsistOf("space-routes-warning", "domain-warning"))
   473  			})
   474  		})
   475  
   476  		Context("when a query parameter exists", func() {
   477  			It("passes the query to the client", func() {
   478  				expectedQuery := []ccv2.Query{
   479  					{
   480  						Filter:   ccv2.SpaceGUIDFilter,
   481  						Operator: ccv2.EqualOperator,
   482  						Value:    "space-guid",
   483  					}}
   484  
   485  				_, _, err := actor.GetSpaceRoutes("space-guid", expectedQuery)
   486  				Expect(err).ToNot(HaveOccurred())
   487  
   488  				Expect(fakeCloudControllerClient.GetSpaceRoutesCallCount()).To(Equal(1))
   489  				_, query := fakeCloudControllerClient.GetSpaceRoutesArgsForCall(0)
   490  				Expect(query).To(Equal(expectedQuery))
   491  			})
   492  		})
   493  	})
   494  
   495  	Describe("Route", func() {
   496  		DescribeTable("String", func(host string, domain string, path string, port int, expectedValue string) {
   497  			route := Route{
   498  				Host:   host,
   499  				Domain: domain,
   500  				Path:   path,
   501  				Port:   port,
   502  			}
   503  			Expect(route.String()).To(Equal(expectedValue))
   504  		},
   505  
   506  			Entry("has domain", "", "domain.com", "", 0, "domain.com"),
   507  			Entry("has host, domain", "host", "domain.com", "", 0, "host.domain.com"),
   508  			Entry("has domain, path", "", "domain.com", "/path", 0, "domain.com/path"),
   509  			Entry("has host, domain, path", "host", "domain.com", "/path", 0, "host.domain.com/path"),
   510  			Entry("has domain, port", "", "domain.com", "", 3333, "domain.com:3333"),
   511  			Entry("has host, domain, path, port", "host", "domain.com", "/path", 3333, "domain.com:3333"),
   512  		)
   513  	})
   514  })