code.cloudfoundry.org/cli@v7.1.0+incompatible/actor/v2action/service_instance_summary_test.go (about)

     1  package v2action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	. "code.cloudfoundry.org/cli/actor/v2action"
     7  	"code.cloudfoundry.org/cli/actor/v2action/v2actionfakes"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
    11  
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/ginkgo/extensions/table"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Service Instance Summary 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("ServiceInstanceSummary", func() {
    29  		var summary ServiceInstanceSummary
    30  
    31  		Describe("IsShareable", func() {
    32  			When("the 'service_instance_sharing' feature flag is enabled", func() {
    33  				BeforeEach(func() {
    34  					summary.ServiceInstanceSharingFeatureFlag = true
    35  				})
    36  
    37  				When("the service broker has enabled sharing", func() {
    38  					BeforeEach(func() {
    39  						summary.Service.Extra.Shareable = true
    40  					})
    41  
    42  					It("returns true", func() {
    43  						Expect(summary.IsShareable()).To(BeTrue())
    44  					})
    45  				})
    46  
    47  				When("the service broker has not enabled sharing", func() {
    48  					BeforeEach(func() {
    49  						summary.Service.Extra.Shareable = false
    50  					})
    51  
    52  					It("returns true", func() {
    53  						Expect(summary.IsShareable()).To(BeFalse())
    54  					})
    55  				})
    56  			})
    57  
    58  			When("the 'service_instance_sharing' feature flag is not enabled", func() {
    59  				BeforeEach(func() {
    60  					summary.ServiceInstanceSharingFeatureFlag = false
    61  				})
    62  
    63  				When("the service broker has enabled sharing", func() {
    64  					BeforeEach(func() {
    65  						summary.Service.Extra.Shareable = true
    66  					})
    67  
    68  					It("returns true", func() {
    69  						Expect(summary.IsShareable()).To(BeFalse())
    70  					})
    71  				})
    72  
    73  				When("the service broker has not enabled sharing", func() {
    74  					BeforeEach(func() {
    75  						summary.Service.Extra.Shareable = false
    76  					})
    77  
    78  					It("returns true", func() {
    79  						Expect(summary.IsShareable()).To(BeFalse())
    80  					})
    81  				})
    82  			})
    83  		})
    84  
    85  		DescribeTable("UpgradeAvailable",
    86  			func(versionFromPlan, versionFromServiceInstance string, expectedResult bool) {
    87  				summary.MaintenanceInfo.Version = versionFromServiceInstance
    88  				summary.ServicePlan.MaintenanceInfo.Version = versionFromPlan
    89  				Expect(summary.UpgradeAvailable()).To(Equal(expectedResult))
    90  			},
    91  			Entry("values are the same", "2.0.0", "2.0.0", false),
    92  			Entry("values are different", "3.0.0", "2.0.0", true),
    93  			Entry("values are both empty", "", "", false),
    94  			Entry("plan has value but instance does not", "1.0.0", "", true),
    95  			Entry("instance has value but plan does not", "", "1.0.0", false),
    96  		)
    97  
    98  		DescribeTable("UpgradeSupported",
    99  			func(versionFromPlan string, expectedResult bool) {
   100  				summary.ServicePlan.MaintenanceInfo.Version = versionFromPlan
   101  				Expect(summary.UpgradeSupported()).To(Equal(expectedResult))
   102  			},
   103  			Entry("plan has value", "1.0.0", true),
   104  			Entry("plan does not have value", "", false),
   105  		)
   106  	})
   107  
   108  	Describe("GetServiceInstanceSummaryByNameAndSpace", func() {
   109  		var (
   110  			summary         ServiceInstanceSummary
   111  			summaryWarnings Warnings
   112  			summaryErr      error
   113  		)
   114  
   115  		JustBeforeEach(func() {
   116  			summary, summaryWarnings, summaryErr = actor.GetServiceInstanceSummaryByNameAndSpace("some-service-instance", "some-space-guid")
   117  		})
   118  
   119  		When("an error is encountered getting the service instance", func() {
   120  			var expectedErr error
   121  
   122  			BeforeEach(func() {
   123  				expectedErr = errors.New("get space service instance error")
   124  				fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   125  					[]ccv2.ServiceInstance{},
   126  					ccv2.Warnings{"get-space-service-instance-warning"},
   127  					expectedErr)
   128  			})
   129  
   130  			It("returns the error and all warnings", func() {
   131  				Expect(summaryErr).To(MatchError(expectedErr))
   132  				Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning"))
   133  
   134  				Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   135  				spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   136  				Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   137  				Expect(getUserProvidedServicesArg).To(BeTrue())
   138  				Expect(queriesArg).To(HaveLen(1))
   139  				Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   140  					Type:     constant.NameFilter,
   141  					Operator: constant.EqualOperator,
   142  					Values:   []string{"some-service-instance"},
   143  				}))
   144  			})
   145  		})
   146  
   147  		When("no errors are encountered getting the service instance", func() {
   148  			var (
   149  				returnedServiceInstance ccv2.ServiceInstance
   150  				returnedFeatureFlag     ccv2.FeatureFlag
   151  			)
   152  
   153  			When("the service instance is a managed service instance", func() {
   154  				BeforeEach(func() {
   155  					returnedServiceInstance = ccv2.ServiceInstance{
   156  						DashboardURL:    "some-dashboard",
   157  						GUID:            "some-service-instance-guid",
   158  						Name:            "some-service-instance",
   159  						ServiceGUID:     "some-service-guid",
   160  						ServicePlanGUID: "some-service-plan-guid",
   161  						Tags:            []string{"tag-1", "tag-2"},
   162  						Type:            constant.ManagedService,
   163  					}
   164  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   165  						[]ccv2.ServiceInstance{returnedServiceInstance},
   166  						ccv2.Warnings{"get-space-service-instance-warning"},
   167  						nil)
   168  
   169  					returnedFeatureFlag = ccv2.FeatureFlag{
   170  						Name:    "service_instance_sharing",
   171  						Enabled: true,
   172  					}
   173  					fakeCloudControllerClient.GetConfigFeatureFlagsReturns(
   174  						[]ccv2.FeatureFlag{returnedFeatureFlag},
   175  						ccv2.Warnings{"get-feature-flags-warning"},
   176  						nil)
   177  				})
   178  
   179  				It("returns the service instance info and all warnings", func() {
   180  					Expect(summaryErr).ToNot(HaveOccurred())
   181  					Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   182  					Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning"))
   183  
   184  					Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   185  					spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   186  					Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   187  					Expect(getUserProvidedServicesArg).To(BeTrue())
   188  					Expect(queriesArg).To(HaveLen(1))
   189  					Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   190  						Type:     constant.NameFilter,
   191  						Operator: constant.EqualOperator,
   192  						Values:   []string{"some-service-instance"},
   193  					}))
   194  				})
   195  
   196  				When("the service instance is shared from another space (not created in the currently targeted space)", func() {
   197  					When("the source space of the service instance is different from the currently targeted space", func() {
   198  						BeforeEach(func() {
   199  							returnedServiceInstance.SpaceGUID = "not-currently-targeted-space-guid"
   200  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   201  								[]ccv2.ServiceInstance{returnedServiceInstance},
   202  								ccv2.Warnings{"get-space-service-instance-warning"},
   203  								nil)
   204  						})
   205  
   206  						When("an error is encountered getting the shared_from information", func() {
   207  							var expectedErr error
   208  
   209  							When("the error is generic", func() {
   210  								BeforeEach(func() {
   211  									expectedErr = errors.New("get-service-instance-shared-from-error")
   212  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   213  										ccv2.ServiceInstanceSharedFrom{},
   214  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   215  										expectedErr,
   216  									)
   217  								})
   218  
   219  								It("returns the error and all warnings", func() {
   220  									Expect(summaryErr).To(MatchError(expectedErr))
   221  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   222  
   223  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   224  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   225  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   226  								})
   227  							})
   228  
   229  							When("the API version does not support service instance sharing", func() {
   230  								BeforeEach(func() {
   231  									expectedErr = ccerror.ResourceNotFoundError{}
   232  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   233  										ccv2.ServiceInstanceSharedFrom{},
   234  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   235  										expectedErr,
   236  									)
   237  								})
   238  
   239  								It("ignores the 404 error and continues without shared_from information", func() {
   240  									Expect(summaryErr).ToNot(HaveOccurred())
   241  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   242  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{}))
   243  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   244  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   245  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   246  								})
   247  							})
   248  						})
   249  
   250  						When("no errors are encountered getting the shared_from information", func() {
   251  							When("the shared_from info is NOT empty", func() {
   252  								var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom
   253  
   254  								BeforeEach(func() {
   255  									returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{
   256  										SpaceGUID:        "some-space-guid",
   257  										SpaceName:        "some-space-name",
   258  										OrganizationName: "some-org-name",
   259  									}
   260  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   261  										returnedServiceSharedFrom,
   262  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   263  										nil)
   264  								})
   265  
   266  								It("returns the service instance share type, shared_from info, and all warnings", func() {
   267  									Expect(summaryErr).ToNot(HaveOccurred())
   268  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   269  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   270  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom))
   271  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom)))
   272  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   273  
   274  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   275  
   276  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   277  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   278  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   279  								})
   280  							})
   281  
   282  							When("the shared_from info is empty", func() {
   283  								It("sets the share type to not shared", func() {
   284  									Expect(summaryErr).ToNot(HaveOccurred())
   285  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   286  								})
   287  							})
   288  						})
   289  					})
   290  
   291  					When("the source space of the service instance is 'null'", func() {
   292  						BeforeEach(func() {
   293  							// API returns a json null value that is unmarshalled into the empty string
   294  							returnedServiceInstance.SpaceGUID = ""
   295  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   296  								[]ccv2.ServiceInstance{returnedServiceInstance},
   297  								ccv2.Warnings{"get-space-service-instance-warning"},
   298  								nil)
   299  						})
   300  
   301  						When("an error is encountered getting the shared_from information", func() {
   302  							var expectedErr error
   303  
   304  							When("the error is generic", func() {
   305  								BeforeEach(func() {
   306  									expectedErr = errors.New("get-service-instance-shared-from-error")
   307  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   308  										ccv2.ServiceInstanceSharedFrom{},
   309  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   310  										expectedErr,
   311  									)
   312  								})
   313  
   314  								It("returns the error and all warnings", func() {
   315  									Expect(summaryErr).To(MatchError(expectedErr))
   316  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   317  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   318  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   319  								})
   320  							})
   321  
   322  							When("the API version does not support service instance sharing", func() {
   323  								BeforeEach(func() {
   324  									expectedErr = ccerror.ResourceNotFoundError{}
   325  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   326  										ccv2.ServiceInstanceSharedFrom{},
   327  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   328  										expectedErr,
   329  									)
   330  								})
   331  
   332  								It("ignores the 404 error and continues without shared_from information", func() {
   333  									Expect(summaryErr).ToNot(HaveOccurred())
   334  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   335  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{}))
   336  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   337  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   338  								})
   339  							})
   340  						})
   341  
   342  						When("no errors are encountered getting the shared_from information", func() {
   343  							When("the shared_from info is NOT empty", func() {
   344  								var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom
   345  
   346  								BeforeEach(func() {
   347  									returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{
   348  										SpaceGUID:        "some-space-guid",
   349  										SpaceName:        "some-space-name",
   350  										OrganizationName: "some-org-name",
   351  									}
   352  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   353  										returnedServiceSharedFrom,
   354  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   355  										nil)
   356  								})
   357  
   358  								It("returns the service instance share type, shared_from info, and all warnings", func() {
   359  									Expect(summaryErr).ToNot(HaveOccurred())
   360  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   361  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   362  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom))
   363  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom)))
   364  									Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-instance-shared-from-warning"))
   365  
   366  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   367  
   368  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   369  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   370  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   371  								})
   372  							})
   373  
   374  							When("the shared_from info is empty", func() {
   375  								It("sets the share type to not shared", func() {
   376  									Expect(summaryErr).ToNot(HaveOccurred())
   377  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   378  								})
   379  							})
   380  						})
   381  					})
   382  				})
   383  
   384  				When("the service instance is shared to other spaces", func() {
   385  					When("the source space of the service instance is the same as the currently targeted space", func() {
   386  						BeforeEach(func() {
   387  							returnedServiceInstance.SpaceGUID = "some-space-guid"
   388  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   389  								[]ccv2.ServiceInstance{returnedServiceInstance},
   390  								ccv2.Warnings{"get-space-service-instance-warning"},
   391  								nil)
   392  						})
   393  
   394  						When("an error is encountered getting the shared_to information", func() {
   395  							var expectedErr error
   396  
   397  							When("the error is generic", func() {
   398  								BeforeEach(func() {
   399  									expectedErr = errors.New("get-service-instance-shared-tos-error")
   400  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   401  										[]ccv2.ServiceInstanceSharedTo{},
   402  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   403  										expectedErr,
   404  									)
   405  								})
   406  
   407  								It("returns the error and all warnings", func() {
   408  									Expect(summaryErr).To(MatchError(expectedErr))
   409  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   410  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   411  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   412  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   413  								})
   414  							})
   415  
   416  							When("the API version does not support service instance sharing", func() {
   417  								BeforeEach(func() {
   418  									expectedErr = ccerror.ResourceNotFoundError{}
   419  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   420  										[]ccv2.ServiceInstanceSharedTo{},
   421  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   422  										expectedErr,
   423  									)
   424  								})
   425  
   426  								It("ignores the 404 error and continues without shared_to information", func() {
   427  									Expect(summaryErr).ToNot(HaveOccurred())
   428  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   429  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   430  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   431  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   432  								})
   433  							})
   434  						})
   435  
   436  						When("no errors are encountered getting the shared_to information", func() {
   437  							When("the shared_to info is NOT an empty list", func() {
   438  								var returnedServiceSharedTos []ccv2.ServiceInstanceSharedTo
   439  
   440  								BeforeEach(func() {
   441  									returnedServiceSharedTos = []ccv2.ServiceInstanceSharedTo{
   442  										{
   443  											SpaceGUID:        "some-space-guid",
   444  											SpaceName:        "some-space-name",
   445  											OrganizationName: "some-org-name",
   446  										},
   447  										{
   448  											SpaceGUID:        "some-space-guid2",
   449  											SpaceName:        "some-space-name2",
   450  											OrganizationName: "some-org-name2",
   451  										},
   452  									}
   453  
   454  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   455  										returnedServiceSharedTos,
   456  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   457  										nil)
   458  								})
   459  
   460  								It("returns the service instance share type, shared_to info, and all warnings", func() {
   461  									Expect(summaryErr).ToNot(HaveOccurred())
   462  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   463  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   464  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedTo))
   465  									Expect(summary.ServiceInstanceSharedTos).To(ConsistOf(ServiceInstanceSharedTo(returnedServiceSharedTos[0]), ServiceInstanceSharedTo(returnedServiceSharedTos[1])))
   466  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   467  
   468  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   469  
   470  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   471  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   472  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   473  								})
   474  							})
   475  
   476  							When("the shared_to info is an empty list", func() {
   477  								It("sets the share type to not shared", func() {
   478  									Expect(summaryErr).ToNot(HaveOccurred())
   479  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   480  								})
   481  							})
   482  						})
   483  					})
   484  				})
   485  
   486  				When("an error is encountered getting the service plan", func() {
   487  					Describe("a generic error", func() {
   488  						var expectedErr error
   489  
   490  						BeforeEach(func() {
   491  							expectedErr = errors.New("get-service-plan-error")
   492  							fakeCloudControllerClient.GetServicePlanReturns(
   493  								ccv2.ServicePlan{},
   494  								ccv2.Warnings{"get-service-plan-warning"},
   495  								expectedErr)
   496  						})
   497  
   498  						It("returns the error and all warnings", func() {
   499  							Expect(summaryErr).To(MatchError(expectedErr))
   500  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning"))
   501  						})
   502  					})
   503  
   504  					Describe("a Forbidden error", func() {
   505  						BeforeEach(func() {
   506  							fakeCloudControllerClient.GetServicePlanReturns(
   507  								ccv2.ServicePlan{},
   508  								ccv2.Warnings{"get-service-plan-warning"},
   509  								ccerror.ForbiddenError{})
   510  						})
   511  
   512  						It("returns warnings and continues on", func() {
   513  							Expect(summaryErr).ToNot(HaveOccurred())
   514  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "This org is not authorized to view necessary data about this service plan. Contact your administrator regarding service GUID some-service-plan-guid."))
   515  
   516  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1))
   517  							Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal("some-service-guid"))
   518  						})
   519  					})
   520  				})
   521  
   522  				When("no errors are encountered getting the service plan", func() {
   523  					var returnedServicePlan ccv2.ServicePlan
   524  
   525  					BeforeEach(func() {
   526  						returnedServicePlan = ccv2.ServicePlan{
   527  							GUID:        "some-service-plan-guid",
   528  							Name:        "some-service-plan",
   529  							ServiceGUID: "some-service-guid",
   530  						}
   531  						fakeCloudControllerClient.GetServicePlanReturns(
   532  							returnedServicePlan,
   533  							ccv2.Warnings{"get-service-plan-warning"},
   534  							nil)
   535  					})
   536  
   537  					It("returns the service plan info and all warnings", func() {
   538  						Expect(summaryErr).ToNot(HaveOccurred())
   539  						Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   540  						Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   541  						Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning"))
   542  
   543  						Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(1))
   544  						Expect(fakeCloudControllerClient.GetServicePlanArgsForCall(0)).To(Equal(returnedServiceInstance.ServicePlanGUID))
   545  					})
   546  
   547  					When("an error is encountered getting the service", func() {
   548  						Describe("a generic error", func() {
   549  							var expectedErr error
   550  
   551  							BeforeEach(func() {
   552  								expectedErr = errors.New("get service error")
   553  								fakeCloudControllerClient.GetServiceReturns(
   554  									ccv2.Service{},
   555  									ccv2.Warnings{"get-service-warning"},
   556  									expectedErr)
   557  							})
   558  
   559  							It("returns the error and all warnings", func() {
   560  								Expect(summaryErr).To(MatchError(expectedErr))
   561  								Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning"))
   562  
   563  								Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1))
   564  								Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID))
   565  							})
   566  						})
   567  
   568  						Describe("a Forbidden error", func() {
   569  							BeforeEach(func() {
   570  								fakeCloudControllerClient.GetServiceReturns(
   571  									ccv2.Service{},
   572  									ccv2.Warnings{"get-service-warning"},
   573  									ccerror.ForbiddenError{})
   574  							})
   575  
   576  							It("returns warnings and continues on", func() {
   577  								Expect(summaryErr).ToNot(HaveOccurred())
   578  								Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "This org is not authorized to view necessary data about this service. Contact your administrator regarding service GUID some-service-guid."))
   579  
   580  								Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(BeNumerically(">=", 1))
   581  							})
   582  						})
   583  					})
   584  
   585  					When("no errors are encountered getting the service", func() {
   586  						var returnedService ccv2.Service
   587  
   588  						BeforeEach(func() {
   589  							returnedService = ccv2.Service{
   590  								GUID:             "some-service-guid",
   591  								Label:            "some-service",
   592  								Description:      "some-description",
   593  								DocumentationURL: "some-url",
   594  								Extra: ccv2.ServiceExtra{
   595  									Shareable: true,
   596  								},
   597  							}
   598  
   599  							fakeCloudControllerClient.GetServiceReturns(
   600  								returnedService,
   601  								ccv2.Warnings{"get-service-warning"},
   602  								nil)
   603  						})
   604  
   605  						It("returns the service info and all warnings", func() {
   606  							Expect(summaryErr).ToNot(HaveOccurred())
   607  							Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   608  							Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   609  							Expect(summary.Service).To(Equal(Service(returnedService)))
   610  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning"))
   611  
   612  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1))
   613  							Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID))
   614  						})
   615  
   616  						When("an error is encountered getting the service bindings", func() {
   617  							var expectedErr error
   618  
   619  							BeforeEach(func() {
   620  								expectedErr = errors.New("get service bindings error")
   621  								fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns(
   622  									[]ccv2.ServiceBinding{},
   623  									ccv2.Warnings{"get-service-bindings-warning"},
   624  									expectedErr)
   625  							})
   626  
   627  							It("returns the error and all warnings", func() {
   628  								Expect(summaryErr).To(MatchError(expectedErr))
   629  								Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning"))
   630  
   631  								Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   632  								Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   633  							})
   634  						})
   635  
   636  						When("no errors are encountered getting the service bindings", func() {
   637  							var returnedServiceBindings []ccv2.ServiceBinding
   638  
   639  							BeforeEach(func() {
   640  								returnedServiceBindings = []ccv2.ServiceBinding{
   641  									{
   642  										GUID:          "some-service-binding-1-guid",
   643  										Name:          "some-service-binding-1",
   644  										AppGUID:       "some-app-1-guid",
   645  										LastOperation: ccv2.LastOperation{Type: "create", State: constant.LastOperationInProgress, Description: "10% complete"},
   646  									},
   647  									{
   648  										GUID:          "some-service-binding-2-guid",
   649  										Name:          "some-service-binding-2",
   650  										AppGUID:       "some-app-2-guid",
   651  										LastOperation: ccv2.LastOperation{Type: "delete", State: constant.LastOperationSucceeded, Description: "100% complete"},
   652  									},
   653  								}
   654  								fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns(
   655  									returnedServiceBindings,
   656  									ccv2.Warnings{"get-service-bindings-warning"},
   657  									nil)
   658  							})
   659  
   660  							When("an error is encountered getting bound application info", func() {
   661  								var expectedErr error
   662  
   663  								BeforeEach(func() {
   664  									expectedErr = errors.New("get application error")
   665  									fakeCloudControllerClient.GetApplicationReturns(
   666  										ccv2.Application{},
   667  										ccv2.Warnings{"get-application-warning"},
   668  										expectedErr)
   669  								})
   670  
   671  								It("returns the error", func() {
   672  									Expect(summaryErr).To(MatchError(expectedErr))
   673  									Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning", "get-application-warning"))
   674  
   675  									Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(1))
   676  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   677  								})
   678  							})
   679  
   680  							When("no errors are encountered getting bound application info", func() {
   681  								BeforeEach(func() {
   682  									fakeCloudControllerClient.GetApplicationReturnsOnCall(
   683  										0,
   684  										ccv2.Application{
   685  											GUID: "some-app-1-guid",
   686  											Name: "some-app-1",
   687  										},
   688  										ccv2.Warnings{"get-application-warning-1"},
   689  										nil)
   690  									fakeCloudControllerClient.GetApplicationReturnsOnCall(
   691  										1,
   692  										ccv2.Application{
   693  											GUID: "some-app-2-guid",
   694  											Name: "some-app-2",
   695  										},
   696  										ccv2.Warnings{"get-application-warning-2"},
   697  										nil)
   698  								})
   699  
   700  								It("returns a list of applications bound to the service instance and all warnings", func() {
   701  									Expect(summaryErr).ToNot(HaveOccurred())
   702  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   703  									Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   704  									Expect(summary.Service).To(Equal(Service(returnedService)))
   705  									Expect(summary.BoundApplications).To(Equal([]BoundApplication{
   706  										{
   707  											AppName:            "some-app-1",
   708  											ServiceBindingName: "some-service-binding-1",
   709  											LastOperation: LastOperation{
   710  												Type:        "create",
   711  												State:       constant.LastOperationInProgress,
   712  												Description: "10% complete",
   713  											},
   714  										},
   715  										{
   716  											AppName:            "some-app-2",
   717  											ServiceBindingName: "some-service-binding-2",
   718  											LastOperation: LastOperation{
   719  												Type:        "delete",
   720  												State:       constant.LastOperationSucceeded,
   721  												Description: "100% complete",
   722  											},
   723  										},
   724  									}))
   725  									Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning", "get-application-warning-1", "get-application-warning-2"))
   726  
   727  									Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   728  									Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   729  
   730  									Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2))
   731  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   732  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID))
   733  
   734  									Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(0))
   735  								})
   736  							})
   737  						})
   738  					})
   739  				})
   740  			})
   741  
   742  			When("the service instance is a user provided service instance", func() {
   743  				BeforeEach(func() {
   744  					returnedServiceInstance = ccv2.ServiceInstance{
   745  						GUID: "some-user-provided-service-instance-guid",
   746  						Name: "some-user-provided-service-instance",
   747  						Type: constant.UserProvidedService,
   748  					}
   749  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   750  						[]ccv2.ServiceInstance{returnedServiceInstance},
   751  						ccv2.Warnings{"get-space-service-instance-warning"},
   752  						nil)
   753  				})
   754  
   755  				Context("getting the service bindings errors", func() {
   756  					BeforeEach(func() {
   757  						fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsReturns(
   758  							nil,
   759  							ccv2.Warnings{"some-get-user-provided-si-bindings-warnings"},
   760  							errors.New("some-get-user-provided-si-bindings-error"))
   761  					})
   762  
   763  					It("should return the error and return all warnings", func() {
   764  						Expect(summaryErr).To(MatchError("some-get-user-provided-si-bindings-error"))
   765  						Expect(summaryWarnings).To(ConsistOf("some-get-user-provided-si-bindings-warnings",
   766  							"get-space-service-instance-warning"))
   767  					})
   768  				})
   769  
   770  				When("no errors are encountered getting the service bindings", func() {
   771  					var returnedServiceBindings []ccv2.ServiceBinding
   772  
   773  					BeforeEach(func() {
   774  						returnedServiceBindings = []ccv2.ServiceBinding{
   775  							{
   776  								GUID:    "some-service-binding-1-guid",
   777  								Name:    "some-service-binding-1",
   778  								AppGUID: "some-app-1-guid",
   779  							},
   780  							{
   781  								GUID:    "some-service-binding-2-guid",
   782  								Name:    "some-service-binding-2",
   783  								AppGUID: "some-app-2-guid",
   784  							},
   785  						}
   786  						fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsReturns(
   787  							returnedServiceBindings,
   788  							ccv2.Warnings{"get-service-bindings-warning"},
   789  							nil)
   790  					})
   791  
   792  					When("no errors are encountered getting bound application info", func() {
   793  						BeforeEach(func() {
   794  							fakeCloudControllerClient.GetApplicationReturnsOnCall(
   795  								0,
   796  								ccv2.Application{
   797  									GUID: "some-app-1-guid",
   798  									Name: "some-app-1",
   799  								},
   800  								ccv2.Warnings{"get-application-warning-1"},
   801  								nil)
   802  							fakeCloudControllerClient.GetApplicationReturnsOnCall(
   803  								1,
   804  								ccv2.Application{
   805  									GUID: "some-app-2-guid",
   806  									Name: "some-app-2",
   807  								},
   808  								ccv2.Warnings{"get-application-warning-2"},
   809  								nil)
   810  						})
   811  
   812  						It("returns a list of applications bound to the service instance and all warnings", func() {
   813  							Expect(summaryErr).ToNot(HaveOccurred())
   814  							Expect(summary).To(Equal(ServiceInstanceSummary{
   815  								ServiceInstance: ServiceInstance(returnedServiceInstance),
   816  								BoundApplications: []BoundApplication{
   817  									{
   818  										AppName:            "some-app-1",
   819  										ServiceBindingName: "some-service-binding-1",
   820  									},
   821  									{
   822  										AppName:            "some-app-2",
   823  										ServiceBindingName: "some-service-binding-2",
   824  									},
   825  								},
   826  							}))
   827  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-service-bindings-warning", "get-application-warning-1", "get-application-warning-2"))
   828  
   829  							Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   830  							spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   831  							Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   832  							Expect(getUserProvidedServicesArg).To(BeTrue())
   833  							Expect(queriesArg).To(HaveLen(1))
   834  							Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   835  								Type:     constant.NameFilter,
   836  								Operator: constant.EqualOperator,
   837  								Values:   []string{"some-service-instance"},
   838  							}))
   839  
   840  							Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   841  							Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   842  
   843  							Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2))
   844  							Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   845  							Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID))
   846  
   847  							Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(0))
   848  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(0))
   849  							Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(0))
   850  						})
   851  					})
   852  				})
   853  			})
   854  		})
   855  	})
   856  
   857  	Describe("GetServiceInstancesSummaryBySpace", func() {
   858  		var (
   859  			serviceInstancesSummary []ServiceInstanceSummary
   860  			warnings                Warnings
   861  			executeErr              error
   862  		)
   863  
   864  		JustBeforeEach(func() {
   865  			serviceInstancesSummary, warnings, executeErr = actor.GetServiceInstancesSummaryBySpace("some-space-GUID")
   866  		})
   867  
   868  		When("an error is encountered getting a space's summary", func() {
   869  			var expectedErr error
   870  
   871  			BeforeEach(func() {
   872  				expectedErr = errors.New("summary error")
   873  
   874  				fakeCloudControllerClient.GetSpaceSummaryReturns(
   875  					ccv2.SpaceSummary{},
   876  					ccv2.Warnings{"get-by-space-service-instances-warning"},
   877  					expectedErr,
   878  				)
   879  			})
   880  
   881  			It("returns the error and all warnings", func() {
   882  				Expect(executeErr).To(MatchError(expectedErr))
   883  				Expect(warnings).To(ConsistOf("get-by-space-service-instances-warning"))
   884  			})
   885  		})
   886  
   887  		When("no errors are encountered getting a space's summary", func() {
   888  			BeforeEach(func() {
   889  				fakeCloudControllerClient.GetServicesReturns(
   890  					[]ccv2.Service{
   891  						{
   892  							GUID:              "service-guid-1",
   893  							Label:             "service-label",
   894  							ServiceBrokerName: "some-broker",
   895  						},
   896  						{
   897  							GUID:              "service-guid-2",
   898  							Label:             "service-label",
   899  							ServiceBrokerName: "other-broker",
   900  						},
   901  					},
   902  					ccv2.Warnings{"get-space-services-warning"},
   903  					nil,
   904  				)
   905  				fakeCloudControllerClient.GetSpaceSummaryReturns(
   906  					ccv2.SpaceSummary{
   907  						Name: "space-name",
   908  						Applications: []ccv2.SpaceSummaryApplication{
   909  							{
   910  								Name:         "1-app-name",
   911  								ServiceNames: []string{"managed-service-instance", "user-provided-service-instance"},
   912  							},
   913  							{
   914  								Name:         "2-app-name",
   915  								ServiceNames: []string{"managed-service-instance"},
   916  							},
   917  						},
   918  						ServiceInstances: []ccv2.SpaceSummaryServiceInstance{
   919  							{
   920  								Name: "managed-service-instance",
   921  								MaintenanceInfo: ccv2.MaintenanceInfo{
   922  									Version: "2.0.0",
   923  								},
   924  								ServicePlan: ccv2.SpaceSummaryServicePlan{
   925  									GUID: "plan-guid",
   926  									Name: "simple-plan",
   927  									MaintenanceInfo: ccv2.MaintenanceInfo{
   928  										Version: "3.0.0",
   929  									},
   930  									Service: ccv2.SpaceSummaryService{
   931  										GUID:              "service-guid-1",
   932  										Label:             "service-label",
   933  										ServiceBrokerName: "some-broker",
   934  									},
   935  								},
   936  								LastOperation: ccv2.LastOperation{
   937  									Type:        "create",
   938  									State:       "succeeded",
   939  									Description: "a description",
   940  								},
   941  							},
   942  							{
   943  								Name: "user-provided-service-instance",
   944  							},
   945  						},
   946  					},
   947  					ccv2.Warnings{"get-space-summary-warning"},
   948  					nil,
   949  				)
   950  			})
   951  
   952  			It("returns the service instances summary with bound apps and all warnings", func() {
   953  				Expect(executeErr).NotTo(HaveOccurred())
   954  				Expect(warnings).To(ConsistOf("get-space-summary-warning", "get-space-services-warning"))
   955  				Expect(serviceInstancesSummary).To(Equal([]ServiceInstanceSummary{
   956  					{
   957  						ServiceInstance: ServiceInstance{
   958  							Name: "managed-service-instance",
   959  							Type: constant.ManagedService,
   960  							LastOperation: ccv2.LastOperation{
   961  								Type:        "create",
   962  								State:       "succeeded",
   963  								Description: "a description",
   964  							},
   965  							MaintenanceInfo: ccv2.MaintenanceInfo{
   966  								Version: "2.0.0",
   967  							},
   968  						},
   969  						ServicePlan: ServicePlan{
   970  							Name: "simple-plan",
   971  							MaintenanceInfo: ccv2.MaintenanceInfo{
   972  								Version: "3.0.0",
   973  							},
   974  						},
   975  						Service: Service{
   976  							Label:             "service-label",
   977  							ServiceBrokerName: "some-broker",
   978  						},
   979  						BoundApplications: []BoundApplication{
   980  							{AppName: "1-app-name"},
   981  							{AppName: "2-app-name"},
   982  						},
   983  					},
   984  					{
   985  						ServiceInstance: ServiceInstance{
   986  							Name: "user-provided-service-instance",
   987  							Type: constant.UserProvidedService,
   988  						},
   989  						BoundApplications: []BoundApplication{
   990  							{AppName: "1-app-name"},
   991  						},
   992  					},
   993  				},
   994  				))
   995  			})
   996  
   997  			When("an error is encountered getting all services", func() {
   998  				BeforeEach(func() {
   999  					fakeCloudControllerClient.GetServicesReturns(
  1000  						[]ccv2.Service{},
  1001  						ccv2.Warnings{"warning-1", "warning-2"},
  1002  						errors.New("oops"),
  1003  					)
  1004  				})
  1005  
  1006  				It("returns the error and all warnings", func() {
  1007  					Expect(executeErr).To(MatchError(errors.New("oops")))
  1008  					Expect(warnings).To(ConsistOf("get-space-summary-warning", "warning-1", "warning-2"))
  1009  				})
  1010  			})
  1011  		})
  1012  	})
  1013  })