github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/label_test.go (about)

     1  package v7action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	. "code.cloudfoundry.org/cli/actor/v7action"
     7  	"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     9  	"code.cloudfoundry.org/cli/types"
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("labels", func() {
    15  	var (
    16  		actor                     *Actor
    17  		fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient
    18  		fakeSharedActor           *v7actionfakes.FakeSharedActor
    19  		fakeConfig                *v7actionfakes.FakeConfig
    20  		warnings                  Warnings
    21  		executeErr                error
    22  		resourceName              string
    23  		spaceGUID                 string
    24  		orgGUID                   string
    25  		labels                    map[string]types.NullString
    26  	)
    27  
    28  	BeforeEach(func() {
    29  		fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient)
    30  		fakeSharedActor = new(v7actionfakes.FakeSharedActor)
    31  		fakeConfig = new(v7actionfakes.FakeConfig)
    32  		actor = NewActor(fakeCloudControllerClient, fakeConfig, fakeSharedActor, nil, nil)
    33  		resourceName = "some-resource"
    34  		orgGUID = "some-org-guid"
    35  		spaceGUID = "some-space-guid"
    36  	})
    37  
    38  	Context("UpdateApplicationLabelsByApplicationName", func() {
    39  		JustBeforeEach(func() {
    40  			warnings, executeErr = actor.UpdateApplicationLabelsByApplicationName(resourceName, spaceGUID, labels)
    41  		})
    42  
    43  		When("there are no client errors", func() {
    44  			BeforeEach(func() {
    45  				fakeCloudControllerClient.GetApplicationsReturns(
    46  					[]ccv3.Application{ccv3.Application{GUID: "some-guid"}},
    47  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
    48  					nil,
    49  				)
    50  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
    51  					ccv3.ResourceMetadata{},
    52  					ccv3.Warnings{"set-app-labels-warnings"},
    53  					nil,
    54  				)
    55  			})
    56  
    57  			It("gets the application", func() {
    58  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
    59  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
    60  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
    61  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{spaceGUID}},
    62  				))
    63  			})
    64  
    65  			It("sets the app labels", func() {
    66  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
    67  				resourceType, appGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
    68  				Expect(executeErr).ToNot(HaveOccurred())
    69  				Expect(resourceType).To(BeEquivalentTo("app"))
    70  				Expect(appGUID).To(BeEquivalentTo("some-guid"))
    71  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
    72  			})
    73  
    74  			It("aggregates warnings", func() {
    75  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-app-labels-warnings"))
    76  			})
    77  		})
    78  
    79  		When("there are client errors", func() {
    80  			When("GetApplications fails", func() {
    81  				BeforeEach(func() {
    82  					fakeCloudControllerClient.GetApplicationsReturns(
    83  						[]ccv3.Application{ccv3.Application{GUID: "some-guid"}},
    84  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
    85  						errors.New("get-apps-error"),
    86  					)
    87  				})
    88  
    89  				It("returns the error and all warnings", func() {
    90  					Expect(executeErr).To(HaveOccurred())
    91  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
    92  					Expect(executeErr).To(MatchError("get-apps-error"))
    93  				})
    94  			})
    95  
    96  			When("UpdateApplication fails", func() {
    97  				BeforeEach(func() {
    98  					fakeCloudControllerClient.GetApplicationsReturns(
    99  						[]ccv3.Application{ccv3.Application{GUID: "some-guid"}},
   100  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   101  						nil,
   102  					)
   103  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   104  						ccv3.ResourceMetadata{},
   105  						ccv3.Warnings{"set-app-labels-warnings"},
   106  						errors.New("update-application-error"),
   107  					)
   108  				})
   109  
   110  				It("returns the error and all warnings", func() {
   111  					Expect(executeErr).To(HaveOccurred())
   112  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-app-labels-warnings"))
   113  					Expect(executeErr).To(MatchError("update-application-error"))
   114  				})
   115  			})
   116  
   117  		})
   118  	})
   119  
   120  	Context("UpdateDomainLabelsByDomainName", func() {
   121  		JustBeforeEach(func() {
   122  			warnings, executeErr = actor.UpdateDomainLabelsByDomainName(resourceName, labels)
   123  		})
   124  
   125  		When("there are no client errors", func() {
   126  			BeforeEach(func() {
   127  				fakeCloudControllerClient.GetDomainsReturns(
   128  					[]ccv3.Domain{ccv3.Domain{GUID: "some-guid"}},
   129  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   130  					nil,
   131  				)
   132  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
   133  					ccv3.ResourceMetadata{},
   134  					ccv3.Warnings{"warning-updating-metadata"},
   135  					nil,
   136  				)
   137  			})
   138  
   139  			It("gets the domain", func() {
   140  				Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1))
   141  				Expect(fakeCloudControllerClient.GetDomainsArgsForCall(0)).To(ConsistOf(
   142  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   143  				))
   144  			})
   145  
   146  			It("sets the domain labels", func() {
   147  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
   148  				resourceType, domainGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
   149  				Expect(executeErr).ToNot(HaveOccurred())
   150  				Expect(resourceType).To(BeEquivalentTo("domain"))
   151  				Expect(domainGUID).To(BeEquivalentTo("some-guid"))
   152  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   153  			})
   154  
   155  			It("aggregates warnings", func() {
   156  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "warning-updating-metadata"))
   157  			})
   158  		})
   159  
   160  		When("there are client errors", func() {
   161  			When("fetching the domain fails", func() {
   162  				BeforeEach(func() {
   163  					fakeCloudControllerClient.GetDomainsReturns(
   164  						[]ccv3.Domain{ccv3.Domain{GUID: "some-guid"}},
   165  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
   166  						errors.New("get-domains-error"),
   167  					)
   168  				})
   169  
   170  				It("returns the error and all warnings", func() {
   171  					Expect(executeErr).To(HaveOccurred())
   172  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
   173  					Expect(executeErr).To(MatchError("get-domains-error"))
   174  				})
   175  			})
   176  
   177  			When("updating the domain fails", func() {
   178  				BeforeEach(func() {
   179  					fakeCloudControllerClient.GetDomainsReturns(
   180  						[]ccv3.Domain{ccv3.Domain{GUID: "some-guid"}},
   181  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   182  						nil,
   183  					)
   184  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   185  						ccv3.ResourceMetadata{},
   186  						ccv3.Warnings{"warning-updating-metadata"},
   187  						errors.New("update-domain-error"),
   188  					)
   189  				})
   190  				It("returns the error and all warnings", func() {
   191  					Expect(executeErr).To(HaveOccurred())
   192  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "warning-updating-metadata"))
   193  					Expect(executeErr).To(MatchError("update-domain-error"))
   194  				})
   195  			})
   196  		})
   197  	})
   198  
   199  	Context("UpdateOrganizationLabelsByOrganizationName", func() {
   200  		JustBeforeEach(func() {
   201  			warnings, executeErr = actor.UpdateOrganizationLabelsByOrganizationName(resourceName, labels)
   202  		})
   203  
   204  		When("there are no client errors", func() {
   205  			BeforeEach(func() {
   206  				fakeCloudControllerClient.GetOrganizationsReturns(
   207  					[]ccv3.Organization{ccv3.Organization{GUID: "some-guid"}},
   208  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   209  					nil,
   210  				)
   211  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
   212  					ccv3.ResourceMetadata{},
   213  					ccv3.Warnings{"set-org"},
   214  					nil,
   215  				)
   216  			})
   217  
   218  			It("gets the organization", func() {
   219  				Expect(fakeCloudControllerClient.GetOrganizationsCallCount()).To(Equal(1))
   220  				Expect(fakeCloudControllerClient.GetOrganizationsArgsForCall(0)).To(ConsistOf(
   221  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   222  				))
   223  			})
   224  
   225  			It("sets the org labels", func() {
   226  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
   227  				resourceType, orgGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
   228  				Expect(executeErr).ToNot(HaveOccurred())
   229  				Expect(resourceType).To(BeEquivalentTo("org"))
   230  				Expect(orgGUID).To(BeEquivalentTo("some-guid"))
   231  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   232  			})
   233  
   234  			It("aggregates warnings", func() {
   235  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-org"))
   236  			})
   237  		})
   238  
   239  		When("there are client errors", func() {
   240  			When("fetching the organization fails", func() {
   241  				BeforeEach(func() {
   242  					fakeCloudControllerClient.GetOrganizationsReturns(
   243  						[]ccv3.Organization{ccv3.Organization{GUID: "some-guid"}},
   244  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
   245  						errors.New("get-orgs-error"),
   246  					)
   247  				})
   248  
   249  				It("returns the error and all warnings", func() {
   250  					Expect(executeErr).To(HaveOccurred())
   251  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
   252  					Expect(executeErr).To(MatchError("get-orgs-error"))
   253  				})
   254  			})
   255  
   256  			When("updating the organization fails", func() {
   257  				BeforeEach(func() {
   258  					fakeCloudControllerClient.GetOrganizationsReturns(
   259  						[]ccv3.Organization{ccv3.Organization{GUID: "some-guid"}},
   260  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   261  						nil,
   262  					)
   263  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   264  						ccv3.ResourceMetadata{},
   265  						ccv3.Warnings{"set-org"},
   266  						errors.New("update-orgs-error"),
   267  					)
   268  				})
   269  				It("returns the error and all warnings", func() {
   270  					Expect(executeErr).To(HaveOccurred())
   271  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-org"))
   272  					Expect(executeErr).To(MatchError("update-orgs-error"))
   273  				})
   274  			})
   275  		})
   276  	})
   277  
   278  	Context("UpdateRouteLabels", func() {
   279  		JustBeforeEach(func() {
   280  			warnings, executeErr = actor.UpdateRouteLabels("sub.example.com/my-route/path", "space-guid", labels)
   281  		})
   282  
   283  		When("there are no client errors", func() {
   284  			BeforeEach(func() {
   285  				fakeCloudControllerClient.GetDomainsReturns(
   286  					[]ccv3.Domain{
   287  						{Name: "domain-name", GUID: "domain-guid"},
   288  					},
   289  					ccv3.Warnings{"get-domains-warning"},
   290  					nil,
   291  				)
   292  
   293  				fakeCloudControllerClient.GetRoutesReturns(
   294  					[]ccv3.Route{
   295  						{GUID: "route-guid", SpaceGUID: "space-guid", DomainGUID: "domain-guid", Host: "hostname", URL: "hostname.domain-name", Path: "/the-path"},
   296  					},
   297  					ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"},
   298  					nil,
   299  				)
   300  
   301  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
   302  					ccv3.ResourceMetadata{},
   303  					ccv3.Warnings{"set-route-warning"},
   304  					nil,
   305  				)
   306  			})
   307  
   308  			It("gets the domain", func() {
   309  				Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1))
   310  				Expect(fakeCloudControllerClient.GetDomainsArgsForCall(0)).To(ConsistOf(
   311  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"sub.example.com"}},
   312  				))
   313  			})
   314  
   315  			It("gets the route", func() {
   316  				Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1))
   317  				Expect(fakeCloudControllerClient.GetRoutesArgsForCall(0)).To(ConsistOf(
   318  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"space-guid"}},
   319  					ccv3.Query{Key: ccv3.DomainGUIDFilter, Values: []string{"domain-guid"}},
   320  					ccv3.Query{Key: ccv3.HostsFilter, Values: []string{""}},
   321  					ccv3.Query{Key: ccv3.PathsFilter, Values: []string{"/my-route/path"}},
   322  				))
   323  			})
   324  
   325  			It("sets the route labels", func() {
   326  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
   327  				resourceType, routeGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
   328  				Expect(executeErr).ToNot(HaveOccurred())
   329  				Expect(resourceType).To(BeEquivalentTo("route"))
   330  				Expect(routeGUID).To(BeEquivalentTo("route-guid"))
   331  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   332  			})
   333  
   334  			It("aggregates warnings", func() {
   335  				Expect(warnings).To(ConsistOf("get-domains-warning", "get-route-warning-1", "get-route-warning-2", "set-route-warning"))
   336  			})
   337  		})
   338  
   339  		When("there are client errors", func() {
   340  			When("fetching the route fails", func() {
   341  				BeforeEach(func() {
   342  					fakeCloudControllerClient.GetDomainsReturns(
   343  						nil,
   344  						ccv3.Warnings{"get-domains-warning"},
   345  						errors.New("get-domain-error"),
   346  					)
   347  				})
   348  
   349  				It("returns the error and all warnings", func() {
   350  					Expect(executeErr).To(HaveOccurred())
   351  					Expect(warnings).To(ConsistOf("get-domains-warning"))
   352  					Expect(executeErr).To(MatchError("get-domain-error"))
   353  				})
   354  			})
   355  
   356  			When("updating the route fails", func() {
   357  				BeforeEach(func() {
   358  					fakeCloudControllerClient.GetDomainsReturns(
   359  						[]ccv3.Domain{
   360  							{Name: "domain-name", GUID: "domain-guid"},
   361  						},
   362  						ccv3.Warnings{"get-domains-warning"},
   363  						nil,
   364  					)
   365  
   366  					fakeCloudControllerClient.GetRoutesReturns(
   367  						[]ccv3.Route{
   368  							{GUID: "route-guid", SpaceGUID: "space-guid", DomainGUID: "domain-guid", Host: "hostname", URL: "hostname.domain-name", Path: "/the-path"},
   369  						},
   370  						ccv3.Warnings{"get-route-warning-1", "get-route-warning-2"},
   371  						nil,
   372  					)
   373  
   374  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   375  						ccv3.ResourceMetadata{},
   376  						ccv3.Warnings{"set-route-warning"},
   377  						errors.New("update-route-error"),
   378  					)
   379  				})
   380  
   381  				It("returns the error and all warnings", func() {
   382  					Expect(executeErr).To(HaveOccurred())
   383  					Expect(warnings).To(ConsistOf("get-domains-warning", "get-route-warning-1", "get-route-warning-2", "set-route-warning"))
   384  				})
   385  			})
   386  		})
   387  	})
   388  
   389  	Context("UpdateSpaceLabelsBySpaceName", func() {
   390  		JustBeforeEach(func() {
   391  			warnings, executeErr = actor.UpdateSpaceLabelsBySpaceName(resourceName, orgGUID, labels)
   392  		})
   393  
   394  		When("there are no client errors", func() {
   395  			BeforeEach(func() {
   396  				fakeCloudControllerClient.GetSpacesReturns(
   397  					[]ccv3.Space{ccv3.Space{GUID: "some-guid"}},
   398  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   399  					nil,
   400  				)
   401  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
   402  					ccv3.ResourceMetadata{},
   403  					ccv3.Warnings{"set-space-metadata"},
   404  					nil,
   405  				)
   406  			})
   407  
   408  			It("gets the space", func() {
   409  				Expect(fakeCloudControllerClient.GetSpacesCallCount()).To(Equal(1))
   410  				Expect(fakeCloudControllerClient.GetSpacesArgsForCall(0)).To(ConsistOf(
   411  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   412  					ccv3.Query{Key: ccv3.OrganizationGUIDFilter, Values: []string{orgGUID}},
   413  				))
   414  			})
   415  
   416  			It("sets the space labels", func() {
   417  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
   418  				resourceType, spaceGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
   419  				Expect(executeErr).ToNot(HaveOccurred())
   420  				Expect(resourceType).To(BeEquivalentTo("space"))
   421  				Expect(spaceGUID).To(BeEquivalentTo("some-guid"))
   422  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   423  			})
   424  
   425  			It("aggregates warnings", func() {
   426  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-space-metadata"))
   427  			})
   428  		})
   429  
   430  		When("there are client errors", func() {
   431  			When("fetching the space fails", func() {
   432  				BeforeEach(func() {
   433  					fakeCloudControllerClient.GetSpacesReturns(
   434  						[]ccv3.Space{ccv3.Space{GUID: "some-guid"}},
   435  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
   436  						errors.New("get-spaces-error"),
   437  					)
   438  				})
   439  
   440  				It("returns the error and all warnings", func() {
   441  					Expect(executeErr).To(HaveOccurred())
   442  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
   443  					Expect(executeErr).To(MatchError("get-spaces-error"))
   444  				})
   445  			})
   446  
   447  			When("updating the space fails", func() {
   448  				BeforeEach(func() {
   449  					fakeCloudControllerClient.GetSpacesReturns(
   450  						[]ccv3.Space{ccv3.Space{GUID: "some-guid"}},
   451  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   452  						nil,
   453  					)
   454  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   455  						ccv3.ResourceMetadata{},
   456  						ccv3.Warnings{"set-space"},
   457  						errors.New("update-space-error"),
   458  					)
   459  				})
   460  				It("returns the error and all warnings", func() {
   461  					Expect(executeErr).To(HaveOccurred())
   462  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-space"))
   463  					Expect(executeErr).To(MatchError("update-space-error"))
   464  				})
   465  			})
   466  		})
   467  	})
   468  
   469  	Context("UpdateStackLabelsByStackName", func() {
   470  		JustBeforeEach(func() {
   471  			warnings, executeErr = actor.UpdateStackLabelsByStackName(resourceName, labels)
   472  		})
   473  
   474  		When("there are no client errors", func() {
   475  			BeforeEach(func() {
   476  				fakeCloudControllerClient.GetStacksReturns(
   477  					[]ccv3.Stack{ccv3.Stack{GUID: "some-guid"}},
   478  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   479  					nil,
   480  				)
   481  				fakeCloudControllerClient.UpdateResourceMetadataReturns(
   482  					ccv3.ResourceMetadata{},
   483  					ccv3.Warnings{"set-stack-metadata"},
   484  					nil,
   485  				)
   486  			})
   487  
   488  			It("gets the stack", func() {
   489  				Expect(fakeCloudControllerClient.GetStacksCallCount()).To(Equal(1))
   490  				Expect(fakeCloudControllerClient.GetStacksArgsForCall(0)).To(ConsistOf(
   491  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   492  				))
   493  			})
   494  
   495  			It("sets the stack labels", func() {
   496  				Expect(fakeCloudControllerClient.UpdateResourceMetadataCallCount()).To(Equal(1))
   497  				resourceType, stackGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataArgsForCall(0)
   498  				Expect(executeErr).ToNot(HaveOccurred())
   499  				Expect(resourceType).To(BeEquivalentTo("stack"))
   500  				Expect(stackGUID).To(BeEquivalentTo("some-guid"))
   501  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   502  			})
   503  
   504  			It("aggregates warnings", func() {
   505  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-stack-metadata"))
   506  			})
   507  		})
   508  
   509  		When("there are client errors", func() {
   510  			When("fetching the stack fails", func() {
   511  				BeforeEach(func() {
   512  					fakeCloudControllerClient.GetStacksReturns(
   513  						[]ccv3.Stack{ccv3.Stack{GUID: "some-guid"}},
   514  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
   515  						errors.New("get-stacks-error"),
   516  					)
   517  				})
   518  
   519  				It("returns the error and all warnings", func() {
   520  					Expect(executeErr).To(HaveOccurred())
   521  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
   522  					Expect(executeErr).To(MatchError("get-stacks-error"))
   523  				})
   524  			})
   525  
   526  			When("updating the stack fails", func() {
   527  				BeforeEach(func() {
   528  					fakeCloudControllerClient.GetStacksReturns(
   529  						[]ccv3.Stack{ccv3.Stack{GUID: "some-guid"}},
   530  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   531  						nil,
   532  					)
   533  					fakeCloudControllerClient.UpdateResourceMetadataReturns(
   534  						ccv3.ResourceMetadata{},
   535  						ccv3.Warnings{"set-stack"},
   536  						errors.New("update-stack-error"),
   537  					)
   538  				})
   539  				It("returns the error and all warnings", func() {
   540  					Expect(executeErr).To(HaveOccurred())
   541  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-stack"))
   542  					Expect(executeErr).To(MatchError("update-stack-error"))
   543  				})
   544  			})
   545  		})
   546  	})
   547  
   548  	Context("UpdateServiceBrokerLabelsByServiceBrokerName", func() {
   549  		JustBeforeEach(func() {
   550  			warnings, executeErr = actor.UpdateServiceBrokerLabelsByServiceBrokerName(resourceName, labels)
   551  		})
   552  
   553  		When("there are no client errors", func() {
   554  			BeforeEach(func() {
   555  				fakeCloudControllerClient.GetServiceBrokersReturns(
   556  					[]ccv3.ServiceBroker{{GUID: "some-broker-guid", Name: resourceName}},
   557  					[]string{"warning-1", "warning-2"},
   558  					nil,
   559  				)
   560  
   561  				fakeCloudControllerClient.UpdateResourceMetadataAsyncReturns(
   562  					ccv3.JobURL("fake-job-url"),
   563  					ccv3.Warnings{"set-service-broker-metadata"},
   564  					nil,
   565  				)
   566  
   567  				fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"poll-job-warning"}, nil)
   568  			})
   569  
   570  			It("gets the service broker", func() {
   571  				Expect(executeErr).ToNot(HaveOccurred())
   572  				Expect(fakeCloudControllerClient.GetServiceBrokersCallCount()).To(Equal(1))
   573  			})
   574  
   575  			It("sets the service-broker labels", func() {
   576  				Expect(executeErr).ToNot(HaveOccurred())
   577  				Expect(fakeCloudControllerClient.UpdateResourceMetadataAsyncCallCount()).To(Equal(1))
   578  				resourceType, serviceBrokerGUID, sentMetadata := fakeCloudControllerClient.UpdateResourceMetadataAsyncArgsForCall(0)
   579  				Expect(resourceType).To(BeEquivalentTo("service-broker"))
   580  				Expect(serviceBrokerGUID).To(BeEquivalentTo("some-broker-guid"))
   581  				Expect(sentMetadata.Labels).To(BeEquivalentTo(labels))
   582  			})
   583  
   584  			It("polls the job", func() {
   585  				Expect(executeErr).ToNot(HaveOccurred())
   586  				Expect(fakeCloudControllerClient.PollJobCallCount()).To(Equal(1))
   587  				Expect(fakeCloudControllerClient.PollJobArgsForCall(0)).To(BeEquivalentTo("fake-job-url"))
   588  			})
   589  
   590  			It("aggregates warnings", func() {
   591  				Expect(executeErr).ToNot(HaveOccurred())
   592  				Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-service-broker-metadata", "poll-job-warning"))
   593  			})
   594  		})
   595  
   596  		When("there are client errors", func() {
   597  			When("fetching the service-broker fails", func() {
   598  				BeforeEach(func() {
   599  					fakeCloudControllerClient.GetServiceBrokersReturns(
   600  						[]ccv3.ServiceBroker{},
   601  						ccv3.Warnings([]string{"warning-failure-1", "warning-failure-2"}),
   602  						errors.New("get-service-broker-error"),
   603  					)
   604  				})
   605  
   606  				It("returns the error and all warnings", func() {
   607  					Expect(warnings).To(ConsistOf("warning-failure-1", "warning-failure-2"))
   608  					Expect(executeErr).To(MatchError("get-service-broker-error"))
   609  				})
   610  			})
   611  
   612  			When("updating the service-broker fails", func() {
   613  				BeforeEach(func() {
   614  					fakeCloudControllerClient.GetServiceBrokersReturns(
   615  						[]ccv3.ServiceBroker{ccv3.ServiceBroker{GUID: "some-guid", Name: resourceName}},
   616  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   617  						nil,
   618  					)
   619  					fakeCloudControllerClient.UpdateResourceMetadataAsyncReturns(
   620  						ccv3.JobURL(""),
   621  						ccv3.Warnings{"set-service-broker"},
   622  						errors.New("update-service-broker-error"),
   623  					)
   624  				})
   625  
   626  				It("returns the error and all warnings", func() {
   627  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-service-broker"))
   628  					Expect(executeErr).To(MatchError("update-service-broker-error"))
   629  				})
   630  			})
   631  
   632  			When("polling the job fails", func() {
   633  				BeforeEach(func() {
   634  					fakeCloudControllerClient.GetServiceBrokersReturns(
   635  						[]ccv3.ServiceBroker{ccv3.ServiceBroker{GUID: "some-guid", Name: resourceName}},
   636  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   637  						nil,
   638  					)
   639  					fakeCloudControllerClient.UpdateResourceMetadataAsyncReturns(
   640  						ccv3.JobURL("fake-job-url"),
   641  						ccv3.Warnings{"set-service-broker-metadata"},
   642  						nil,
   643  					)
   644  
   645  					fakeCloudControllerClient.PollJobReturns(
   646  						ccv3.Warnings{"another-poll-job-warning"},
   647  						errors.New("polling-error"),
   648  					)
   649  				})
   650  
   651  				It("returns the error and all warnings", func() {
   652  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "set-service-broker-metadata", "another-poll-job-warning"))
   653  					Expect(executeErr).To(MatchError("polling-error"))
   654  				})
   655  			})
   656  		})
   657  	})
   658  
   659  	Context("GetDomainLabels", func() {
   660  		JustBeforeEach(func() {
   661  			labels, warnings, executeErr = actor.GetDomainLabels(resourceName)
   662  		})
   663  
   664  		When("there are no client errors", func() {
   665  			BeforeEach(func() {
   666  				fakeCloudControllerClient.GetDomainsReturns(
   667  					[]ccv3.Domain{ccv3.Domain{GUID: "some-guid"}},
   668  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   669  					nil,
   670  				)
   671  			})
   672  
   673  			It("gets the domain", func() {
   674  				Expect(fakeCloudControllerClient.GetDomainsCallCount()).To(Equal(1))
   675  				Expect(fakeCloudControllerClient.GetDomainsArgsForCall(0)).To(ConsistOf(
   676  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   677  				))
   678  			})
   679  
   680  			When("there are no labels on a domain", func() {
   681  				It("returns an empty map", func() {
   682  					Expect(executeErr).NotTo(HaveOccurred())
   683  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   684  					Expect(labels).To(BeEmpty())
   685  				})
   686  			})
   687  
   688  			When("there are labels", func() {
   689  				var expectedLabels map[string]types.NullString
   690  
   691  				BeforeEach(func() {
   692  					expectedLabels = map[string]types.NullString{"key1": types.NewNullString("value1"), "key2": types.NewNullString("value2")}
   693  					fakeCloudControllerClient.GetDomainsReturns(
   694  						[]ccv3.Domain{ccv3.Domain{
   695  							GUID: "some-guid",
   696  							Metadata: &ccv3.Metadata{
   697  								Labels: expectedLabels,
   698  							}}},
   699  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   700  						nil,
   701  					)
   702  				})
   703  				It("returns the labels", func() {
   704  					Expect(executeErr).NotTo(HaveOccurred())
   705  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   706  					Expect(labels).To(Equal(expectedLabels))
   707  				})
   708  			})
   709  		})
   710  
   711  		When("there is a client error", func() {
   712  			BeforeEach(func() {
   713  				fakeCloudControllerClient.GetDomainsReturns(
   714  					[]ccv3.Domain{ccv3.Domain{GUID: "some-guid"}},
   715  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   716  					errors.New("get-domains-error"),
   717  				)
   718  			})
   719  			When("GetDomainByName fails", func() {
   720  				It("returns the error and all warnings", func() {
   721  					Expect(executeErr).To(HaveOccurred())
   722  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   723  					Expect(executeErr).To(MatchError("get-domains-error"))
   724  				})
   725  			})
   726  		})
   727  	})
   728  
   729  	Context("GetRouteLabels", func() {
   730  		JustBeforeEach(func() {
   731  			labels, warnings, executeErr = actor.GetRouteLabels("sub.example.com/my-route/path", spaceGUID)
   732  		})
   733  
   734  		When("there are no client errors", func() {
   735  			BeforeEach(func() {
   736  				fakeCloudControllerClient.GetDomainsReturns(
   737  					[]ccv3.Domain{
   738  						{Name: "domain-name", GUID: "domain-guid"},
   739  					},
   740  					ccv3.Warnings{"get-domains-warning"},
   741  					nil,
   742  				)
   743  
   744  				fakeCloudControllerClient.GetRoutesReturns(
   745  					[]ccv3.Route{
   746  						{GUID: "route-guid", SpaceGUID: "some-space-guid", DomainGUID: "domain-guid", Host: "hostname", URL: "hostname.domain-name", Path: "/the-path"},
   747  					},
   748  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   749  					nil,
   750  				)
   751  			})
   752  
   753  			It("gets the route", func() {
   754  				Expect(fakeCloudControllerClient.GetRoutesCallCount()).To(Equal(1))
   755  				Expect(fakeCloudControllerClient.GetRoutesArgsForCall(0)).To(ConsistOf(
   756  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{spaceGUID}},
   757  					ccv3.Query{Key: ccv3.DomainGUIDFilter, Values: []string{"domain-guid"}},
   758  					ccv3.Query{Key: ccv3.HostsFilter, Values: []string{""}},
   759  					ccv3.Query{Key: ccv3.PathsFilter, Values: []string{"/my-route/path"}},
   760  				))
   761  			})
   762  
   763  			When("there are no labels on a route", func() {
   764  				It("returns an empty map", func() {
   765  					Expect(executeErr).NotTo(HaveOccurred())
   766  					Expect(warnings).To(ConsistOf("get-domains-warning", "warning-1", "warning-2"))
   767  					Expect(labels).To(BeEmpty())
   768  				})
   769  			})
   770  
   771  			When("there are labels", func() {
   772  				var expectedLabels map[string]types.NullString
   773  
   774  				BeforeEach(func() {
   775  					expectedLabels = map[string]types.NullString{"key1": types.NewNullString("value1"), "key2": types.NewNullString("value2")}
   776  					fakeCloudControllerClient.GetRoutesReturns(
   777  						[]ccv3.Route{ccv3.Route{
   778  							GUID: "some-guid",
   779  							Metadata: &ccv3.Metadata{
   780  								Labels: expectedLabels,
   781  							}}},
   782  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   783  						nil,
   784  					)
   785  				})
   786  				It("returns the labels", func() {
   787  					Expect(executeErr).NotTo(HaveOccurred())
   788  					Expect(warnings).To(ConsistOf("get-domains-warning", "warning-1", "warning-2"))
   789  					Expect(labels).To(Equal(expectedLabels))
   790  				})
   791  			})
   792  		})
   793  
   794  		When("there is a client error", func() {
   795  			BeforeEach(func() {
   796  				fakeCloudControllerClient.GetDomainsReturns(
   797  					[]ccv3.Domain{
   798  						{Name: "domain-name", GUID: "domain-guid"},
   799  					},
   800  					ccv3.Warnings{"get-domains-warning"},
   801  					nil,
   802  				)
   803  
   804  				fakeCloudControllerClient.GetRoutesReturns(
   805  					[]ccv3.Route{ccv3.Route{GUID: "some-guid"}},
   806  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   807  					errors.New("get-routes-error"),
   808  				)
   809  			})
   810  
   811  			It("returns the error and all warnings", func() {
   812  				Expect(executeErr).To(HaveOccurred())
   813  				Expect(warnings).To(ConsistOf("get-domains-warning", "warning-1", "warning-2"))
   814  				Expect(executeErr).To(MatchError("get-routes-error"))
   815  			})
   816  		})
   817  	})
   818  
   819  	Context("GetStackLabels", func() {
   820  		JustBeforeEach(func() {
   821  			labels, warnings, executeErr = actor.GetStackLabels(resourceName)
   822  		})
   823  
   824  		When("there are no client errors", func() {
   825  			BeforeEach(func() {
   826  				fakeCloudControllerClient.GetStacksReturns(
   827  					[]ccv3.Stack{ccv3.Stack{GUID: "some-guid"}},
   828  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   829  					nil,
   830  				)
   831  			})
   832  
   833  			It("gets the stack", func() {
   834  				Expect(fakeCloudControllerClient.GetStacksCallCount()).To(Equal(1))
   835  				Expect(fakeCloudControllerClient.GetStacksArgsForCall(0)).To(ConsistOf(
   836  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{resourceName}},
   837  				))
   838  			})
   839  
   840  			When("there are no labels on a stack", func() {
   841  				It("returns an empty map", func() {
   842  					Expect(executeErr).NotTo(HaveOccurred())
   843  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   844  					Expect(labels).To(BeEmpty())
   845  				})
   846  			})
   847  
   848  			When("there are labels", func() {
   849  				var expectedLabels map[string]types.NullString
   850  
   851  				BeforeEach(func() {
   852  					expectedLabels = map[string]types.NullString{"key1": types.NewNullString("value1"), "key2": types.NewNullString("value2")}
   853  					fakeCloudControllerClient.GetStacksReturns(
   854  						[]ccv3.Stack{ccv3.Stack{
   855  							GUID: "some-guid",
   856  							Metadata: &ccv3.Metadata{
   857  								Labels: expectedLabels,
   858  							}}},
   859  						ccv3.Warnings([]string{"warning-1", "warning-2"}),
   860  						nil,
   861  					)
   862  				})
   863  				It("returns the labels", func() {
   864  					Expect(executeErr).NotTo(HaveOccurred())
   865  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   866  					Expect(labels).To(Equal(expectedLabels))
   867  				})
   868  			})
   869  		})
   870  
   871  		When("there is a client error", func() {
   872  			BeforeEach(func() {
   873  				fakeCloudControllerClient.GetStacksReturns(
   874  					[]ccv3.Stack{ccv3.Stack{GUID: "some-guid"}},
   875  					ccv3.Warnings([]string{"warning-1", "warning-2"}),
   876  					errors.New("get-stacks-error"),
   877  				)
   878  			})
   879  			When("GetStackByName fails", func() {
   880  				It("returns the error and all warnings", func() {
   881  					Expect(executeErr).To(HaveOccurred())
   882  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   883  					Expect(executeErr).To(MatchError("get-stacks-error"))
   884  				})
   885  			})
   886  		})
   887  	})
   888  
   889  	Context("GetServiceBrokerLabels", func() {
   890  		When("service broker does not exist", func() {
   891  			BeforeEach(func() {
   892  				fakeCloudControllerClient.GetServiceBrokersReturns(
   893  					[]ccv3.ServiceBroker{},
   894  					[]string{"warning-1", "warning-2"},
   895  					nil,
   896  				)
   897  			})
   898  
   899  			JustBeforeEach(func() {
   900  				labels, warnings, executeErr = actor.GetServiceBrokerLabels(resourceName)
   901  			})
   902  
   903  			It("returns a service broker not found error and warnings", func() {
   904  				Expect(executeErr).To(HaveOccurred())
   905  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   906  				Expect(executeErr.Error()).To(ContainSubstring("Service broker 'some-resource' not found"))
   907  			})
   908  		})
   909  
   910  		When("client returns an error", func() {
   911  			BeforeEach(func() {
   912  				fakeCloudControllerClient.GetServiceBrokersReturns(
   913  					[]ccv3.ServiceBroker{},
   914  					[]string{"warning"},
   915  					errors.New("some random error"),
   916  				)
   917  			})
   918  
   919  			JustBeforeEach(func() {
   920  				labels, warnings, executeErr = actor.GetServiceBrokerLabels(resourceName)
   921  			})
   922  
   923  			It("returns error and prints warnings", func() {
   924  				Expect(executeErr).To(HaveOccurred())
   925  				Expect(warnings).To(ConsistOf("warning"))
   926  				Expect(executeErr).To(MatchError("some random error"))
   927  			})
   928  		})
   929  		When("service broker has labels", func() {
   930  			var expectedLabels map[string]types.NullString
   931  
   932  			BeforeEach(func() {
   933  				expectedLabels = map[string]types.NullString{"key1": types.NewNullString("value1"), "key2": types.NewNullString("value2")}
   934  				fakeCloudControllerClient.GetServiceBrokersReturns(
   935  					[]ccv3.ServiceBroker{ccv3.ServiceBroker{
   936  						GUID: "some-guid",
   937  						Name: resourceName,
   938  						Metadata: &ccv3.Metadata{
   939  							Labels: expectedLabels,
   940  						}}},
   941  					[]string{"warning-1", "warning-2"},
   942  					nil,
   943  				)
   944  			})
   945  
   946  			JustBeforeEach(func() {
   947  				labels, warnings, executeErr = actor.GetServiceBrokerLabels(resourceName)
   948  			})
   949  
   950  			It("returns labels associated with the service broker as well as warnings", func() {
   951  				Expect(executeErr).ToNot(HaveOccurred())
   952  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   953  				Expect(labels).To(Equal(expectedLabels))
   954  			})
   955  		})
   956  
   957  	})
   958  })