github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/actor/v2action/domain_test.go (about)

     1  package v2action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	. "code.cloudfoundry.org/cli/actor/v2action"
     8  	"code.cloudfoundry.org/cli/actor/v2action/v2actionfakes"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/ginkgo/extensions/table"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Domain Actions", func() {
    18  	var (
    19  		actor                     *Actor
    20  		fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient)
    25  		actor = NewActor(fakeCloudControllerClient, nil, nil)
    26  	})
    27  
    28  	Describe("Domain", func() {
    29  		var domain Domain
    30  
    31  		Describe("IsHTTP", func() {
    32  			When("the RouterGroupType = 'http'", func() {
    33  				BeforeEach(func() {
    34  					domain.RouterGroupType = constant.HTTPRouterGroup
    35  				})
    36  
    37  				It("returns true", func() {
    38  					Expect(domain.IsHTTP()).To(BeTrue())
    39  				})
    40  			})
    41  
    42  			When("the RouterGroupType is anything other than 'tcp'", func() {
    43  				BeforeEach(func() {
    44  					domain.RouterGroupType = ""
    45  				})
    46  
    47  				It("returns true", func() {
    48  					Expect(domain.IsHTTP()).To(BeTrue())
    49  				})
    50  			})
    51  
    52  			When("the RouterGroupType = 'http'", func() {
    53  				BeforeEach(func() {
    54  					domain.RouterGroupType = constant.TCPRouterGroup
    55  				})
    56  
    57  				It("returns false", func() {
    58  					Expect(domain.IsHTTP()).To(BeFalse())
    59  				})
    60  			})
    61  		})
    62  
    63  		Describe("IsTCP", func() {
    64  			When("the RouterGroupType = 'tcp'", func() {
    65  				BeforeEach(func() {
    66  					domain.RouterGroupType = constant.TCPRouterGroup
    67  				})
    68  
    69  				It("returns true", func() {
    70  					Expect(domain.IsTCP()).To(BeTrue())
    71  				})
    72  			})
    73  
    74  			When("the RouterGroupType is anything else", func() {
    75  				BeforeEach(func() {
    76  					domain.RouterGroupType = constant.HTTPRouterGroup
    77  				})
    78  
    79  				It("returns false", func() {
    80  					Expect(domain.IsTCP()).To(BeFalse())
    81  				})
    82  			})
    83  		})
    84  
    85  		Describe("IsShared", func() {
    86  			When("the the type is shared", func() {
    87  				BeforeEach(func() {
    88  					domain.Type = constant.SharedDomain
    89  				})
    90  
    91  				It("returns true", func() {
    92  					Expect(domain.IsShared()).To(BeTrue())
    93  				})
    94  			})
    95  
    96  			When("the RouterGroupType is anything else", func() {
    97  				BeforeEach(func() {
    98  					domain.Type = constant.PrivateDomain
    99  				})
   100  
   101  				It("returns false", func() {
   102  					Expect(domain.IsShared()).To(BeFalse())
   103  				})
   104  			})
   105  		})
   106  
   107  		Describe("IsPrivate", func() {
   108  			When("the the type is shared", func() {
   109  				BeforeEach(func() {
   110  					domain.Type = constant.PrivateDomain
   111  				})
   112  
   113  				It("returns true", func() {
   114  					Expect(domain.IsPrivate()).To(BeTrue())
   115  				})
   116  			})
   117  
   118  			When("the RouterGroupType is anything else", func() {
   119  				BeforeEach(func() {
   120  					domain.Type = constant.SharedDomain
   121  				})
   122  
   123  				It("returns false", func() {
   124  					Expect(domain.IsPrivate()).To(BeFalse())
   125  				})
   126  			})
   127  		})
   128  	})
   129  
   130  	Describe("DomainNotFoundError", func() {
   131  		var err actionerror.DomainNotFoundError
   132  		When("the name is provided", func() {
   133  			BeforeEach(func() {
   134  				err = actionerror.DomainNotFoundError{Name: "some-domain-name"}
   135  			})
   136  
   137  			It("returns the correct message", func() {
   138  				Expect(err.Error()).To(Equal("Domain some-domain-name not found"))
   139  			})
   140  		})
   141  
   142  		When("the name is not provided but the guid is", func() {
   143  			BeforeEach(func() {
   144  				err = actionerror.DomainNotFoundError{GUID: "some-domain-guid"}
   145  			})
   146  
   147  			It("returns the correct message", func() {
   148  				Expect(err.Error()).To(Equal("Domain with GUID some-domain-guid not found"))
   149  			})
   150  		})
   151  
   152  		When("neither the name nor the guid is provided", func() {
   153  			BeforeEach(func() {
   154  				err = actionerror.DomainNotFoundError{}
   155  			})
   156  
   157  			It("returns the correct message", func() {
   158  				Expect(err.Error()).To(Equal("Domain not found"))
   159  			})
   160  		})
   161  	})
   162  
   163  	Describe("GetDomain", func() {
   164  		When("the domain exists and is a shared domain", func() {
   165  			var expectedDomain ccv2.Domain
   166  
   167  			BeforeEach(func() {
   168  				expectedDomain = ccv2.Domain{
   169  					GUID: "shared-domain-guid",
   170  					Name: "shared-domain",
   171  				}
   172  				fakeCloudControllerClient.GetSharedDomainReturns(expectedDomain, ccv2.Warnings{"get-domain-warning"}, nil)
   173  			})
   174  
   175  			It("returns the shared domain", func() {
   176  				domain, warnings, err := actor.GetDomain("shared-domain-guid")
   177  				Expect(err).NotTo(HaveOccurred())
   178  				Expect(warnings).To(ConsistOf("get-domain-warning"))
   179  				Expect(domain).To(Equal(Domain(expectedDomain)))
   180  
   181  				Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   182  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("shared-domain-guid"))
   183  			})
   184  		})
   185  
   186  		When("the domain exists and is a private domain", func() {
   187  			var expectedDomain ccv2.Domain
   188  
   189  			BeforeEach(func() {
   190  				expectedDomain = ccv2.Domain{
   191  					GUID: "private-domain-guid",
   192  					Name: "private-domain",
   193  				}
   194  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, nil, ccerror.ResourceNotFoundError{})
   195  				fakeCloudControllerClient.GetPrivateDomainReturns(expectedDomain, nil, nil)
   196  			})
   197  
   198  			It("returns the private domain", func() {
   199  				domain, _, err := actor.GetDomain("private-domain-guid")
   200  				Expect(err).NotTo(HaveOccurred())
   201  				Expect(domain).To(Equal(Domain(expectedDomain)))
   202  
   203  				Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   204  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("private-domain-guid"))
   205  				Expect(fakeCloudControllerClient.GetPrivateDomainCallCount()).To(Equal(1))
   206  				Expect(fakeCloudControllerClient.GetPrivateDomainArgsForCall(0)).To(Equal("private-domain-guid"))
   207  			})
   208  		})
   209  
   210  		When("the domain does not exist", func() {
   211  			var expectedErr actionerror.DomainNotFoundError
   212  
   213  			BeforeEach(func() {
   214  				expectedErr = actionerror.DomainNotFoundError{GUID: "private-domain-guid"}
   215  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, nil, ccerror.ResourceNotFoundError{})
   216  				fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, nil, ccerror.ResourceNotFoundError{})
   217  			})
   218  
   219  			It("returns a DomainNotFoundError", func() {
   220  				domain, _, err := actor.GetDomain("private-domain-guid")
   221  				Expect(err).To(MatchError(expectedErr))
   222  				Expect(domain).To(Equal(Domain(ccv2.Domain{})))
   223  			})
   224  		})
   225  
   226  		DescribeTable("when there are warnings and errors", func(
   227  			stubGetSharedDomain func(),
   228  			stubGetPrivateDomain func(),
   229  			expectedDomain Domain,
   230  			expectedWarnings Warnings,
   231  			expectingError bool,
   232  			expectedErr error,
   233  		) {
   234  			stubGetSharedDomain()
   235  			stubGetPrivateDomain()
   236  			domain, warnings, err := actor.GetDomain("some-domain-guid")
   237  			Expect(domain).To(Equal(expectedDomain))
   238  			Expect(warnings).To(ConsistOf(expectedWarnings))
   239  			if expectingError {
   240  				Expect(err).To(MatchError(expectedErr))
   241  			} else {
   242  				Expect(err).To(Not(HaveOccurred()))
   243  			}
   244  		},
   245  
   246  			Entry(
   247  				"shared domain warning and error",
   248  				func() {
   249  					fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, []string{"shared-domain-warning"}, errors.New("shared domain error"))
   250  				},
   251  				func() { fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, nil, nil) },
   252  				Domain{},
   253  				Warnings{"shared-domain-warning"},
   254  				true,
   255  				errors.New("shared domain error"),
   256  			),
   257  
   258  			Entry(
   259  				"shared domain warning and resource not found; private domain warning & error",
   260  				func() {
   261  					fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, []string{"shared-domain-warning"}, ccerror.ResourceNotFoundError{})
   262  				},
   263  				func() {
   264  					fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, []string{"private-domain-warning"}, errors.New("private domain error"))
   265  				},
   266  				Domain{},
   267  				Warnings{"shared-domain-warning", "private-domain-warning"},
   268  				true,
   269  				errors.New("private domain error"),
   270  			),
   271  		)
   272  	})
   273  
   274  	Describe("GetDomains", func() {
   275  		var (
   276  			domains    []Domain
   277  			warnings   Warnings
   278  			executeErr error
   279  		)
   280  
   281  		JustBeforeEach(func() {
   282  			domains, warnings, executeErr = actor.GetDomains("some-org")
   283  		})
   284  
   285  		It("calls GetSharedDomains", func() {
   286  			Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(1))
   287  		})
   288  
   289  		When("GetSharedDomains returns successfully", func() {
   290  			BeforeEach(func() {
   291  				fakeCloudControllerClient.GetSharedDomainsReturns(
   292  					[]ccv2.Domain{
   293  						{
   294  							Name: "some-domain.com",
   295  							Type: constant.SharedDomain,
   296  						},
   297  						{
   298  							Name: "some-other-domain.com",
   299  							Type: constant.SharedDomain,
   300  						},
   301  					},
   302  					ccv2.Warnings{"warning-1", "warning-2"},
   303  					nil)
   304  			})
   305  
   306  			It("returns all shared domains and prints all warnings", func() {
   307  				Expect(executeErr).NotTo(HaveOccurred())
   308  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   309  				Expect(domains).To(ConsistOf(
   310  					Domain{Name: "some-domain.com", Type: constant.SharedDomain},
   311  					Domain{Name: "some-other-domain.com", Type: constant.SharedDomain},
   312  				))
   313  			})
   314  
   315  			It("calls GetOrganizationPrivateDomains with the given org guid", func() {
   316  				Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(1))
   317  				Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsArgsForCall(0)).To(Equal("some-org"))
   318  			})
   319  
   320  			When("GetOrganizationPrivateDomains returns successfully", func() {
   321  				BeforeEach(func() {
   322  					fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(
   323  						[]ccv2.Domain{
   324  							{
   325  								Name: "some-domain.private",
   326  								Type: constant.PrivateDomain,
   327  							},
   328  							{
   329  								Name: "some-other-domain.private",
   330  								Type: constant.PrivateDomain,
   331  							},
   332  						},
   333  						ccv2.Warnings{"warning-3", "warning-4"},
   334  						nil)
   335  				})
   336  
   337  				It("returns the shared and private domains and returns all warnings", func() {
   338  					Expect(executeErr).NotTo(HaveOccurred())
   339  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "warning-3", "warning-4"))
   340  					Expect(domains).To(ConsistOf(
   341  						Domain{Name: "some-domain.com", Type: constant.SharedDomain},
   342  						Domain{Name: "some-other-domain.com", Type: constant.SharedDomain},
   343  						Domain{Name: "some-domain.private", Type: constant.PrivateDomain},
   344  						Domain{Name: "some-other-domain.private", Type: constant.PrivateDomain},
   345  					))
   346  				})
   347  			})
   348  
   349  			When("GetOrganizationPrivateDomains returns an error", func() {
   350  				BeforeEach(func() {
   351  					fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(nil, ccv2.Warnings{"warning-3", "warning-4"}, errors.New("boom"))
   352  				})
   353  
   354  				It("returns the error and all warnings", func() {
   355  					Expect(executeErr).To(MatchError("boom"))
   356  					Expect(warnings).To(ConsistOf("warning-1", "warning-2", "warning-3", "warning-4"))
   357  				})
   358  			})
   359  		})
   360  
   361  		When("GetSharedDomains returns an error", func() {
   362  			BeforeEach(func() {
   363  				fakeCloudControllerClient.GetSharedDomainsReturns(nil, ccv2.Warnings{"warning-1", "warning-2"}, errors.New("boom"))
   364  			})
   365  
   366  			It("returns the error and all warnings", func() {
   367  				Expect(executeErr).To(MatchError("boom"))
   368  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   369  			})
   370  
   371  			It("does not call GetOrganizationPrivateDomains", func() {
   372  				Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(0))
   373  			})
   374  		})
   375  	})
   376  
   377  	Describe("GetDomainsByNameAndOrganization", func() {
   378  		var (
   379  			domainNames []string
   380  			orgGUID     string
   381  
   382  			domains    []Domain
   383  			warnings   Warnings
   384  			executeErr error
   385  		)
   386  
   387  		BeforeEach(func() {
   388  			domainNames = []string{"domain-1", "domain-2", "domain-3"}
   389  			orgGUID = "some-org-guid"
   390  		})
   391  
   392  		JustBeforeEach(func() {
   393  			domains, warnings, executeErr = actor.GetDomainsByNameAndOrganization(domainNames, orgGUID)
   394  		})
   395  
   396  		When("looking up the shared domains is successful", func() {
   397  			var sharedDomains []ccv2.Domain
   398  
   399  			BeforeEach(func() {
   400  				sharedDomains = []ccv2.Domain{
   401  					{Name: "domain-1", GUID: "shared-domain-1"},
   402  				}
   403  				fakeCloudControllerClient.GetSharedDomainsReturns(sharedDomains, ccv2.Warnings{"shared-warning-1", "shared-warning-2"}, nil)
   404  			})
   405  
   406  			When("looking up the private domains is successful", func() {
   407  				var privateDomains []ccv2.Domain
   408  
   409  				BeforeEach(func() {
   410  					privateDomains = []ccv2.Domain{
   411  						{Name: "domain-2", GUID: "private-domain-2"},
   412  						{Name: "domain-3", GUID: "private-domain-3"},
   413  					}
   414  					fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(privateDomains, ccv2.Warnings{"private-warning-1", "private-warning-2"}, nil)
   415  				})
   416  
   417  				It("returns the domains and warnings", func() {
   418  					Expect(executeErr).ToNot(HaveOccurred())
   419  					Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2", "private-warning-1", "private-warning-2"))
   420  					Expect(domains).To(ConsistOf(
   421  						Domain{Name: "domain-1", GUID: "shared-domain-1"},
   422  						Domain{Name: "domain-2", GUID: "private-domain-2"},
   423  						Domain{Name: "domain-3", GUID: "private-domain-3"},
   424  					))
   425  
   426  					Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(1))
   427  					Expect(fakeCloudControllerClient.GetSharedDomainsArgsForCall(0)).To(ConsistOf(ccv2.Filter{
   428  						Type:     constant.NameFilter,
   429  						Operator: constant.InOperator,
   430  						Values:   domainNames,
   431  					}))
   432  
   433  					Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(1))
   434  					passedOrgGUID, filters := fakeCloudControllerClient.GetOrganizationPrivateDomainsArgsForCall(0)
   435  					Expect(filters).To(ConsistOf(ccv2.Filter{
   436  						Type:     constant.NameFilter,
   437  						Operator: constant.InOperator,
   438  						Values:   domainNames,
   439  					}))
   440  					Expect(passedOrgGUID).To(Equal(orgGUID))
   441  				})
   442  			})
   443  
   444  			When("looking up the private domains errors", func() {
   445  				var expectedErr error
   446  
   447  				BeforeEach(func() {
   448  					expectedErr = errors.New("foobar")
   449  					fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(nil, ccv2.Warnings{"private-warning-1", "private-warning-2"}, expectedErr)
   450  				})
   451  
   452  				It("returns errors and warnings", func() {
   453  					Expect(executeErr).To(MatchError(expectedErr))
   454  					Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2", "private-warning-1", "private-warning-2"))
   455  				})
   456  			})
   457  		})
   458  
   459  		When("no domains are provided", func() {
   460  			BeforeEach(func() {
   461  				domainNames = nil
   462  			})
   463  
   464  			It("immediately returns", func() {
   465  				Expect(executeErr).ToNot(HaveOccurred())
   466  				Expect(warnings).To(BeEmpty())
   467  				Expect(domains).To(BeEmpty())
   468  
   469  				Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(0))
   470  				Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(0))
   471  			})
   472  		})
   473  
   474  		When("looking up the shared domains errors", func() {
   475  			var expectedErr error
   476  
   477  			BeforeEach(func() {
   478  				expectedErr = errors.New("foobar")
   479  				fakeCloudControllerClient.GetSharedDomainsReturns(nil, ccv2.Warnings{"shared-warning-1", "shared-warning-2"}, expectedErr)
   480  			})
   481  
   482  			It("returns errors and warnings", func() {
   483  				Expect(executeErr).To(MatchError(expectedErr))
   484  				Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2"))
   485  			})
   486  		})
   487  	})
   488  
   489  	Describe("GetSharedDomain", func() {
   490  		When("the shared domain exists", func() {
   491  			var expectedDomain ccv2.Domain
   492  
   493  			BeforeEach(func() {
   494  				expectedDomain = ccv2.Domain{
   495  					GUID: "shared-domain-guid",
   496  					Name: "shared-domain",
   497  				}
   498  				fakeCloudControllerClient.GetSharedDomainReturns(expectedDomain, ccv2.Warnings{"shared domain warning"}, nil)
   499  			})
   500  
   501  			It("returns the shared domain and all warnings", func() {
   502  				domain, warnings, err := actor.GetSharedDomain("shared-domain-guid")
   503  				Expect(err).NotTo(HaveOccurred())
   504  				Expect(domain).To(Equal(Domain(expectedDomain)))
   505  				Expect(warnings).To(ConsistOf("shared domain warning"))
   506  
   507  				Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   508  				Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("shared-domain-guid"))
   509  			})
   510  
   511  			When("the domain has been looked up multiple times", func() {
   512  				It("caches the domain", func() {
   513  					domain, warnings, err := actor.GetSharedDomain("shared-domain-guid")
   514  					Expect(err).NotTo(HaveOccurred())
   515  					Expect(domain).To(Equal(Domain(expectedDomain)))
   516  					Expect(warnings).To(ConsistOf("shared domain warning"))
   517  
   518  					domain, warnings, err = actor.GetSharedDomain("shared-domain-guid")
   519  					Expect(err).NotTo(HaveOccurred())
   520  					Expect(domain).To(Equal(Domain(expectedDomain)))
   521  					Expect(warnings).To(BeEmpty())
   522  
   523  					Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1))
   524  				})
   525  			})
   526  		})
   527  
   528  		When("the API returns a not found error", func() {
   529  			var expectedErr actionerror.DomainNotFoundError
   530  
   531  			BeforeEach(func() {
   532  				expectedErr = actionerror.DomainNotFoundError{GUID: "shared-domain-guid"}
   533  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"shared domain warning"}, ccerror.ResourceNotFoundError{})
   534  			})
   535  
   536  			It("returns a DomainNotFoundError and all warnings", func() {
   537  				domain, warnings, err := actor.GetSharedDomain("shared-domain-guid")
   538  				Expect(err).To(MatchError(expectedErr))
   539  				Expect(domain).To(Equal(Domain{}))
   540  				Expect(warnings).To(ConsistOf("shared domain warning"))
   541  			})
   542  		})
   543  
   544  		When("the API returns any other error", func() {
   545  			var expectedErr error
   546  
   547  			BeforeEach(func() {
   548  				expectedErr = errors.New("shared domain error")
   549  				fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"shared domain warning"}, expectedErr)
   550  			})
   551  
   552  			It("returns the same error and all warnings", func() {
   553  				domain, warnings, err := actor.GetSharedDomain("shared-domain-guid")
   554  				Expect(err).To(MatchError(expectedErr))
   555  				Expect(domain).To(Equal(Domain{}))
   556  				Expect(warnings).To(ConsistOf("shared domain warning"))
   557  			})
   558  		})
   559  	})
   560  
   561  	Describe("GetPrivateDomain", func() {
   562  		When("the private domain exists", func() {
   563  			var expectedDomain ccv2.Domain
   564  
   565  			BeforeEach(func() {
   566  				expectedDomain = ccv2.Domain{
   567  					GUID: "private-domain-guid",
   568  					Name: "private-domain",
   569  				}
   570  				fakeCloudControllerClient.GetPrivateDomainReturns(expectedDomain, ccv2.Warnings{"private domain warning"}, nil)
   571  			})
   572  
   573  			It("returns the private domain and all warnings", func() {
   574  				domain, warnings, err := actor.GetPrivateDomain("private-domain-guid")
   575  				Expect(err).NotTo(HaveOccurred())
   576  				Expect(domain).To(Equal(Domain(expectedDomain)))
   577  				Expect(warnings).To(ConsistOf("private domain warning"))
   578  
   579  				Expect(fakeCloudControllerClient.GetPrivateDomainCallCount()).To(Equal(1))
   580  				Expect(fakeCloudControllerClient.GetPrivateDomainArgsForCall(0)).To(Equal("private-domain-guid"))
   581  			})
   582  
   583  			When("the domain has been looked up multiple times", func() {
   584  				It("caches the domain", func() {
   585  					domain, warnings, err := actor.GetPrivateDomain("private-domain-guid")
   586  					Expect(err).NotTo(HaveOccurred())
   587  					Expect(domain).To(Equal(Domain(expectedDomain)))
   588  					Expect(warnings).To(ConsistOf("private domain warning"))
   589  
   590  					domain, warnings, err = actor.GetPrivateDomain("private-domain-guid")
   591  					Expect(err).NotTo(HaveOccurred())
   592  					Expect(domain).To(Equal(Domain(expectedDomain)))
   593  					Expect(warnings).To(BeEmpty())
   594  
   595  					Expect(fakeCloudControllerClient.GetPrivateDomainCallCount()).To(Equal(1))
   596  				})
   597  			})
   598  		})
   599  
   600  		When("the API returns a not found error", func() {
   601  			var expectedErr actionerror.DomainNotFoundError
   602  
   603  			BeforeEach(func() {
   604  				expectedErr = actionerror.DomainNotFoundError{GUID: "private-domain-guid"}
   605  				fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, ccv2.Warnings{"private domain warning"}, ccerror.ResourceNotFoundError{})
   606  			})
   607  
   608  			It("returns a DomainNotFoundError and all warnings", func() {
   609  				domain, warnings, err := actor.GetPrivateDomain("private-domain-guid")
   610  				Expect(err).To(MatchError(expectedErr))
   611  				Expect(domain).To(Equal(Domain{}))
   612  				Expect(warnings).To(ConsistOf("private domain warning"))
   613  			})
   614  		})
   615  
   616  		When("the API returns any other error", func() {
   617  			var expectedErr error
   618  
   619  			BeforeEach(func() {
   620  				expectedErr = errors.New("private domain error")
   621  				fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, ccv2.Warnings{"private domain warning"}, expectedErr)
   622  			})
   623  
   624  			It("returns the same error and all warnings", func() {
   625  				domain, warnings, err := actor.GetPrivateDomain("private-domain-guid")
   626  				Expect(err).To(MatchError(expectedErr))
   627  				Expect(domain).To(Equal(Domain{}))
   628  				Expect(warnings).To(ConsistOf("private domain warning"))
   629  			})
   630  		})
   631  	})
   632  
   633  	Describe("GetOrganizationDomains", func() {
   634  		When("the organization has both shared and private domains", func() {
   635  			BeforeEach(func() {
   636  				sharedDomain := ccv2.Domain{
   637  					Name: "some-shared-domain",
   638  				}
   639  				privateDomain := ccv2.Domain{
   640  					Name: "some-private-domain",
   641  				}
   642  				otherPrivateDomain := ccv2.Domain{
   643  					Name: "some-other-private-domain",
   644  				}
   645  
   646  				fakeCloudControllerClient.GetSharedDomainsReturns([]ccv2.Domain{sharedDomain}, ccv2.Warnings{"shared domains warning"}, nil)
   647  				fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns([]ccv2.Domain{privateDomain, otherPrivateDomain}, ccv2.Warnings{"private domains warning"}, nil)
   648  			})
   649  
   650  			It("returns a concatenated slice with private then shared domains", func() {
   651  				domains, warnings, err := actor.GetOrganizationDomains("some-org-guid")
   652  				Expect(err).NotTo(HaveOccurred())
   653  				Expect(domains).To(Equal([]Domain{
   654  					{Name: "some-shared-domain"},
   655  					{Name: "some-private-domain"},
   656  					{Name: "some-other-private-domain"},
   657  				}))
   658  				Expect(warnings).To(ConsistOf("shared domains warning", "private domains warning"))
   659  
   660  				Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(1))
   661  
   662  				Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(1))
   663  				orgGUID, filters := fakeCloudControllerClient.GetOrganizationPrivateDomainsArgsForCall(0)
   664  				Expect(orgGUID).To(Equal("some-org-guid"))
   665  				Expect(filters).To(BeEmpty())
   666  			})
   667  		})
   668  
   669  		When("get shared domains returns an error", func() {
   670  			var expectedErr error
   671  
   672  			BeforeEach(func() {
   673  				expectedErr = errors.New("shared domains error")
   674  				fakeCloudControllerClient.GetSharedDomainsReturns([]ccv2.Domain{}, ccv2.Warnings{"shared domains warning"}, expectedErr)
   675  			})
   676  
   677  			It("returns that error", func() {
   678  				domains, warnings, err := actor.GetOrganizationDomains("some-org-guid")
   679  				Expect(err).To(MatchError(expectedErr))
   680  				Expect(domains).To(Equal([]Domain{}))
   681  				Expect(warnings).To(ConsistOf("shared domains warning"))
   682  			})
   683  		})
   684  
   685  		When("get organization private domains returns an error", func() {
   686  			var expectedErr error
   687  
   688  			BeforeEach(func() {
   689  				expectedErr = errors.New("private domains error")
   690  				fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns([]ccv2.Domain{}, ccv2.Warnings{"private domains warning"}, expectedErr)
   691  			})
   692  
   693  			It("returns that error", func() {
   694  				domains, warnings, err := actor.GetOrganizationDomains("some-org-guid")
   695  				Expect(err).To(MatchError(expectedErr))
   696  				Expect(domains).To(Equal([]Domain{}))
   697  				Expect(warnings).To(ConsistOf("private domains warning"))
   698  			})
   699  		})
   700  	})
   701  })