github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/actors/service_builder/service_builder_test.go (about)

     1  package service_builder_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	plan_builder_fakes "github.com/cloudfoundry/cli/cf/actors/plan_builder/fakes"
     7  	"github.com/cloudfoundry/cli/cf/actors/service_builder"
     8  	testapi "github.com/cloudfoundry/cli/cf/api/fakes"
     9  
    10  	"github.com/cloudfoundry/cli/cf/models"
    11  
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Service Builder", func() {
    17  	var (
    18  		planBuilder     *plan_builder_fakes.FakePlanBuilder
    19  		serviceBuilder  service_builder.ServiceBuilder
    20  		serviceRepo     *testapi.FakeServiceRepo
    21  		service1        models.ServiceOffering
    22  		service2        models.ServiceOffering
    23  		v1Service       models.ServiceOffering
    24  		planWithoutOrgs models.ServicePlanFields
    25  		plan1           models.ServicePlanFields
    26  		plan2           models.ServicePlanFields
    27  		plan3           models.ServicePlanFields
    28  	)
    29  
    30  	BeforeEach(func() {
    31  		serviceRepo = &testapi.FakeServiceRepo{}
    32  		planBuilder = &plan_builder_fakes.FakePlanBuilder{}
    33  
    34  		serviceBuilder = service_builder.NewBuilder(serviceRepo, planBuilder)
    35  		service1 = models.ServiceOffering{
    36  			ServiceOfferingFields: models.ServiceOfferingFields{
    37  				Label:      "my-service1",
    38  				Guid:       "service-guid1",
    39  				BrokerGuid: "my-service-broker-guid1",
    40  			},
    41  		}
    42  
    43  		service2 = models.ServiceOffering{
    44  			ServiceOfferingFields: models.ServiceOfferingFields{
    45  				Label:      "my-service2",
    46  				Guid:       "service-guid2",
    47  				BrokerGuid: "my-service-broker-guid2",
    48  			},
    49  		}
    50  
    51  		v1Service = models.ServiceOffering{
    52  			ServiceOfferingFields: models.ServiceOfferingFields{
    53  				Label:      "v1Service",
    54  				Guid:       "v1Service-guid",
    55  				BrokerGuid: "my-service-broker-guid1",
    56  				Provider:   "IAmV1",
    57  			},
    58  		}
    59  
    60  		serviceRepo.FindServiceOfferingsByLabelName = "my-service1"
    61  		serviceRepo.FindServiceOfferingsByLabelServiceOfferings =
    62  			models.ServiceOfferings([]models.ServiceOffering{service1, v1Service})
    63  
    64  		serviceRepo.GetServiceOfferingByGuidReturns = struct {
    65  			ServiceOffering models.ServiceOffering
    66  			Error           error
    67  		}{
    68  			service1,
    69  			nil,
    70  		}
    71  
    72  		serviceRepo.ListServicesFromBrokerReturns = map[string][]models.ServiceOffering{
    73  			"my-service-broker-guid1": []models.ServiceOffering{service1},
    74  		}
    75  
    76  		serviceRepo.ListServicesFromManyBrokersReturns = map[string][]models.ServiceOffering{
    77  			"my-service-broker-guid1,my-service-broker-guid2": []models.ServiceOffering{service1, service2},
    78  		}
    79  
    80  		plan1 = models.ServicePlanFields{
    81  			Name:                "service-plan1",
    82  			Guid:                "service-plan1-guid",
    83  			ServiceOfferingGuid: "service-guid1",
    84  			OrgNames:            []string{"org1", "org2"},
    85  		}
    86  
    87  		plan2 = models.ServicePlanFields{
    88  			Name:                "service-plan2",
    89  			Guid:                "service-plan2-guid",
    90  			ServiceOfferingGuid: "service-guid1",
    91  		}
    92  
    93  		plan3 = models.ServicePlanFields{
    94  			Name:                "service-plan3",
    95  			Guid:                "service-plan3-guid",
    96  			ServiceOfferingGuid: "service-guid2",
    97  		}
    98  
    99  		planWithoutOrgs = models.ServicePlanFields{
   100  			Name:                "service-plan-without-orgs",
   101  			Guid:                "service-plan-without-orgs-guid",
   102  			ServiceOfferingGuid: "service-guid1",
   103  		}
   104  
   105  		planBuilder.GetPlansVisibleToOrgReturns([]models.ServicePlanFields{plan1, plan2}, nil)
   106  		planBuilder.GetPlansForServiceWithOrgsReturns([]models.ServicePlanFields{plan1, plan2}, nil)
   107  		planBuilder.GetPlansForManyServicesWithOrgsReturns([]models.ServicePlanFields{plan1, plan2, plan3}, nil)
   108  		planBuilder.GetPlansForServiceForOrgReturns([]models.ServicePlanFields{plan1, plan2}, nil)
   109  	})
   110  
   111  	Describe(".GetServicesForSpace", func() {
   112  		BeforeEach(func() {
   113  			serviceRepo.GetServiceOfferingsForSpaceReturns = struct {
   114  				ServiceOfferings []models.ServiceOffering
   115  				Error            error
   116  			}{
   117  				[]models.ServiceOffering{service1, service1},
   118  				nil,
   119  			}
   120  		})
   121  
   122  		It("returns the services for the space", func() {
   123  			services, err := serviceBuilder.GetServicesForSpace("spaceGuid")
   124  			Expect(err).NotTo(HaveOccurred())
   125  
   126  			Expect(len(services)).To(Equal(2))
   127  		})
   128  	})
   129  
   130  	Describe(".GetServicesForSpaceWithPlans", func() {
   131  		BeforeEach(func() {
   132  			serviceRepo.GetServiceOfferingsForSpaceReturns = struct {
   133  				ServiceOfferings []models.ServiceOffering
   134  				Error            error
   135  			}{
   136  				[]models.ServiceOffering{service1, service1},
   137  				nil,
   138  			}
   139  
   140  			planBuilder.GetPlansForServiceReturns([]models.ServicePlanFields{planWithoutOrgs}, nil)
   141  		})
   142  
   143  		It("returns the services for the space, populated with plans", func() {
   144  			services, err := serviceBuilder.GetServicesForSpaceWithPlans("spaceGuid")
   145  			Expect(err).NotTo(HaveOccurred())
   146  
   147  			Expect(len(services)).To(Equal(2))
   148  			Expect(services[0].Plans[0]).To(Equal(planWithoutOrgs))
   149  			Expect(services[1].Plans[0]).To(Equal(planWithoutOrgs))
   150  		})
   151  	})
   152  
   153  	Describe(".GetAllServices", func() {
   154  		BeforeEach(func() {
   155  			serviceRepo.GetAllServiceOfferingsReturns = struct {
   156  				ServiceOfferings []models.ServiceOffering
   157  				Error            error
   158  			}{
   159  				[]models.ServiceOffering{service1, service1},
   160  				nil,
   161  			}
   162  		})
   163  
   164  		It("returns the named service, populated with plans", func() {
   165  			services, err := serviceBuilder.GetAllServices()
   166  			Expect(err).NotTo(HaveOccurred())
   167  
   168  			Expect(len(services)).To(Equal(2))
   169  		})
   170  	})
   171  
   172  	Describe(".GetAllServicesWithPlans", func() {
   173  		BeforeEach(func() {
   174  			serviceRepo.GetAllServiceOfferingsReturns = struct {
   175  				ServiceOfferings []models.ServiceOffering
   176  				Error            error
   177  			}{
   178  				[]models.ServiceOffering{service1, service1},
   179  				nil,
   180  			}
   181  
   182  			planBuilder.GetPlansForServiceReturns([]models.ServicePlanFields{plan1}, nil)
   183  		})
   184  
   185  		It("returns the named service, populated with plans", func() {
   186  			services, err := serviceBuilder.GetAllServicesWithPlans()
   187  			Expect(err).NotTo(HaveOccurred())
   188  
   189  			Expect(len(services)).To(Equal(2))
   190  			Expect(services[0].Plans[0]).To(Equal(plan1))
   191  		})
   192  	})
   193  
   194  	Describe(".GetServiceByNameWithPlans", func() {
   195  		BeforeEach(func() {
   196  			planBuilder.GetPlansForServiceReturns([]models.ServicePlanFields{plan2}, nil)
   197  		})
   198  
   199  		It("returns the named service, populated with plans", func() {
   200  			service, err := serviceBuilder.GetServiceByNameWithPlans("my-service1")
   201  			Expect(err).NotTo(HaveOccurred())
   202  
   203  			Expect(len(service.Plans)).To(Equal(1))
   204  			Expect(service.Plans[0].Name).To(Equal("service-plan2"))
   205  			Expect(service.Plans[0].OrgNames).To(BeNil())
   206  		})
   207  	})
   208  
   209  	Describe(".GetServiceByNameWithPlansWithOrgNames", func() {
   210  		It("returns the named service, populated with plans", func() {
   211  			service, err := serviceBuilder.GetServiceByNameWithPlansWithOrgNames("my-service1")
   212  			Expect(err).NotTo(HaveOccurred())
   213  
   214  			Expect(len(service.Plans)).To(Equal(2))
   215  			Expect(service.Plans[0].Name).To(Equal("service-plan1"))
   216  			Expect(service.Plans[1].Name).To(Equal("service-plan2"))
   217  			Expect(service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   218  		})
   219  	})
   220  
   221  	Describe(".GetServiceByNameForSpace", func() {
   222  		Context("mixed v2 and v1 services", func() {
   223  			BeforeEach(func() {
   224  				service2 := models.ServiceOffering{
   225  					ServiceOfferingFields: models.ServiceOfferingFields{
   226  						Label: "service",
   227  						Guid:  "service-guid-v2",
   228  					},
   229  				}
   230  
   231  				service1 := models.ServiceOffering{
   232  					ServiceOfferingFields: models.ServiceOfferingFields{
   233  						Label:    "service",
   234  						Guid:     "service-guid",
   235  						Provider: "a provider",
   236  					},
   237  				}
   238  
   239  				serviceRepo.FindServiceOfferingsForSpaceByLabelReturns = struct {
   240  					ServiceOfferings models.ServiceOfferings
   241  					Error            error
   242  				}{
   243  					models.ServiceOfferings([]models.ServiceOffering{
   244  						service1, service2}),
   245  					nil,
   246  				}
   247  			})
   248  
   249  			It("returns the nv2 service", func() {
   250  				service, err := serviceBuilder.GetServiceByNameForSpace("service", "spaceGuid")
   251  				Expect(err).NotTo(HaveOccurred())
   252  
   253  				Expect(len(service.Plans)).To(Equal(0))
   254  				Expect(service.Guid).To(Equal("service-guid-v2"))
   255  			})
   256  		})
   257  
   258  		Context("v2 services", func() {
   259  			BeforeEach(func() {
   260  				service := models.ServiceOffering{
   261  					ServiceOfferingFields: models.ServiceOfferingFields{
   262  						Label: "service",
   263  						Guid:  "service-guid",
   264  					},
   265  				}
   266  
   267  				serviceRepo.FindServiceOfferingsForSpaceByLabelReturns = struct {
   268  					ServiceOfferings models.ServiceOfferings
   269  					Error            error
   270  				}{
   271  					models.ServiceOfferings([]models.ServiceOffering{
   272  						service}),
   273  					nil,
   274  				}
   275  			})
   276  
   277  			It("returns the named service", func() {
   278  				service, err := serviceBuilder.GetServiceByNameForSpace("service", "spaceGuid")
   279  				Expect(err).NotTo(HaveOccurred())
   280  
   281  				Expect(len(service.Plans)).To(Equal(0))
   282  				Expect(service.Guid).To(Equal("service-guid"))
   283  			})
   284  		})
   285  
   286  		Context("v1 services", func() {
   287  			BeforeEach(func() {
   288  				service := models.ServiceOffering{
   289  					ServiceOfferingFields: models.ServiceOfferingFields{
   290  						Label:    "service",
   291  						Guid:     "service-guid",
   292  						Provider: "a provider",
   293  					},
   294  				}
   295  
   296  				serviceRepo.FindServiceOfferingsForSpaceByLabelReturns = struct {
   297  					ServiceOfferings models.ServiceOfferings
   298  					Error            error
   299  				}{
   300  					models.ServiceOfferings([]models.ServiceOffering{
   301  						service}),
   302  					nil,
   303  				}
   304  			})
   305  
   306  			It("returns the an error", func() {
   307  				service, err := serviceBuilder.GetServiceByNameForSpace("service", "spaceGuid")
   308  				Expect(service).To(Equal(models.ServiceOffering{}))
   309  				Expect(err).To(HaveOccurred())
   310  			})
   311  		})
   312  	})
   313  
   314  	Describe(".GetServiceByNameForSpaceWithPlans", func() {
   315  		BeforeEach(func() {
   316  			service := models.ServiceOffering{
   317  				ServiceOfferingFields: models.ServiceOfferingFields{
   318  					Label: "serviceWithPlans",
   319  				},
   320  			}
   321  
   322  			serviceRepo.FindServiceOfferingsForSpaceByLabelReturns = struct {
   323  				ServiceOfferings models.ServiceOfferings
   324  				Error            error
   325  			}{
   326  				models.ServiceOfferings([]models.ServiceOffering{service}),
   327  				nil,
   328  			}
   329  
   330  			planBuilder.GetPlansForServiceReturns([]models.ServicePlanFields{planWithoutOrgs}, nil)
   331  		})
   332  
   333  		It("returns the named service", func() {
   334  			service, err := serviceBuilder.GetServiceByNameForSpaceWithPlans("serviceWithPlans", "spaceGuid")
   335  			Expect(err).NotTo(HaveOccurred())
   336  
   337  			Expect(len(service.Plans)).To(Equal(1))
   338  			Expect(service.Plans[0].Name).To(Equal("service-plan-without-orgs"))
   339  			Expect(service.Plans[0].OrgNames).To(BeNil())
   340  		})
   341  	})
   342  
   343  	Describe(".GetServicesByNameForSpaceWithPlans", func() {
   344  		BeforeEach(func() {
   345  			serviceRepo.FindServiceOfferingsForSpaceByLabelReturns = struct {
   346  				ServiceOfferings models.ServiceOfferings
   347  				Error            error
   348  			}{
   349  				models.ServiceOfferings([]models.ServiceOffering{service1, v1Service}),
   350  				nil,
   351  			}
   352  
   353  			planBuilder.GetPlansForServiceReturns([]models.ServicePlanFields{planWithoutOrgs}, nil)
   354  		})
   355  
   356  		It("returns the named service", func() {
   357  			services, err := serviceBuilder.GetServicesByNameForSpaceWithPlans("serviceWithPlans", "spaceGuid")
   358  			Expect(err).NotTo(HaveOccurred())
   359  
   360  			Expect(len(services)).To(Equal(2))
   361  			Expect(services[0].Label).To(Equal("my-service1"))
   362  			Expect(services[0].Plans[0].Name).To(Equal("service-plan-without-orgs"))
   363  			Expect(services[0].Plans[0].OrgNames).To(BeNil())
   364  			Expect(services[1].Label).To(Equal("v1Service"))
   365  			Expect(services[1].Plans[0].Name).To(Equal("service-plan-without-orgs"))
   366  			Expect(services[1].Plans[0].OrgNames).To(BeNil())
   367  		})
   368  	})
   369  
   370  	Describe(".GetServiceByNameForOrg", func() {
   371  		It("returns the named service, populated with plans", func() {
   372  			service, err := serviceBuilder.GetServiceByNameForOrg("my-service1", "org1")
   373  			Expect(err).NotTo(HaveOccurred())
   374  
   375  			Expect(planBuilder.GetPlansForServiceForOrgCallCount()).To(Equal(1))
   376  			servName, orgName := planBuilder.GetPlansForServiceForOrgArgsForCall(0)
   377  			Expect(servName).To(Equal("service-guid1"))
   378  			Expect(orgName).To(Equal("org1"))
   379  
   380  			Expect(len(service.Plans)).To(Equal(2))
   381  			Expect(service.Plans[0].Name).To(Equal("service-plan1"))
   382  			Expect(service.Plans[1].Name).To(Equal("service-plan2"))
   383  			Expect(service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   384  		})
   385  	})
   386  
   387  	Describe(".GetServicesForBroker", func() {
   388  		It("returns all the services for a broker, fully populated", func() {
   389  			services, err := serviceBuilder.GetServicesForBroker("my-service-broker-guid1")
   390  			Expect(err).NotTo(HaveOccurred())
   391  
   392  			service := services[0]
   393  			Expect(service.Label).To(Equal("my-service1"))
   394  			Expect(len(service.Plans)).To(Equal(2))
   395  			Expect(service.Plans[0].Name).To(Equal("service-plan1"))
   396  			Expect(service.Plans[1].Name).To(Equal("service-plan2"))
   397  			Expect(service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   398  		})
   399  	})
   400  
   401  	Describe(".GetServicesForManyBrokers", func() {
   402  		It("returns all the services for an array of broker guids, fully populated", func() {
   403  			brokerGuids := []string{"my-service-broker-guid1", "my-service-broker-guid2"}
   404  			services, err := serviceBuilder.GetServicesForManyBrokers(brokerGuids)
   405  			Expect(err).NotTo(HaveOccurred())
   406  
   407  			Expect(services).To(HaveLen(2))
   408  
   409  			broker_service := services[0]
   410  			Expect(broker_service.Label).To(Equal("my-service1"))
   411  			Expect(len(broker_service.Plans)).To(Equal(2))
   412  			Expect(broker_service.Plans[0].Name).To(Equal("service-plan1"))
   413  			Expect(broker_service.Plans[1].Name).To(Equal("service-plan2"))
   414  			Expect(broker_service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   415  
   416  			broker_service2 := services[1]
   417  			Expect(broker_service2.Label).To(Equal("my-service2"))
   418  			Expect(len(broker_service2.Plans)).To(Equal(1))
   419  			Expect(broker_service2.Plans[0].Name).To(Equal("service-plan3"))
   420  		})
   421  
   422  		It("raises errors from the service repo", func() {
   423  			serviceRepo.ListServicesFromManyBrokersErr = errors.New("error")
   424  			brokerGuids := []string{"my-service-broker-guid1", "my-service-broker-guid2"}
   425  			_, err := serviceBuilder.GetServicesForManyBrokers(brokerGuids)
   426  			Expect(err).To(HaveOccurred())
   427  		})
   428  
   429  		It("raises errors from the plan builder", func() {
   430  			planBuilder.GetPlansForManyServicesWithOrgsReturns(nil, errors.New("error"))
   431  			brokerGuids := []string{"my-service-broker-guid1", "my-service-broker-guid2"}
   432  			_, err := serviceBuilder.GetServicesForManyBrokers(brokerGuids)
   433  			Expect(err).To(HaveOccurred())
   434  		})
   435  	})
   436  
   437  	Describe(".GetServiceVisibleToOrg", func() {
   438  		It("Returns a service populated with plans visible to the provided org", func() {
   439  			service, err := serviceBuilder.GetServiceVisibleToOrg("my-service1", "org1")
   440  			Expect(err).NotTo(HaveOccurred())
   441  
   442  			Expect(service.Label).To(Equal("my-service1"))
   443  			Expect(len(service.Plans)).To(Equal(2))
   444  			Expect(service.Plans[0].Name).To(Equal("service-plan1"))
   445  			Expect(service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   446  		})
   447  
   448  		Context("When no plans are visible to the provided org", func() {
   449  			It("Returns nil", func() {
   450  				planBuilder.GetPlansVisibleToOrgReturns(nil, nil)
   451  				service, err := serviceBuilder.GetServiceVisibleToOrg("my-service1", "org3")
   452  				Expect(err).NotTo(HaveOccurred())
   453  
   454  				Expect(service).To(Equal(models.ServiceOffering{}))
   455  			})
   456  		})
   457  	})
   458  
   459  	Describe(".GetServicesVisibleToOrg", func() {
   460  		It("Returns services with plans visible to the provided org", func() {
   461  			planBuilder.GetPlansVisibleToOrgReturns([]models.ServicePlanFields{plan1, plan2}, nil)
   462  			services, err := serviceBuilder.GetServicesVisibleToOrg("org1")
   463  			Expect(err).NotTo(HaveOccurred())
   464  
   465  			service := services[0]
   466  			Expect(service.Label).To(Equal("my-service1"))
   467  			Expect(len(service.Plans)).To(Equal(2))
   468  			Expect(service.Plans[0].Name).To(Equal("service-plan1"))
   469  			Expect(service.Plans[0].OrgNames).To(Equal([]string{"org1", "org2"}))
   470  		})
   471  
   472  		Context("When no plans are visible to the provided org", func() {
   473  			It("Returns nil", func() {
   474  				planBuilder.GetPlansVisibleToOrgReturns(nil, nil)
   475  				services, err := serviceBuilder.GetServicesVisibleToOrg("org3")
   476  				Expect(err).NotTo(HaveOccurred())
   477  
   478  				Expect(services).To(BeNil())
   479  			})
   480  		})
   481  	})
   482  })