github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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 Context("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(Equal(Warnings{"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 Context("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 Context("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("GetDomainsByNameAndOrganization", func() { 275 var ( 276 domainNames []string 277 orgGUID string 278 279 domains []Domain 280 warnings Warnings 281 executeErr error 282 ) 283 284 BeforeEach(func() { 285 domainNames = []string{"domain-1", "domain-2", "domain-3"} 286 orgGUID = "some-org-guid" 287 }) 288 289 JustBeforeEach(func() { 290 domains, warnings, executeErr = actor.GetDomainsByNameAndOrganization(domainNames, orgGUID) 291 }) 292 293 Context("when looking up the shared domains is successful", func() { 294 var sharedDomains []ccv2.Domain 295 296 BeforeEach(func() { 297 sharedDomains = []ccv2.Domain{ 298 {Name: "domain-1", GUID: "shared-domain-1"}, 299 } 300 fakeCloudControllerClient.GetSharedDomainsReturns(sharedDomains, ccv2.Warnings{"shared-warning-1", "shared-warning-2"}, nil) 301 }) 302 303 Context("when looking up the private domains is successful", func() { 304 var privateDomains []ccv2.Domain 305 306 BeforeEach(func() { 307 privateDomains = []ccv2.Domain{ 308 {Name: "domain-2", GUID: "private-domain-2"}, 309 {Name: "domain-3", GUID: "private-domain-3"}, 310 } 311 fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(privateDomains, ccv2.Warnings{"private-warning-1", "private-warning-2"}, nil) 312 }) 313 314 It("returns the domains and warnings", func() { 315 Expect(executeErr).ToNot(HaveOccurred()) 316 Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2", "private-warning-1", "private-warning-2")) 317 Expect(domains).To(ConsistOf( 318 Domain{Name: "domain-1", GUID: "shared-domain-1"}, 319 Domain{Name: "domain-2", GUID: "private-domain-2"}, 320 Domain{Name: "domain-3", GUID: "private-domain-3"}, 321 )) 322 323 Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(1)) 324 Expect(fakeCloudControllerClient.GetSharedDomainsArgsForCall(0)).To(ConsistOf(ccv2.Filter{ 325 Type: constant.NameFilter, 326 Operator: constant.InOperator, 327 Values: domainNames, 328 })) 329 330 Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(1)) 331 passedOrgGUID, filters := fakeCloudControllerClient.GetOrganizationPrivateDomainsArgsForCall(0) 332 Expect(filters).To(ConsistOf(ccv2.Filter{ 333 Type: constant.NameFilter, 334 Operator: constant.InOperator, 335 Values: domainNames, 336 })) 337 Expect(passedOrgGUID).To(Equal(orgGUID)) 338 }) 339 }) 340 341 Context("when looking up the private domains errors", func() { 342 var expectedErr error 343 344 BeforeEach(func() { 345 expectedErr = errors.New("foobar") 346 fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns(nil, ccv2.Warnings{"private-warning-1", "private-warning-2"}, expectedErr) 347 }) 348 349 It("returns errors and warnings", func() { 350 Expect(executeErr).To(MatchError(expectedErr)) 351 Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2", "private-warning-1", "private-warning-2")) 352 }) 353 }) 354 }) 355 356 Context("when no domains are provided", func() { 357 BeforeEach(func() { 358 domainNames = nil 359 }) 360 361 It("immediately returns", func() { 362 Expect(executeErr).ToNot(HaveOccurred()) 363 Expect(warnings).To(BeEmpty()) 364 Expect(domains).To(BeEmpty()) 365 366 Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(0)) 367 Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(0)) 368 }) 369 }) 370 371 Context("when looking up the shared domains errors", func() { 372 var expectedErr error 373 374 BeforeEach(func() { 375 expectedErr = errors.New("foobar") 376 fakeCloudControllerClient.GetSharedDomainsReturns(nil, ccv2.Warnings{"shared-warning-1", "shared-warning-2"}, expectedErr) 377 }) 378 379 It("returns errors and warnings", func() { 380 Expect(executeErr).To(MatchError(expectedErr)) 381 Expect(warnings).To(ConsistOf("shared-warning-1", "shared-warning-2")) 382 }) 383 }) 384 }) 385 386 Describe("GetSharedDomain", func() { 387 Context("when the shared domain exists", func() { 388 var expectedDomain ccv2.Domain 389 390 BeforeEach(func() { 391 expectedDomain = ccv2.Domain{ 392 GUID: "shared-domain-guid", 393 Name: "shared-domain", 394 } 395 fakeCloudControllerClient.GetSharedDomainReturns(expectedDomain, ccv2.Warnings{"shared domain warning"}, nil) 396 }) 397 398 It("returns the shared domain and all warnings", func() { 399 domain, warnings, err := actor.GetSharedDomain("shared-domain-guid") 400 Expect(err).NotTo(HaveOccurred()) 401 Expect(domain).To(Equal(Domain(expectedDomain))) 402 Expect(warnings).To(ConsistOf("shared domain warning")) 403 404 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1)) 405 Expect(fakeCloudControllerClient.GetSharedDomainArgsForCall(0)).To(Equal("shared-domain-guid")) 406 }) 407 408 Context("when the domain has been looked up multiple times", func() { 409 It("caches the domain", func() { 410 domain, warnings, err := actor.GetSharedDomain("shared-domain-guid") 411 Expect(err).NotTo(HaveOccurred()) 412 Expect(domain).To(Equal(Domain(expectedDomain))) 413 Expect(warnings).To(ConsistOf("shared domain warning")) 414 415 domain, warnings, err = actor.GetSharedDomain("shared-domain-guid") 416 Expect(err).NotTo(HaveOccurred()) 417 Expect(domain).To(Equal(Domain(expectedDomain))) 418 Expect(warnings).To(BeEmpty()) 419 420 Expect(fakeCloudControllerClient.GetSharedDomainCallCount()).To(Equal(1)) 421 }) 422 }) 423 }) 424 425 Context("when the API returns a not found error", func() { 426 var expectedErr actionerror.DomainNotFoundError 427 428 BeforeEach(func() { 429 expectedErr = actionerror.DomainNotFoundError{GUID: "shared-domain-guid"} 430 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"shared domain warning"}, ccerror.ResourceNotFoundError{}) 431 }) 432 433 It("returns a DomainNotFoundError and all warnings", func() { 434 domain, warnings, err := actor.GetSharedDomain("shared-domain-guid") 435 Expect(err).To(MatchError(expectedErr)) 436 Expect(domain).To(Equal(Domain{})) 437 Expect(warnings).To(ConsistOf("shared domain warning")) 438 }) 439 }) 440 441 Context("when the API returns any other error", func() { 442 var expectedErr error 443 444 BeforeEach(func() { 445 expectedErr = errors.New("shared domain error") 446 fakeCloudControllerClient.GetSharedDomainReturns(ccv2.Domain{}, ccv2.Warnings{"shared domain warning"}, expectedErr) 447 }) 448 449 It("returns the same error and all warnings", func() { 450 domain, warnings, err := actor.GetSharedDomain("shared-domain-guid") 451 Expect(err).To(MatchError(expectedErr)) 452 Expect(domain).To(Equal(Domain{})) 453 Expect(warnings).To(ConsistOf("shared domain warning")) 454 }) 455 }) 456 }) 457 458 Describe("GetPrivateDomain", func() { 459 Context("when the private domain exists", func() { 460 var expectedDomain ccv2.Domain 461 462 BeforeEach(func() { 463 expectedDomain = ccv2.Domain{ 464 GUID: "private-domain-guid", 465 Name: "private-domain", 466 } 467 fakeCloudControllerClient.GetPrivateDomainReturns(expectedDomain, ccv2.Warnings{"private domain warning"}, nil) 468 }) 469 470 It("returns the private domain and all warnings", func() { 471 domain, warnings, err := actor.GetPrivateDomain("private-domain-guid") 472 Expect(err).NotTo(HaveOccurred()) 473 Expect(domain).To(Equal(Domain(expectedDomain))) 474 Expect(warnings).To(ConsistOf("private domain warning")) 475 476 Expect(fakeCloudControllerClient.GetPrivateDomainCallCount()).To(Equal(1)) 477 Expect(fakeCloudControllerClient.GetPrivateDomainArgsForCall(0)).To(Equal("private-domain-guid")) 478 }) 479 480 Context("when the domain has been looked up multiple times", func() { 481 It("caches the domain", func() { 482 domain, warnings, err := actor.GetPrivateDomain("private-domain-guid") 483 Expect(err).NotTo(HaveOccurred()) 484 Expect(domain).To(Equal(Domain(expectedDomain))) 485 Expect(warnings).To(ConsistOf("private domain warning")) 486 487 domain, warnings, err = actor.GetPrivateDomain("private-domain-guid") 488 Expect(err).NotTo(HaveOccurred()) 489 Expect(domain).To(Equal(Domain(expectedDomain))) 490 Expect(warnings).To(BeEmpty()) 491 492 Expect(fakeCloudControllerClient.GetPrivateDomainCallCount()).To(Equal(1)) 493 }) 494 }) 495 }) 496 497 Context("when the API returns a not found error", func() { 498 var expectedErr actionerror.DomainNotFoundError 499 500 BeforeEach(func() { 501 expectedErr = actionerror.DomainNotFoundError{GUID: "private-domain-guid"} 502 fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, ccv2.Warnings{"private domain warning"}, ccerror.ResourceNotFoundError{}) 503 }) 504 505 It("returns a DomainNotFoundError and all warnings", func() { 506 domain, warnings, err := actor.GetPrivateDomain("private-domain-guid") 507 Expect(err).To(MatchError(expectedErr)) 508 Expect(domain).To(Equal(Domain{})) 509 Expect(warnings).To(ConsistOf("private domain warning")) 510 }) 511 }) 512 513 Context("when the API returns any other error", func() { 514 var expectedErr error 515 516 BeforeEach(func() { 517 expectedErr = errors.New("private domain error") 518 fakeCloudControllerClient.GetPrivateDomainReturns(ccv2.Domain{}, ccv2.Warnings{"private domain warning"}, expectedErr) 519 }) 520 521 It("returns the same error and all warnings", func() { 522 domain, warnings, err := actor.GetPrivateDomain("private-domain-guid") 523 Expect(err).To(MatchError(expectedErr)) 524 Expect(domain).To(Equal(Domain{})) 525 Expect(warnings).To(ConsistOf("private domain warning")) 526 }) 527 }) 528 }) 529 530 Describe("GetOrganizationDomains", func() { 531 Context("when the organization has both shared and private domains", func() { 532 BeforeEach(func() { 533 sharedDomain := ccv2.Domain{ 534 Name: "some-shared-domain", 535 } 536 privateDomain := ccv2.Domain{ 537 Name: "some-private-domain", 538 } 539 otherPrivateDomain := ccv2.Domain{ 540 Name: "some-other-private-domain", 541 } 542 543 fakeCloudControllerClient.GetSharedDomainsReturns([]ccv2.Domain{sharedDomain}, ccv2.Warnings{"shared domains warning"}, nil) 544 fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns([]ccv2.Domain{privateDomain, otherPrivateDomain}, ccv2.Warnings{"private domains warning"}, nil) 545 }) 546 547 It("returns a concatenated slice with private then shared domains", func() { 548 domains, warnings, err := actor.GetOrganizationDomains("some-org-guid") 549 Expect(err).NotTo(HaveOccurred()) 550 Expect(domains).To(Equal([]Domain{ 551 {Name: "some-shared-domain"}, 552 {Name: "some-private-domain"}, 553 {Name: "some-other-private-domain"}, 554 })) 555 Expect(warnings).To(ConsistOf("shared domains warning", "private domains warning")) 556 557 Expect(fakeCloudControllerClient.GetSharedDomainsCallCount()).To(Equal(1)) 558 559 Expect(fakeCloudControllerClient.GetOrganizationPrivateDomainsCallCount()).To(Equal(1)) 560 orgGUID, filters := fakeCloudControllerClient.GetOrganizationPrivateDomainsArgsForCall(0) 561 Expect(orgGUID).To(Equal("some-org-guid")) 562 Expect(filters).To(BeEmpty()) 563 }) 564 }) 565 566 Context("when get shared domains returns an error", func() { 567 var expectedErr error 568 569 BeforeEach(func() { 570 expectedErr = errors.New("shared domains error") 571 fakeCloudControllerClient.GetSharedDomainsReturns([]ccv2.Domain{}, ccv2.Warnings{"shared domains warning"}, expectedErr) 572 }) 573 574 It("returns that error", func() { 575 domains, warnings, err := actor.GetOrganizationDomains("some-org-guid") 576 Expect(err).To(MatchError(expectedErr)) 577 Expect(domains).To(Equal([]Domain{})) 578 Expect(warnings).To(ConsistOf("shared domains warning")) 579 }) 580 }) 581 582 Context("when get organization private domains returns an error", func() { 583 var expectedErr error 584 585 BeforeEach(func() { 586 expectedErr = errors.New("private domains error") 587 fakeCloudControllerClient.GetOrganizationPrivateDomainsReturns([]ccv2.Domain{}, ccv2.Warnings{"private domains warning"}, expectedErr) 588 }) 589 590 It("returns that error", func() { 591 domains, warnings, err := actor.GetOrganizationDomains("some-org-guid") 592 Expect(err).To(MatchError(expectedErr)) 593 Expect(domains).To(Equal([]Domain{})) 594 Expect(warnings).To(ConsistOf("private domains warning")) 595 }) 596 }) 597 }) 598 })