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

     1  package v2v3action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	. "code.cloudfoundry.org/cli/actor/v2v3action"
     9  	"code.cloudfoundry.org/cli/actor/v2v3action/v2v3actionfakes"
    10  	"code.cloudfoundry.org/cli/actor/v3action"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
    13  
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  var _ = Describe("Service Instance Actions", func() {
    19  	var (
    20  		actor       *Actor
    21  		fakeV2Actor *v2v3actionfakes.FakeV2Actor
    22  		fakeV3Actor *v2v3actionfakes.FakeV3Actor
    23  	)
    24  
    25  	BeforeEach(func() {
    26  		fakeV2Actor = new(v2v3actionfakes.FakeV2Actor)
    27  		fakeV3Actor = new(v2v3actionfakes.FakeV3Actor)
    28  		actor = NewActor(fakeV2Actor, fakeV3Actor)
    29  	})
    30  
    31  	Describe("ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization", func() {
    32  		var (
    33  			shareToSpaceName    string
    34  			serviceInstanceName string
    35  			sourceSpaceGUID     string
    36  			shareToOrgGUID      string
    37  
    38  			warnings Warnings
    39  			shareErr error
    40  		)
    41  
    42  		BeforeEach(func() {
    43  			shareToSpaceName = "some-space-name"
    44  			serviceInstanceName = "some-service-instance"
    45  			sourceSpaceGUID = "some-source-space-guid"
    46  			shareToOrgGUID = "some-org-guid"
    47  		})
    48  
    49  		JustBeforeEach(func() {
    50  			warnings, shareErr = actor.ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization(shareToSpaceName, serviceInstanceName, sourceSpaceGUID, shareToOrgGUID)
    51  		})
    52  
    53  		When("no errors occur getting the service instance", func() {
    54  			When("no errors occur getting the space we are sharing to", func() {
    55  				When("the service instance is a managed service instance", func() {
    56  					BeforeEach(func() {
    57  						fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
    58  							v2action.ServiceInstance{
    59  								GUID:        "some-service-instance-guid",
    60  								ServiceGUID: "some-service-guid",
    61  								Type:        constant.ServiceInstanceTypeManagedService,
    62  							},
    63  							v2action.Warnings{"get-service-instance-warning"},
    64  							nil)
    65  
    66  						fakeV2Actor.GetSpaceByOrganizationAndNameReturns(
    67  							v2action.Space{
    68  								GUID: "not-shared-space-guid",
    69  							},
    70  							v2action.Warnings{"get-space-warning"},
    71  							nil)
    72  					})
    73  
    74  					When("no errors occur getting the service", func() {
    75  						BeforeEach(func() {
    76  							fakeV2Actor.GetServiceReturns(
    77  								v2action.Service{
    78  									Extra: ccv2.ServiceExtra{
    79  										Shareable: true,
    80  									},
    81  								},
    82  								v2action.Warnings{"get-service-warning"},
    83  								nil)
    84  						})
    85  
    86  						When("no errors occur getting feature flags", func() {
    87  							BeforeEach(func() {
    88  								fakeV2Actor.GetFeatureFlagsReturns(
    89  									[]v2action.FeatureFlag{
    90  										{
    91  											Name:    "some-feature-flag",
    92  											Enabled: true,
    93  										},
    94  										{
    95  											Name:    "service_instance_sharing",
    96  											Enabled: true,
    97  										},
    98  									},
    99  									v2action.Warnings{"get-feature-flags-warning"},
   100  									nil)
   101  							})
   102  
   103  							When("no errors occur getting the spaces the service instance is shared to", func() {
   104  								BeforeEach(func() {
   105  									fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   106  										[]v2action.ServiceInstanceSharedTo{
   107  											{SpaceGUID: "already-shared-space-guid-1"},
   108  											{SpaceGUID: "already-shared-space-guid-2"},
   109  										},
   110  										v2action.Warnings{"get-service-instance-shared-tos-warning"},
   111  										nil)
   112  								})
   113  
   114  								When("the service instance is NOT already shared with this space", func() {
   115  									When("no errors occur sharing the service instance to this space", func() {
   116  										BeforeEach(func() {
   117  											fakeV3Actor.ShareServiceInstanceToSpacesReturns(
   118  												v3action.RelationshipList{
   119  													GUIDs: []string{"some-space-guid"},
   120  												},
   121  												v3action.Warnings{"share-service-instance-warning"},
   122  												nil)
   123  										})
   124  
   125  										It("shares the service instance to this space and returns all warnings", func() {
   126  											Expect(shareErr).ToNot(HaveOccurred())
   127  											Expect(warnings).To(ConsistOf(
   128  												"get-service-instance-warning",
   129  												"get-space-warning",
   130  												"get-service-warning",
   131  												"get-feature-flags-warning",
   132  												"get-service-instance-shared-tos-warning",
   133  												"share-service-instance-warning"))
   134  
   135  											Expect(fakeV2Actor.GetServiceInstanceByNameAndSpaceCallCount()).To(Equal(1))
   136  											serviceInstanceNameArg, spaceGUIDArg := fakeV2Actor.GetServiceInstanceByNameAndSpaceArgsForCall(0)
   137  											Expect(serviceInstanceNameArg).To(Equal(serviceInstanceName))
   138  											Expect(spaceGUIDArg).To(Equal(sourceSpaceGUID))
   139  
   140  											Expect(fakeV2Actor.GetServiceCallCount()).To(Equal(1))
   141  											Expect(fakeV2Actor.GetServiceArgsForCall(0)).To(Equal("some-service-guid"))
   142  
   143  											Expect(fakeV2Actor.GetFeatureFlagsCallCount()).To(Equal(1))
   144  
   145  											Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceCallCount()).To(Equal(1))
   146  											Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceArgsForCall(0)).To(Equal("some-service-instance-guid"))
   147  
   148  											Expect(fakeV2Actor.GetSpaceByOrganizationAndNameCallCount()).To(Equal(1))
   149  											orgGUIDArg, spaceNameArg := fakeV2Actor.GetSpaceByOrganizationAndNameArgsForCall(0)
   150  											Expect(orgGUIDArg).To(Equal(shareToOrgGUID))
   151  											Expect(spaceNameArg).To(Equal(shareToSpaceName))
   152  
   153  											Expect(fakeV3Actor.ShareServiceInstanceToSpacesCallCount()).To(Equal(1))
   154  											serviceInstanceGUIDArg, spaceGUIDsArg := fakeV3Actor.ShareServiceInstanceToSpacesArgsForCall(0)
   155  											Expect(serviceInstanceGUIDArg).To(Equal("some-service-instance-guid"))
   156  											Expect(spaceGUIDsArg).To(Equal([]string{"not-shared-space-guid"}))
   157  										})
   158  									})
   159  
   160  									When("an error occurs sharing the service instance to this space", func() {
   161  										var expectedErr error
   162  
   163  										BeforeEach(func() {
   164  											expectedErr = errors.New("share service instance error")
   165  											fakeV3Actor.ShareServiceInstanceToSpacesReturns(
   166  												v3action.RelationshipList{},
   167  												v3action.Warnings{"share-service-instance-warning"},
   168  												expectedErr)
   169  										})
   170  
   171  										It("returns the error and all warnings", func() {
   172  											Expect(shareErr).To(MatchError(expectedErr))
   173  											Expect(warnings).To(ConsistOf(
   174  												"get-service-instance-warning",
   175  												"get-service-warning",
   176  												"get-feature-flags-warning",
   177  												"get-service-instance-shared-tos-warning",
   178  												"get-space-warning",
   179  												"share-service-instance-warning"))
   180  										})
   181  									})
   182  								})
   183  
   184  								When("the service instance IS already shared with this space", func() {
   185  									BeforeEach(func() {
   186  										fakeV2Actor.GetSpaceByOrganizationAndNameReturns(
   187  											v2action.Space{
   188  												GUID: "already-shared-space-guid-2",
   189  											},
   190  											v2action.Warnings{"get-space-warning"},
   191  											nil)
   192  									})
   193  
   194  									It("returns a ServiceInstanceAlreadySharedError and all warnings", func() {
   195  										Expect(shareErr).To(MatchError(actionerror.ServiceInstanceAlreadySharedError{}))
   196  										Expect(warnings).To(ConsistOf(
   197  											"get-service-instance-warning",
   198  											"get-service-warning",
   199  											"get-feature-flags-warning",
   200  											"get-service-instance-shared-tos-warning",
   201  											"get-space-warning",
   202  										))
   203  									})
   204  								})
   205  							})
   206  
   207  							When("an error occurs getting the spaces the service instance is shared to", func() {
   208  								var expectedErr error
   209  
   210  								BeforeEach(func() {
   211  									expectedErr = errors.New("get shared to spaces error")
   212  									fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   213  										nil,
   214  										v2action.Warnings{"get-service-instance-shared-tos-warning"},
   215  										expectedErr)
   216  								})
   217  
   218  								It("returns the error and all warnings", func() {
   219  									Expect(shareErr).To(MatchError(expectedErr))
   220  									Expect(warnings).To(ConsistOf(
   221  										"get-service-instance-warning",
   222  										"get-space-warning",
   223  										"get-service-warning",
   224  										"get-feature-flags-warning",
   225  										"get-service-instance-shared-tos-warning"))
   226  								})
   227  							})
   228  						})
   229  
   230  						When("an error occurs getting feature flags", func() {
   231  							var expectedErr error
   232  
   233  							BeforeEach(func() {
   234  								expectedErr = errors.New("get feature flags error")
   235  								fakeV2Actor.GetFeatureFlagsReturns(
   236  									nil,
   237  									v2action.Warnings{"get-feature-flag-warning"},
   238  									expectedErr)
   239  							})
   240  
   241  							It("returns the error and all warnings", func() {
   242  								Expect(shareErr).To(MatchError(expectedErr))
   243  								Expect(warnings).To(ConsistOf(
   244  									"get-service-instance-warning",
   245  									"get-space-warning",
   246  									"get-service-warning",
   247  									"get-feature-flag-warning"))
   248  							})
   249  						})
   250  					})
   251  
   252  					When("an error occurs getting the service", func() {
   253  						var expectedErr error
   254  
   255  						BeforeEach(func() {
   256  							expectedErr = errors.New("get service error")
   257  							fakeV2Actor.GetServiceReturns(
   258  								v2action.Service{},
   259  								v2action.Warnings{"get-service-warning"},
   260  								expectedErr)
   261  						})
   262  
   263  						It("returns the error and all warnings", func() {
   264  							Expect(shareErr).To(MatchError(expectedErr))
   265  							Expect(warnings).To(ConsistOf(
   266  								"get-service-instance-warning",
   267  								"get-space-warning",
   268  								"get-service-warning"))
   269  						})
   270  					})
   271  
   272  					When("service sharing is globally disabled, and service sharing is disabled by the service broker", func() {
   273  						BeforeEach(func() {
   274  							fakeV2Actor.GetServiceReturns(
   275  								v2action.Service{
   276  									Extra: ccv2.ServiceExtra{
   277  										Shareable: false,
   278  									},
   279  								},
   280  								v2action.Warnings{"get-service-warning"},
   281  								nil)
   282  
   283  							fakeV2Actor.GetFeatureFlagsReturns(
   284  								[]v2action.FeatureFlag{
   285  									{
   286  										Name:    "some-feature-flag",
   287  										Enabled: true,
   288  									},
   289  									{
   290  										Name:    "service_instance_sharing",
   291  										Enabled: false,
   292  									},
   293  								},
   294  								v2action.Warnings{"get-feature-flags-warning"},
   295  								nil)
   296  						})
   297  
   298  						It("returns ServiceInstanceNotShareableError and all warnings", func() {
   299  							Expect(shareErr).To(MatchError(actionerror.ServiceInstanceNotShareableError{
   300  								FeatureFlagEnabled:          false,
   301  								ServiceBrokerSharingEnabled: false}))
   302  							Expect(warnings).To(ConsistOf(
   303  								"get-service-instance-warning",
   304  								"get-space-warning",
   305  								"get-service-warning",
   306  								"get-feature-flags-warning"))
   307  						})
   308  					})
   309  
   310  					When("service sharing is globally enabled, and service sharing is disabled by the service broker", func() {
   311  						BeforeEach(func() {
   312  							fakeV2Actor.GetServiceReturns(
   313  								v2action.Service{
   314  									Extra: ccv2.ServiceExtra{
   315  										Shareable: false,
   316  									},
   317  								},
   318  								v2action.Warnings{"get-service-warning"},
   319  								nil)
   320  
   321  							fakeV2Actor.GetFeatureFlagsReturns(
   322  								[]v2action.FeatureFlag{
   323  									{
   324  										Name:    "some-feature-flag",
   325  										Enabled: true,
   326  									},
   327  									{
   328  										Name:    "service_instance_sharing",
   329  										Enabled: true,
   330  									},
   331  								},
   332  								v2action.Warnings{"get-feature-flags-warning"},
   333  								nil)
   334  						})
   335  
   336  						It("returns ServiceInstanceNotShareableError and all warnings", func() {
   337  							Expect(shareErr).To(MatchError(actionerror.ServiceInstanceNotShareableError{
   338  								FeatureFlagEnabled:          true,
   339  								ServiceBrokerSharingEnabled: false}))
   340  							Expect(warnings).To(ConsistOf(
   341  								"get-service-instance-warning",
   342  								"get-space-warning",
   343  								"get-service-warning",
   344  								"get-feature-flags-warning"))
   345  						})
   346  					})
   347  
   348  					When("service sharing is globally disabled, and service sharing is enabled by the service broker", func() {
   349  						BeforeEach(func() {
   350  							fakeV2Actor.GetServiceReturns(
   351  								v2action.Service{
   352  									Extra: ccv2.ServiceExtra{
   353  										Shareable: true,
   354  									},
   355  								},
   356  								v2action.Warnings{"get-service-warning"},
   357  								nil)
   358  
   359  							fakeV2Actor.GetFeatureFlagsReturns(
   360  								[]v2action.FeatureFlag{
   361  									{
   362  										Name:    "some-feature-flag",
   363  										Enabled: true,
   364  									},
   365  									{
   366  										Name:    "service_instance_sharing",
   367  										Enabled: false,
   368  									},
   369  								},
   370  								v2action.Warnings{"get-feature-flags-warning"},
   371  								nil)
   372  						})
   373  
   374  						It("returns ServiceInstanceNotShareableError and all warnings", func() {
   375  							Expect(shareErr).To(MatchError(actionerror.ServiceInstanceNotShareableError{
   376  								FeatureFlagEnabled:          false,
   377  								ServiceBrokerSharingEnabled: true}))
   378  							Expect(warnings).To(ConsistOf(
   379  								"get-service-instance-warning",
   380  								"get-space-warning",
   381  								"get-service-warning",
   382  								"get-feature-flags-warning"))
   383  						})
   384  					})
   385  				})
   386  
   387  				When("the service instance is not a managed service instance", func() {
   388  					BeforeEach(func() {
   389  						fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   390  							v2action.ServiceInstance{
   391  								GUID:        "some-service-instance-guid",
   392  								ServiceGUID: "some-service-guid",
   393  								Type:        constant.ServiceInstanceTypeUserProvidedService,
   394  							},
   395  							v2action.Warnings{"get-service-instance-warning"},
   396  							nil)
   397  
   398  						fakeV2Actor.GetSpaceByOrganizationAndNameReturns(
   399  							v2action.Space{
   400  								GUID: "some-space",
   401  							},
   402  							v2action.Warnings{"get-space-warning"},
   403  							nil)
   404  
   405  						fakeV3Actor.ShareServiceInstanceToSpacesReturns(
   406  							v3action.RelationshipList{},
   407  							v3action.Warnings{"share-service-instance-warning"},
   408  							errors.New("User-provided services cannot be shared"))
   409  					})
   410  
   411  					It("always returns the error and warnings", func() {
   412  						Expect(shareErr).To(MatchError("User-provided services cannot be shared"))
   413  						Expect(warnings).To(ConsistOf(
   414  							"get-service-instance-warning",
   415  							"get-space-warning",
   416  							"share-service-instance-warning"))
   417  
   418  						Expect(fakeV2Actor.GetServiceCallCount()).To(Equal(0))
   419  						Expect(fakeV2Actor.GetFeatureFlagsCallCount()).To(Equal(0))
   420  						Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceCallCount()).To(Equal(0))
   421  					})
   422  				})
   423  			})
   424  
   425  			When("an error occurs getting the space we are sharing to", func() {
   426  				var expectedErr error
   427  
   428  				BeforeEach(func() {
   429  					fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   430  						v2action.ServiceInstance{},
   431  						v2action.Warnings{"get-service-instance-warning"},
   432  						nil)
   433  
   434  					expectedErr = errors.New("get space error")
   435  					fakeV2Actor.GetSpaceByOrganizationAndNameReturns(
   436  						v2action.Space{},
   437  						v2action.Warnings{"get-space-warning"},
   438  						expectedErr)
   439  				})
   440  
   441  				It("returns the error and all warnings", func() {
   442  					Expect(shareErr).To(MatchError(expectedErr))
   443  					Expect(warnings).To(ConsistOf(
   444  						"get-service-instance-warning",
   445  						"get-space-warning"))
   446  				})
   447  			})
   448  		})
   449  
   450  		When("an error occurs getting the service instance", func() {
   451  			var expectedErr error
   452  
   453  			BeforeEach(func() {
   454  				expectedErr = errors.New("get service instance error")
   455  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   456  					v2action.ServiceInstance{},
   457  					v2action.Warnings{"get-service-instance-warning"},
   458  					expectedErr)
   459  			})
   460  
   461  			It("returns the error and all warnings", func() {
   462  				Expect(shareErr).To(MatchError(expectedErr))
   463  				Expect(warnings).To(ConsistOf("get-service-instance-warning"))
   464  			})
   465  		})
   466  
   467  		When("the service instance does not exist", func() {
   468  			BeforeEach(func() {
   469  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   470  					v2action.ServiceInstance{},
   471  					v2action.Warnings{"get-service-instance-warning"},
   472  					actionerror.ServiceInstanceNotFoundError{})
   473  			})
   474  
   475  			It("returns a SharedServiceInstanceNotFoundError and all warnings", func() {
   476  				Expect(shareErr).To(MatchError(actionerror.SharedServiceInstanceNotFoundError{}))
   477  				Expect(warnings).To(ConsistOf("get-service-instance-warning"))
   478  			})
   479  		})
   480  	})
   481  
   482  	Describe("ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganizationName", func() {
   483  		var (
   484  			shareToSpaceName    string
   485  			serviceInstanceName string
   486  			sourceSpaceGUID     string
   487  			shareToOrgName      string
   488  
   489  			warnings Warnings
   490  			shareErr error
   491  		)
   492  
   493  		BeforeEach(func() {
   494  			shareToSpaceName = "some-space-name"
   495  			serviceInstanceName = "some-service-instance"
   496  			sourceSpaceGUID = "some-source-space-guid"
   497  			shareToOrgName = "some-org-name"
   498  		})
   499  
   500  		JustBeforeEach(func() {
   501  			warnings, shareErr = actor.ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganizationName(shareToSpaceName, serviceInstanceName, sourceSpaceGUID, shareToOrgName)
   502  		})
   503  
   504  		When("no errors occur getting the org", func() {
   505  			BeforeEach(func() {
   506  				fakeV3Actor.GetOrganizationByNameReturns(
   507  					v3action.Organization{
   508  						GUID: "some-org-guid",
   509  					},
   510  					v3action.Warnings{"get-org-warning"},
   511  					nil)
   512  
   513  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   514  					v2action.ServiceInstance{
   515  						GUID:        "some-service-instance-guid",
   516  						ServiceGUID: "some-service-guid",
   517  						Type:        constant.ServiceInstanceTypeManagedService,
   518  					},
   519  					v2action.Warnings{"get-service-instance-warning"},
   520  					nil)
   521  
   522  				fakeV2Actor.GetSpaceByOrganizationAndNameReturns(
   523  					v2action.Space{
   524  						GUID: "not-shared-space-guid",
   525  					},
   526  					v2action.Warnings{"get-space-warning"},
   527  					nil)
   528  
   529  				fakeV2Actor.GetServiceReturns(
   530  					v2action.Service{
   531  						Extra: ccv2.ServiceExtra{
   532  							Shareable: true,
   533  						},
   534  					},
   535  					v2action.Warnings{"get-service-warning"},
   536  					nil)
   537  
   538  				fakeV2Actor.GetFeatureFlagsReturns(
   539  					[]v2action.FeatureFlag{
   540  						{
   541  							Name:    "some-feature-flag",
   542  							Enabled: true,
   543  						},
   544  						{
   545  							Name:    "service_instance_sharing",
   546  							Enabled: true,
   547  						},
   548  					},
   549  					v2action.Warnings{"get-feature-flags-warning"},
   550  					nil)
   551  
   552  				fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   553  					[]v2action.ServiceInstanceSharedTo{
   554  						{SpaceGUID: "already-shared-space-guid-1"},
   555  						{SpaceGUID: "already-shared-space-guid-2"},
   556  					},
   557  					v2action.Warnings{"get-service-instance-shared-tos-warning"},
   558  					nil)
   559  
   560  				fakeV3Actor.ShareServiceInstanceToSpacesReturns(
   561  					v3action.RelationshipList{
   562  						GUIDs: []string{"some-space-guid"},
   563  					},
   564  					v3action.Warnings{"share-service-instance-warning"},
   565  					nil)
   566  			})
   567  
   568  			It("shares the service instance to this space and returns all warnings", func() {
   569  				Expect(shareErr).ToNot(HaveOccurred())
   570  				Expect(warnings).To(ConsistOf(
   571  					"get-org-warning",
   572  					"get-service-instance-warning",
   573  					"get-space-warning",
   574  					"get-service-warning",
   575  					"get-feature-flags-warning",
   576  					"get-service-instance-shared-tos-warning",
   577  					"share-service-instance-warning"))
   578  
   579  				Expect(fakeV3Actor.GetOrganizationByNameCallCount()).To(Equal(1))
   580  				Expect(fakeV3Actor.GetOrganizationByNameArgsForCall(0)).To(Equal(shareToOrgName))
   581  
   582  				Expect(fakeV2Actor.GetServiceInstanceByNameAndSpaceCallCount()).To(Equal(1))
   583  				serviceInstanceNameArg, spaceGUIDArg := fakeV2Actor.GetServiceInstanceByNameAndSpaceArgsForCall(0)
   584  				Expect(serviceInstanceNameArg).To(Equal(serviceInstanceName))
   585  				Expect(spaceGUIDArg).To(Equal(sourceSpaceGUID))
   586  
   587  				Expect(fakeV2Actor.GetSpaceByOrganizationAndNameCallCount()).To(Equal(1))
   588  				orgGUIDArg, spaceNameArg := fakeV2Actor.GetSpaceByOrganizationAndNameArgsForCall(0)
   589  				Expect(orgGUIDArg).To(Equal("some-org-guid"))
   590  				Expect(spaceNameArg).To(Equal(shareToSpaceName))
   591  
   592  				Expect(fakeV2Actor.GetServiceCallCount()).To(Equal(1))
   593  				Expect(fakeV2Actor.GetServiceArgsForCall(0)).To(Equal("some-service-guid"))
   594  
   595  				Expect(fakeV2Actor.GetFeatureFlagsCallCount()).To(Equal(1))
   596  
   597  				Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceCallCount()).To(Equal(1))
   598  				Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceArgsForCall(0)).To(Equal("some-service-instance-guid"))
   599  
   600  				Expect(fakeV3Actor.ShareServiceInstanceToSpacesCallCount()).To(Equal(1))
   601  				serviceInstanceGUIDArg, spaceGUIDsArg := fakeV3Actor.ShareServiceInstanceToSpacesArgsForCall(0)
   602  				Expect(serviceInstanceGUIDArg).To(Equal("some-service-instance-guid"))
   603  				Expect(spaceGUIDsArg).To(Equal([]string{"not-shared-space-guid"}))
   604  			})
   605  		})
   606  
   607  		When("an error occurs getting the org", func() {
   608  			var expectedErr error
   609  
   610  			BeforeEach(func() {
   611  				expectedErr = errors.New("get org error")
   612  				fakeV3Actor.GetOrganizationByNameReturns(
   613  					v3action.Organization{},
   614  					v3action.Warnings{"get-org-warning"},
   615  					expectedErr)
   616  			})
   617  
   618  			It("returns the error and all warnings", func() {
   619  				Expect(shareErr).To(MatchError(expectedErr))
   620  				Expect(warnings).To(ConsistOf("get-org-warning"))
   621  			})
   622  		})
   623  	})
   624  
   625  	Describe("UnshareServiceInstanceFromOrganizationNameAndSpaceNameByNameAndSpace", func() {
   626  		var (
   627  			shareToOrgName             string
   628  			shareToSpaceName           string
   629  			serviceInstanceName        string
   630  			currentlyTargetedSpaceGUID string
   631  
   632  			warnings   Warnings
   633  			executeErr error
   634  		)
   635  
   636  		BeforeEach(func() {
   637  			shareToOrgName = "shared-to-org"
   638  			shareToSpaceName = "shared-to-space"
   639  			serviceInstanceName = "some-service-instance"
   640  			currentlyTargetedSpaceGUID = "currently-targeted-space-guid"
   641  		})
   642  
   643  		JustBeforeEach(func() {
   644  			warnings, executeErr = actor.UnshareServiceInstanceFromOrganizationNameAndSpaceNameByNameAndSpace(shareToOrgName, shareToSpaceName, serviceInstanceName, currentlyTargetedSpaceGUID)
   645  		})
   646  
   647  		When("no errors occur getting the service instance", func() {
   648  			BeforeEach(func() {
   649  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   650  					v2action.ServiceInstance{
   651  						GUID: "some-service-instance-guid",
   652  					},
   653  					v2action.Warnings{"get-service-instance-warning"},
   654  					nil)
   655  			})
   656  
   657  			When("no errors occur getting the service instance's shared to spaces", func() {
   658  				BeforeEach(func() {
   659  					fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   660  						[]v2action.ServiceInstanceSharedTo{
   661  							{
   662  								SpaceGUID:        "some-other-shared-to-space-guid",
   663  								SpaceName:        "some-other-shared-to-space",
   664  								OrganizationName: "some-other-shared-to-org",
   665  							},
   666  							{
   667  								SpaceGUID:        "shared-to-space-guid",
   668  								SpaceName:        "shared-to-space",
   669  								OrganizationName: "shared-to-org",
   670  							},
   671  						},
   672  						v2action.Warnings{"get-shared-tos-warning"},
   673  						nil)
   674  				})
   675  
   676  				When("no errors occur unsharing the service instance", func() {
   677  					BeforeEach(func() {
   678  						fakeV3Actor.UnshareServiceInstanceByServiceInstanceAndSpaceReturns(
   679  							v3action.Warnings{"unshare-warning"},
   680  							nil)
   681  					})
   682  
   683  					It("returns no errors and returns all warnings", func() {
   684  						Expect(executeErr).ToNot(HaveOccurred())
   685  						Expect(warnings).To(ConsistOf(
   686  							"get-service-instance-warning",
   687  							"get-shared-tos-warning",
   688  							"unshare-warning"))
   689  
   690  						Expect(fakeV2Actor.GetServiceInstanceByNameAndSpaceCallCount()).To(Equal(1))
   691  						serviceInstanceNameArg, spaceGUIDArg := fakeV2Actor.GetServiceInstanceByNameAndSpaceArgsForCall(0)
   692  						Expect(serviceInstanceNameArg).To(Equal(serviceInstanceName))
   693  						Expect(spaceGUIDArg).To(Equal(currentlyTargetedSpaceGUID))
   694  
   695  						Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceCallCount()).To(Equal(1))
   696  						Expect(fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceArgsForCall(0)).To(Equal("some-service-instance-guid"))
   697  
   698  						Expect(fakeV3Actor.UnshareServiceInstanceByServiceInstanceAndSpaceCallCount()).To(Equal(1))
   699  						serviceInstanceGUIDArg, spaceGUIDArg := fakeV3Actor.UnshareServiceInstanceByServiceInstanceAndSpaceArgsForCall(0)
   700  						Expect(serviceInstanceGUIDArg).To(Equal("some-service-instance-guid"))
   701  						Expect(spaceGUIDArg).To(Equal("shared-to-space-guid"))
   702  					})
   703  				})
   704  
   705  				When("an error occurs unsharing the service instance", func() {
   706  					var expectedErr error
   707  
   708  					BeforeEach(func() {
   709  						expectedErr = errors.New("unshare error")
   710  						fakeV3Actor.UnshareServiceInstanceByServiceInstanceAndSpaceReturns(
   711  							v3action.Warnings{"unshare-warning"},
   712  							expectedErr)
   713  					})
   714  
   715  					It("returns the error and all warnings", func() {
   716  						Expect(executeErr).To(MatchError(expectedErr))
   717  						Expect(warnings).To(ConsistOf(
   718  							"get-service-instance-warning",
   719  							"get-shared-tos-warning",
   720  							"unshare-warning"))
   721  					})
   722  				})
   723  			})
   724  
   725  			When("an error occurs getting the service instance's shared to spaces", func() {
   726  				var expectedErr error
   727  
   728  				BeforeEach(func() {
   729  					expectedErr = errors.New("get shared tos error")
   730  					fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   731  						nil,
   732  						v2action.Warnings{"get-shared-tos-warning"},
   733  						expectedErr)
   734  				})
   735  
   736  				It("returns the error and all warnings", func() {
   737  					Expect(executeErr).To(MatchError(expectedErr))
   738  					Expect(warnings).To(ConsistOf(
   739  						"get-service-instance-warning",
   740  						"get-shared-tos-warning"))
   741  				})
   742  			})
   743  
   744  			When("the service instance is not shared to the space we want to unshare with", func() {
   745  				BeforeEach(func() {
   746  					fakeV2Actor.GetServiceInstanceSharedTosByServiceInstanceReturns(
   747  						[]v2action.ServiceInstanceSharedTo{
   748  							{
   749  								SpaceGUID:        "some-other-shared-to-space-guid",
   750  								SpaceName:        "some-other-shared-to-space",
   751  								OrganizationName: "some-other-shared-to-org",
   752  							},
   753  						},
   754  						v2action.Warnings{"get-shared-tos-warning"},
   755  						nil)
   756  				})
   757  
   758  				It("returns a ServiceInstanceNotSharedToSpaceError and all warnings", func() {
   759  					Expect(executeErr).To(MatchError(actionerror.ServiceInstanceNotSharedToSpaceError{
   760  						ServiceInstanceName: "some-service-instance",
   761  					}))
   762  					Expect(warnings).To(ConsistOf(
   763  						"get-service-instance-warning",
   764  						"get-shared-tos-warning"))
   765  				})
   766  			})
   767  		})
   768  
   769  		When("an error occurs getting the service instance", func() {
   770  			var expectedErr error
   771  
   772  			BeforeEach(func() {
   773  				expectedErr = errors.New("get service instance error")
   774  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   775  					v2action.ServiceInstance{},
   776  					v2action.Warnings{"get-service-instance-warning"},
   777  					expectedErr)
   778  			})
   779  
   780  			It("returns the error and all warnings", func() {
   781  				Expect(executeErr).To(MatchError(expectedErr))
   782  				Expect(warnings).To(ConsistOf("get-service-instance-warning"))
   783  			})
   784  		})
   785  
   786  		When("the service instance does not exist", func() {
   787  			BeforeEach(func() {
   788  				fakeV2Actor.GetServiceInstanceByNameAndSpaceReturns(
   789  					v2action.ServiceInstance{},
   790  					v2action.Warnings{"get-service-instance-warning"},
   791  					actionerror.ServiceInstanceNotFoundError{})
   792  			})
   793  
   794  			It("returns a SharedServiceInstanceNotFoundError and all warnings", func() {
   795  				Expect(executeErr).To(MatchError(actionerror.SharedServiceInstanceNotFoundError{}))
   796  				Expect(warnings).To(ConsistOf("get-service-instance-warning"))
   797  			})
   798  		})
   799  	})
   800  })