github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+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/gomega"
    14  )
    15  
    16  var _ = Describe("Service Instance Summary Actions", func() {
    17  	var (
    18  		actor                     *Actor
    19  		fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient
    20  	)
    21  
    22  	BeforeEach(func() {
    23  		fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient)
    24  		actor = NewActor(fakeCloudControllerClient, nil, nil)
    25  	})
    26  
    27  	Describe("ServiceInstanceSummary", func() {
    28  		var summary ServiceInstanceSummary
    29  
    30  		Describe("IsShareable", func() {
    31  			Context("when the 'service_instance_sharing' feature flag is enabled", func() {
    32  				BeforeEach(func() {
    33  					summary.ServiceInstanceSharingFeatureFlag = true
    34  				})
    35  
    36  				Context("when the service broker has enabled sharing", func() {
    37  					BeforeEach(func() {
    38  						summary.Service.Extra.Shareable = true
    39  					})
    40  
    41  					It("returns true", func() {
    42  						Expect(summary.IsShareable()).To(BeTrue())
    43  					})
    44  				})
    45  
    46  				Context("when the service broker has not enabled sharing", func() {
    47  					BeforeEach(func() {
    48  						summary.Service.Extra.Shareable = false
    49  					})
    50  
    51  					It("returns true", func() {
    52  						Expect(summary.IsShareable()).To(BeFalse())
    53  					})
    54  				})
    55  			})
    56  
    57  			Context("when the 'service_instance_sharing' feature flag is not enabled", func() {
    58  				BeforeEach(func() {
    59  					summary.ServiceInstanceSharingFeatureFlag = false
    60  				})
    61  
    62  				Context("when the service broker has enabled sharing", func() {
    63  					BeforeEach(func() {
    64  						summary.Service.Extra.Shareable = true
    65  					})
    66  
    67  					It("returns true", func() {
    68  						Expect(summary.IsShareable()).To(BeFalse())
    69  					})
    70  				})
    71  
    72  				Context("when the service broker has not enabled sharing", func() {
    73  					BeforeEach(func() {
    74  						summary.Service.Extra.Shareable = false
    75  					})
    76  
    77  					It("returns true", func() {
    78  						Expect(summary.IsShareable()).To(BeFalse())
    79  					})
    80  				})
    81  			})
    82  		})
    83  	})
    84  
    85  	Describe("GetServiceInstanceSummaryByNameAndSpace", func() {
    86  		var (
    87  			summary         ServiceInstanceSummary
    88  			summaryWarnings Warnings
    89  			summaryErr      error
    90  		)
    91  
    92  		JustBeforeEach(func() {
    93  			summary, summaryWarnings, summaryErr = actor.GetServiceInstanceSummaryByNameAndSpace("some-service-instance", "some-space-guid")
    94  		})
    95  
    96  		Context("when an error is encountered getting the service instance", func() {
    97  			var expectedErr error
    98  
    99  			BeforeEach(func() {
   100  				expectedErr = errors.New("get space service instance error")
   101  				fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   102  					[]ccv2.ServiceInstance{},
   103  					ccv2.Warnings{"get-space-service-instance-warning"},
   104  					expectedErr)
   105  			})
   106  
   107  			It("returns the error and all warnings", func() {
   108  				Expect(summaryErr).To(MatchError(expectedErr))
   109  				Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning"))
   110  
   111  				Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   112  				spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   113  				Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   114  				Expect(getUserProvidedServicesArg).To(BeTrue())
   115  				Expect(queriesArg).To(HaveLen(1))
   116  				Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   117  					Type:     constant.NameFilter,
   118  					Operator: constant.EqualOperator,
   119  					Values:   []string{"some-service-instance"},
   120  				}))
   121  			})
   122  		})
   123  
   124  		Context("when no errors are encountered getting the service instance", func() {
   125  			var (
   126  				returnedServiceInstance ccv2.ServiceInstance
   127  				returnedFeatureFlag     ccv2.FeatureFlag
   128  			)
   129  
   130  			Context("when the service instance is a managed service instance", func() {
   131  				BeforeEach(func() {
   132  					returnedServiceInstance = ccv2.ServiceInstance{
   133  						GUID:            "some-service-instance-guid",
   134  						Name:            "some-service-instance",
   135  						Type:            ccv2.ManagedService,
   136  						Tags:            []string{"tag-1", "tag-2"},
   137  						DashboardURL:    "some-dashboard",
   138  						ServicePlanGUID: "some-service-plan-guid",
   139  					}
   140  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   141  						[]ccv2.ServiceInstance{returnedServiceInstance},
   142  						ccv2.Warnings{"get-space-service-instance-warning"},
   143  						nil)
   144  
   145  					returnedFeatureFlag = ccv2.FeatureFlag{
   146  						Name:    "service_instance_sharing",
   147  						Enabled: true,
   148  					}
   149  					fakeCloudControllerClient.GetConfigFeatureFlagsReturns(
   150  						[]ccv2.FeatureFlag{returnedFeatureFlag},
   151  						ccv2.Warnings{"get-feature-flags-warning"},
   152  						nil)
   153  				})
   154  
   155  				It("returns the service instance info and all warnings", func() {
   156  					Expect(summaryErr).ToNot(HaveOccurred())
   157  					Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   158  					Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning"))
   159  
   160  					Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   161  					spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   162  					Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   163  					Expect(getUserProvidedServicesArg).To(BeTrue())
   164  					Expect(queriesArg).To(HaveLen(1))
   165  					Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   166  						Type:     constant.NameFilter,
   167  						Operator: constant.EqualOperator,
   168  						Values:   []string{"some-service-instance"},
   169  					}))
   170  				})
   171  
   172  				Context("when the service instance is shared from another space (not created in the currently targeted space)", func() {
   173  					Context("when the source space of the service instance is different from the currently targeted space", func() {
   174  						BeforeEach(func() {
   175  							returnedServiceInstance.SpaceGUID = "not-currently-targeted-space-guid"
   176  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   177  								[]ccv2.ServiceInstance{returnedServiceInstance},
   178  								ccv2.Warnings{"get-space-service-instance-warning"},
   179  								nil)
   180  						})
   181  
   182  						Context("when an error is encountered getting the shared_from information", func() {
   183  							var expectedErr error
   184  
   185  							Context("when the error is generic", func() {
   186  								BeforeEach(func() {
   187  									expectedErr = errors.New("get-service-instance-shared-from-error")
   188  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   189  										ccv2.ServiceInstanceSharedFrom{},
   190  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   191  										expectedErr,
   192  									)
   193  								})
   194  
   195  								It("returns the error and all warnings", func() {
   196  									Expect(summaryErr).To(MatchError(expectedErr))
   197  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   198  
   199  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   200  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   201  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   202  								})
   203  							})
   204  
   205  							Context("when the API version does not support service instance sharing", func() {
   206  								BeforeEach(func() {
   207  									expectedErr = ccerror.ResourceNotFoundError{}
   208  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   209  										ccv2.ServiceInstanceSharedFrom{},
   210  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   211  										expectedErr,
   212  									)
   213  								})
   214  
   215  								It("ignores the 404 error and continues without shared_from information", func() {
   216  									Expect(summaryErr).ToNot(HaveOccurred())
   217  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   218  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{}))
   219  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   220  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   221  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   222  								})
   223  							})
   224  						})
   225  
   226  						Context("when no errors are encountered getting the shared_from information", func() {
   227  							Context("when the shared_from info is NOT empty", func() {
   228  								var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom
   229  
   230  								BeforeEach(func() {
   231  									returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{
   232  										SpaceGUID:        "some-space-guid",
   233  										SpaceName:        "some-space-name",
   234  										OrganizationName: "some-org-name",
   235  									}
   236  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   237  										returnedServiceSharedFrom,
   238  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   239  										nil)
   240  								})
   241  
   242  								It("returns the service instance share type, shared_from info, and all warnings", func() {
   243  									Expect(summaryErr).ToNot(HaveOccurred())
   244  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   245  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   246  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom))
   247  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom)))
   248  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   249  
   250  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   251  
   252  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   253  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   254  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   255  								})
   256  							})
   257  
   258  							Context("when the shared_from info is empty", func() {
   259  								It("sets the share type to not shared", func() {
   260  									Expect(summaryErr).ToNot(HaveOccurred())
   261  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   262  								})
   263  							})
   264  						})
   265  					})
   266  
   267  					Context("when the source space of the service instance is 'null'", func() {
   268  						BeforeEach(func() {
   269  							// API returns a json null value that is unmarshalled into the empty string
   270  							returnedServiceInstance.SpaceGUID = ""
   271  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   272  								[]ccv2.ServiceInstance{returnedServiceInstance},
   273  								ccv2.Warnings{"get-space-service-instance-warning"},
   274  								nil)
   275  						})
   276  
   277  						Context("when an error is encountered getting the shared_from information", func() {
   278  							var expectedErr error
   279  
   280  							Context("when the error is generic", func() {
   281  								BeforeEach(func() {
   282  									expectedErr = errors.New("get-service-instance-shared-from-error")
   283  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   284  										ccv2.ServiceInstanceSharedFrom{},
   285  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   286  										expectedErr,
   287  									)
   288  								})
   289  
   290  								It("returns the error and all warnings", func() {
   291  									Expect(summaryErr).To(MatchError(expectedErr))
   292  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   293  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   294  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   295  								})
   296  							})
   297  
   298  							Context("when the API version does not support service instance sharing", func() {
   299  								BeforeEach(func() {
   300  									expectedErr = ccerror.ResourceNotFoundError{}
   301  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   302  										ccv2.ServiceInstanceSharedFrom{},
   303  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   304  										expectedErr,
   305  									)
   306  								})
   307  
   308  								It("ignores the 404 error and continues without shared_from information", func() {
   309  									Expect(summaryErr).ToNot(HaveOccurred())
   310  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   311  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{}))
   312  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   313  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   314  								})
   315  							})
   316  						})
   317  
   318  						Context("when no errors are encountered getting the shared_from information", func() {
   319  							Context("when the shared_from info is NOT empty", func() {
   320  								var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom
   321  
   322  								BeforeEach(func() {
   323  									returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{
   324  										SpaceGUID:        "some-space-guid",
   325  										SpaceName:        "some-space-name",
   326  										OrganizationName: "some-org-name",
   327  									}
   328  									fakeCloudControllerClient.GetServiceInstanceSharedFromReturns(
   329  										returnedServiceSharedFrom,
   330  										ccv2.Warnings{"get-service-instance-shared-from-warning"},
   331  										nil)
   332  								})
   333  
   334  								It("returns the service instance share type, shared_from info, and all warnings", func() {
   335  									Expect(summaryErr).ToNot(HaveOccurred())
   336  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   337  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   338  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom))
   339  									Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom)))
   340  									Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-instance-shared-from-warning"))
   341  
   342  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   343  
   344  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1))
   345  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   346  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0))
   347  								})
   348  							})
   349  
   350  							Context("when the shared_from info is empty", func() {
   351  								It("sets the share type to not shared", func() {
   352  									Expect(summaryErr).ToNot(HaveOccurred())
   353  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   354  								})
   355  							})
   356  						})
   357  					})
   358  				})
   359  
   360  				Context("when the service instance is shared to other spaces", func() {
   361  					Context("when the source space of the service instance is the same as the currently targeted space", func() {
   362  						BeforeEach(func() {
   363  							returnedServiceInstance.SpaceGUID = "some-space-guid"
   364  							fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   365  								[]ccv2.ServiceInstance{returnedServiceInstance},
   366  								ccv2.Warnings{"get-space-service-instance-warning"},
   367  								nil)
   368  						})
   369  
   370  						Context("when an error is encountered getting the shared_to information", func() {
   371  							var expectedErr error
   372  
   373  							Context("when the error is generic", func() {
   374  								BeforeEach(func() {
   375  									expectedErr = errors.New("get-service-instance-shared-tos-error")
   376  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   377  										[]ccv2.ServiceInstanceSharedTo{},
   378  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   379  										expectedErr,
   380  									)
   381  								})
   382  
   383  								It("returns the error and all warnings", func() {
   384  									Expect(summaryErr).To(MatchError(expectedErr))
   385  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   386  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   387  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   388  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   389  								})
   390  							})
   391  
   392  							Context("when the API version does not support service instance sharing", func() {
   393  								BeforeEach(func() {
   394  									expectedErr = ccerror.ResourceNotFoundError{}
   395  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   396  										[]ccv2.ServiceInstanceSharedTo{},
   397  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   398  										expectedErr,
   399  									)
   400  								})
   401  
   402  								It("ignores the 404 error and continues without shared_to information", func() {
   403  									Expect(summaryErr).ToNot(HaveOccurred())
   404  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   405  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   406  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   407  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   408  								})
   409  							})
   410  						})
   411  
   412  						Context("when no errors are encountered getting the shared_to information", func() {
   413  							Context("when the shared_to info is NOT an empty list", func() {
   414  								var returnedServiceSharedTos []ccv2.ServiceInstanceSharedTo
   415  
   416  								BeforeEach(func() {
   417  									returnedServiceSharedTos = []ccv2.ServiceInstanceSharedTo{
   418  										{
   419  											SpaceGUID:        "some-space-guid",
   420  											SpaceName:        "some-space-name",
   421  											OrganizationName: "some-org-name",
   422  										},
   423  										{
   424  											SpaceGUID:        "some-space-guid2",
   425  											SpaceName:        "some-space-name2",
   426  											OrganizationName: "some-org-name2",
   427  										},
   428  									}
   429  
   430  									fakeCloudControllerClient.GetServiceInstanceSharedTosReturns(
   431  										returnedServiceSharedTos,
   432  										ccv2.Warnings{"get-service-instance-shared-tos-warning"},
   433  										nil)
   434  								})
   435  
   436  								It("returns the service instance share type, shared_to info, and all warnings", func() {
   437  									Expect(summaryErr).ToNot(HaveOccurred())
   438  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   439  									Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue())
   440  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedTo))
   441  									Expect(summary.ServiceInstanceSharedTos).To(ConsistOf(ServiceInstanceSharedTo(returnedServiceSharedTos[0]), ServiceInstanceSharedTo(returnedServiceSharedTos[1])))
   442  									Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning"))
   443  
   444  									Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1))
   445  
   446  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1))
   447  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   448  									Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0))
   449  								})
   450  							})
   451  
   452  							Context("when the shared_to info is an empty list", func() {
   453  								It("sets the share type to not shared", func() {
   454  									Expect(summaryErr).ToNot(HaveOccurred())
   455  									Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared))
   456  								})
   457  							})
   458  						})
   459  					})
   460  				})
   461  
   462  				Context("when an error is encountered getting the service plan", func() {
   463  					var expectedErr error
   464  
   465  					BeforeEach(func() {
   466  						expectedErr = errors.New("get-service-plan-error")
   467  						fakeCloudControllerClient.GetServicePlanReturns(
   468  							ccv2.ServicePlan{},
   469  							ccv2.Warnings{"get-service-plan-warning"},
   470  							expectedErr)
   471  					})
   472  
   473  					It("returns the error and all warnings", func() {
   474  						Expect(summaryErr).To(MatchError(expectedErr))
   475  						Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning"))
   476  
   477  						Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(1))
   478  						Expect(fakeCloudControllerClient.GetServicePlanArgsForCall(0)).To(Equal(returnedServiceInstance.ServicePlanGUID))
   479  					})
   480  				})
   481  
   482  				Context("when no errors are encountered getting the service plan", func() {
   483  					var returnedServicePlan ccv2.ServicePlan
   484  
   485  					BeforeEach(func() {
   486  						returnedServicePlan = ccv2.ServicePlan{
   487  							GUID:        "some-service-plan-guid",
   488  							Name:        "some-service-plan",
   489  							ServiceGUID: "some-service-guid",
   490  						}
   491  						fakeCloudControllerClient.GetServicePlanReturns(
   492  							returnedServicePlan,
   493  							ccv2.Warnings{"get-service-plan-warning"},
   494  							nil)
   495  					})
   496  
   497  					It("returns the service plan info and all warnings", func() {
   498  						Expect(summaryErr).ToNot(HaveOccurred())
   499  						Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   500  						Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   501  						Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning"))
   502  
   503  						Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(1))
   504  						Expect(fakeCloudControllerClient.GetServicePlanArgsForCall(0)).To(Equal(returnedServiceInstance.ServicePlanGUID))
   505  					})
   506  
   507  					Context("when an error is encountered getting the service", func() {
   508  						var expectedErr error
   509  
   510  						BeforeEach(func() {
   511  							expectedErr = errors.New("get service error")
   512  							fakeCloudControllerClient.GetServiceReturns(
   513  								ccv2.Service{},
   514  								ccv2.Warnings{"get-service-warning"},
   515  								expectedErr)
   516  						})
   517  
   518  						It("returns the error and all warnings", func() {
   519  							Expect(summaryErr).To(MatchError(expectedErr))
   520  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning"))
   521  
   522  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1))
   523  							Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID))
   524  						})
   525  					})
   526  
   527  					Context("when no errors are encountered getting the service", func() {
   528  						var returnedService ccv2.Service
   529  
   530  						BeforeEach(func() {
   531  							returnedService = ccv2.Service{
   532  								GUID:             "some-service-guid",
   533  								Label:            "some-service",
   534  								Description:      "some-description",
   535  								DocumentationURL: "some-url",
   536  								Extra: ccv2.ServiceExtra{
   537  									Shareable: true,
   538  								},
   539  							}
   540  							fakeCloudControllerClient.GetServiceReturns(
   541  								returnedService,
   542  								ccv2.Warnings{"get-service-warning"},
   543  								nil)
   544  						})
   545  
   546  						It("returns the service info and all warnings", func() {
   547  							Expect(summaryErr).ToNot(HaveOccurred())
   548  							Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   549  							Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   550  							Expect(summary.Service).To(Equal(Service(returnedService)))
   551  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning"))
   552  
   553  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1))
   554  							Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID))
   555  						})
   556  
   557  						Context("when an error is encountered getting the service bindings", func() {
   558  							var expectedErr error
   559  
   560  							BeforeEach(func() {
   561  								expectedErr = errors.New("get service bindings error")
   562  								fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns(
   563  									[]ccv2.ServiceBinding{},
   564  									ccv2.Warnings{"get-service-bindings-warning"},
   565  									expectedErr)
   566  							})
   567  
   568  							It("returns the error and all warnings", func() {
   569  								Expect(summaryErr).To(MatchError(expectedErr))
   570  								Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning"))
   571  
   572  								Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   573  								Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   574  							})
   575  						})
   576  
   577  						Context("when no errors are encountered getting the service bindings", func() {
   578  							var returnedServiceBindings []ccv2.ServiceBinding
   579  
   580  							BeforeEach(func() {
   581  								returnedServiceBindings = []ccv2.ServiceBinding{
   582  									{
   583  										GUID:    "some-service-binding-1-guid",
   584  										AppGUID: "some-app-1-guid",
   585  									},
   586  									{
   587  										GUID:    "some-service-binding-2-guid",
   588  										AppGUID: "some-app-2-guid",
   589  									},
   590  								}
   591  								fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns(
   592  									returnedServiceBindings,
   593  									ccv2.Warnings{"get-service-bindings-warning"},
   594  									nil)
   595  							})
   596  
   597  							Context("when an error is encountered getting bound application info", func() {
   598  								var expectedErr error
   599  
   600  								BeforeEach(func() {
   601  									expectedErr = errors.New("get application error")
   602  									fakeCloudControllerClient.GetApplicationReturns(
   603  										ccv2.Application{},
   604  										ccv2.Warnings{"get-application-warning"},
   605  										expectedErr)
   606  								})
   607  
   608  								It("returns the error", func() {
   609  									Expect(summaryErr).To(MatchError(expectedErr))
   610  									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"))
   611  
   612  									Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(1))
   613  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   614  								})
   615  							})
   616  
   617  							Context("when no errors are encountered getting bound application info", func() {
   618  								BeforeEach(func() {
   619  									fakeCloudControllerClient.GetApplicationReturnsOnCall(
   620  										0,
   621  										ccv2.Application{
   622  											GUID: "some-app-1-guid",
   623  											Name: "some-app-1",
   624  										},
   625  										ccv2.Warnings{"get-application-warning-1"},
   626  										nil)
   627  									fakeCloudControllerClient.GetApplicationReturnsOnCall(
   628  										1,
   629  										ccv2.Application{
   630  											GUID: "some-app-2-guid",
   631  											Name: "some-app-2",
   632  										},
   633  										ccv2.Warnings{"get-application-warning-2"},
   634  										nil)
   635  								})
   636  
   637  								It("returns a list of applications bound to the service instance and all warnings", func() {
   638  									Expect(summaryErr).ToNot(HaveOccurred())
   639  									Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance)))
   640  									Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan)))
   641  									Expect(summary.Service).To(Equal(Service(returnedService)))
   642  									Expect(summary.BoundApplications).To(Equal([]string{"some-app-1", "some-app-2"}))
   643  									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"))
   644  
   645  									Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   646  									Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   647  
   648  									Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2))
   649  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   650  									Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID))
   651  
   652  									Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(0))
   653  								})
   654  							})
   655  						})
   656  					})
   657  				})
   658  			})
   659  
   660  			Context("when the service instance is a user provided service instance", func() {
   661  				BeforeEach(func() {
   662  					returnedServiceInstance = ccv2.ServiceInstance{
   663  						GUID: "some-user-provided-service-instance-guid",
   664  						Name: "some-user-provided-service-instance",
   665  						Type: ccv2.UserProvidedService,
   666  					}
   667  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   668  						[]ccv2.ServiceInstance{returnedServiceInstance},
   669  						ccv2.Warnings{"get-space-service-instance-warning"},
   670  						nil)
   671  				})
   672  
   673  				Context("when no errors are encountered getting the service bindings", func() {
   674  					var returnedServiceBindings []ccv2.ServiceBinding
   675  
   676  					BeforeEach(func() {
   677  						returnedServiceBindings = []ccv2.ServiceBinding{
   678  							{
   679  								GUID:    "some-service-binding-1-guid",
   680  								AppGUID: "some-app-1-guid",
   681  							},
   682  							{
   683  								GUID:    "some-service-binding-2-guid",
   684  								AppGUID: "some-app-2-guid",
   685  							},
   686  						}
   687  						fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsReturns(
   688  							returnedServiceBindings,
   689  							ccv2.Warnings{"get-service-bindings-warning"},
   690  							nil)
   691  					})
   692  
   693  					Context("when no errors are encountered getting bound application info", func() {
   694  						BeforeEach(func() {
   695  							fakeCloudControllerClient.GetApplicationReturnsOnCall(
   696  								0,
   697  								ccv2.Application{
   698  									GUID: "some-app-1-guid",
   699  									Name: "some-app-1",
   700  								},
   701  								ccv2.Warnings{"get-application-warning-1"},
   702  								nil)
   703  							fakeCloudControllerClient.GetApplicationReturnsOnCall(
   704  								1,
   705  								ccv2.Application{
   706  									GUID: "some-app-2-guid",
   707  									Name: "some-app-2",
   708  								},
   709  								ccv2.Warnings{"get-application-warning-2"},
   710  								nil)
   711  						})
   712  
   713  						It("returns a list of applications bound to the service instance and all warnings", func() {
   714  							Expect(summaryErr).ToNot(HaveOccurred())
   715  							Expect(summary).To(Equal(ServiceInstanceSummary{
   716  								ServiceInstance:   ServiceInstance(returnedServiceInstance),
   717  								BoundApplications: []string{"some-app-1", "some-app-2"},
   718  							}))
   719  							Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-service-bindings-warning", "get-application-warning-1", "get-application-warning-2"))
   720  
   721  							Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   722  							spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0)
   723  							Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   724  							Expect(getUserProvidedServicesArg).To(BeTrue())
   725  							Expect(queriesArg).To(HaveLen(1))
   726  							Expect(queriesArg[0]).To(Equal(ccv2.Filter{
   727  								Type:     constant.NameFilter,
   728  								Operator: constant.EqualOperator,
   729  								Values:   []string{"some-service-instance"},
   730  							}))
   731  
   732  							Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(1))
   733  							Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID))
   734  
   735  							Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2))
   736  							Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID))
   737  							Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID))
   738  
   739  							Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(0))
   740  							Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(0))
   741  							Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(0))
   742  						})
   743  					})
   744  				})
   745  			})
   746  		})
   747  	})
   748  })