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