github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/actor/v2action/service_binding_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/ccv2"
     9  
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("Service Binding Actions", func() {
    15  	var (
    16  		actor                     *Actor
    17  		fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient
    18  	)
    19  
    20  	BeforeEach(func() {
    21  		fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient)
    22  		actor = NewActor(fakeCloudControllerClient, nil)
    23  	})
    24  
    25  	Describe("BindServiceBySpace", func() {
    26  		var (
    27  			executeErr error
    28  			warnings   Warnings
    29  		)
    30  
    31  		JustBeforeEach(func() {
    32  			warnings, executeErr = actor.BindServiceBySpace("some-app-name", "some-service-instance-name", "some-space-guid", map[string]interface{}{"some-parameter": "some-value"})
    33  		})
    34  
    35  		Context("when getting the application errors", func() {
    36  			BeforeEach(func() {
    37  				fakeCloudControllerClient.GetApplicationsReturns(
    38  					nil,
    39  					ccv2.Warnings{"foo-1"},
    40  					errors.New("some-error"),
    41  				)
    42  			})
    43  
    44  			It("returns the error", func() {
    45  				Expect(executeErr).To(MatchError(errors.New("some-error")))
    46  				Expect(warnings).To(ConsistOf("foo-1"))
    47  			})
    48  		})
    49  
    50  		Context("when getting the application succeeds", func() {
    51  			BeforeEach(func() {
    52  				fakeCloudControllerClient.GetApplicationsReturns(
    53  					[]ccv2.Application{{GUID: "some-app-guid"}},
    54  					ccv2.Warnings{"foo-1"},
    55  					nil,
    56  				)
    57  			})
    58  
    59  			Context("when getting the service instance errors", func() {
    60  				BeforeEach(func() {
    61  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
    62  						[]ccv2.ServiceInstance{},
    63  						ccv2.Warnings{"foo-2"},
    64  						errors.New("some-error"),
    65  					)
    66  				})
    67  
    68  				It("returns the error", func() {
    69  					Expect(executeErr).To(MatchError(errors.New("some-error")))
    70  					Expect(warnings).To(ConsistOf("foo-1", "foo-2"))
    71  				})
    72  			})
    73  
    74  			Context("when getting the service instance succeeds", func() {
    75  				BeforeEach(func() {
    76  					fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
    77  						[]ccv2.ServiceInstance{{GUID: "some-service-instance-guid"}},
    78  						ccv2.Warnings{"foo-2"},
    79  						nil,
    80  					)
    81  				})
    82  
    83  				Context("when getting binding the service instance to the application errors", func() {
    84  					BeforeEach(func() {
    85  						fakeCloudControllerClient.CreateServiceBindingReturns(
    86  							ccv2.ServiceBinding{},
    87  							ccv2.Warnings{"foo-3"},
    88  							errors.New("some-error"),
    89  						)
    90  					})
    91  
    92  					It("returns the error", func() {
    93  						Expect(executeErr).To(MatchError(errors.New("some-error")))
    94  						Expect(warnings).To(ConsistOf("foo-1", "foo-2", "foo-3"))
    95  					})
    96  				})
    97  				Context("when getting binding the service instance to the application succeeds", func() {
    98  					BeforeEach(func() {
    99  						fakeCloudControllerClient.CreateServiceBindingReturns(
   100  							ccv2.ServiceBinding{GUID: "some-service-binding-guid"},
   101  							ccv2.Warnings{"foo-3"},
   102  							nil,
   103  						)
   104  					})
   105  
   106  					It("returns all warnings", func() {
   107  						Expect(executeErr).ToNot(HaveOccurred())
   108  						Expect(warnings).To(ConsistOf("foo-1", "foo-2", "foo-3"))
   109  
   110  						Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   111  
   112  						Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1))
   113  
   114  						Expect(fakeCloudControllerClient.CreateServiceBindingCallCount()).To(Equal(1))
   115  						appGUID, serviceInstanceGUID, parameters := fakeCloudControllerClient.CreateServiceBindingArgsForCall(0)
   116  						Expect(appGUID).To(Equal("some-app-guid"))
   117  						Expect(serviceInstanceGUID).To(Equal("some-service-instance-guid"))
   118  						Expect(parameters).To(Equal(map[string]interface{}{"some-parameter": "some-value"}))
   119  					})
   120  				})
   121  			})
   122  		})
   123  	})
   124  
   125  	Describe("GetServiceBindingByApplicationAndServiceInstance", func() {
   126  		Context("when the service binding exists", func() {
   127  			BeforeEach(func() {
   128  				fakeCloudControllerClient.GetServiceBindingsReturns(
   129  					[]ccv2.ServiceBinding{
   130  						{
   131  							GUID: "some-service-binding-guid",
   132  						},
   133  					},
   134  					ccv2.Warnings{"foo"},
   135  					nil,
   136  				)
   137  			})
   138  
   139  			It("returns the service binding and warnings", func() {
   140  				serviceBinding, warnings, err := actor.GetServiceBindingByApplicationAndServiceInstance("some-app-guid", "some-service-instance-guid")
   141  				Expect(err).ToNot(HaveOccurred())
   142  				Expect(serviceBinding).To(Equal(ServiceBinding{
   143  					GUID: "some-service-binding-guid",
   144  				}))
   145  				Expect(warnings).To(Equal(Warnings{"foo"}))
   146  
   147  				Expect(fakeCloudControllerClient.GetServiceBindingsCallCount()).To(Equal(1))
   148  				Expect(fakeCloudControllerClient.GetServiceBindingsArgsForCall(0)).To(ConsistOf([]ccv2.Query{
   149  					ccv2.Query{
   150  						Filter:   ccv2.AppGUIDFilter,
   151  						Operator: ccv2.EqualOperator,
   152  						Value:    "some-app-guid",
   153  					},
   154  					ccv2.Query{
   155  						Filter:   ccv2.ServiceInstanceGUIDFilter,
   156  						Operator: ccv2.EqualOperator,
   157  						Value:    "some-service-instance-guid",
   158  					},
   159  				}))
   160  			})
   161  		})
   162  
   163  		Context("when the service binding does not exists", func() {
   164  			BeforeEach(func() {
   165  				fakeCloudControllerClient.GetServiceBindingsReturns([]ccv2.ServiceBinding{}, nil, nil)
   166  			})
   167  
   168  			It("returns a ServiceBindingNotFoundError", func() {
   169  				_, _, err := actor.GetServiceBindingByApplicationAndServiceInstance("some-app-guid", "some-service-instance-guid")
   170  				Expect(err).To(MatchError(ServiceBindingNotFoundError{
   171  					AppGUID:             "some-app-guid",
   172  					ServiceInstanceGUID: "some-service-instance-guid",
   173  				}))
   174  			})
   175  		})
   176  
   177  		Context("when the cloud controller client returns an error", func() {
   178  			var expectedError error
   179  
   180  			BeforeEach(func() {
   181  				expectedError = errors.New("I am a CloudControllerClient Error")
   182  				fakeCloudControllerClient.GetServiceBindingsReturns([]ccv2.ServiceBinding{}, nil, expectedError)
   183  			})
   184  
   185  			It("returns the error", func() {
   186  				_, _, err := actor.GetServiceBindingByApplicationAndServiceInstance("some-app-guid", "some-service-instance-guid")
   187  				Expect(err).To(MatchError(expectedError))
   188  			})
   189  		})
   190  	})
   191  
   192  	Describe("UnbindServiceBySpace", func() {
   193  		Context("when the service binding exists", func() {
   194  			BeforeEach(func() {
   195  				fakeCloudControllerClient.GetApplicationsReturns(
   196  					[]ccv2.Application{
   197  						{
   198  							GUID: "some-app-guid",
   199  							Name: "some-app",
   200  						},
   201  					},
   202  					ccv2.Warnings{"foo-1"},
   203  					nil,
   204  				)
   205  				fakeCloudControllerClient.GetSpaceServiceInstancesReturns(
   206  					[]ccv2.ServiceInstance{
   207  						{
   208  							GUID: "some-service-instance-guid",
   209  							Name: "some-service-instance",
   210  						},
   211  					},
   212  					ccv2.Warnings{"foo-2"},
   213  					nil,
   214  				)
   215  				fakeCloudControllerClient.GetServiceBindingsReturns(
   216  					[]ccv2.ServiceBinding{
   217  						{
   218  							GUID: "some-service-binding-guid",
   219  						},
   220  					},
   221  					ccv2.Warnings{"foo-3"},
   222  					nil,
   223  				)
   224  
   225  				fakeCloudControllerClient.DeleteServiceBindingReturns(
   226  					ccv2.Warnings{"foo-4", "foo-5"},
   227  					nil,
   228  				)
   229  			})
   230  
   231  			It("deletes the service binding", func() {
   232  				warnings, err := actor.UnbindServiceBySpace("some-app", "some-service-instance", "some-space-guid")
   233  				Expect(err).NotTo(HaveOccurred())
   234  				Expect(warnings).To(ConsistOf(Warnings{"foo-1", "foo-2", "foo-3", "foo-4", "foo-5"}))
   235  
   236  				Expect(fakeCloudControllerClient.DeleteServiceBindingCallCount()).To(Equal(1))
   237  				Expect(fakeCloudControllerClient.DeleteServiceBindingArgsForCall(0)).To(Equal("some-service-binding-guid"))
   238  			})
   239  
   240  			Context("when the cloud controller API returns warnings and an error", func() {
   241  				var expectedError error
   242  
   243  				BeforeEach(func() {
   244  					expectedError = errors.New("I am a CC error")
   245  					fakeCloudControllerClient.DeleteServiceBindingReturns(ccv2.Warnings{"foo-4", "foo-5"}, expectedError)
   246  				})
   247  
   248  				It("returns the warnings and the error", func() {
   249  					warnings, err := actor.UnbindServiceBySpace("some-app", "some-service-instance", "some-space-guid")
   250  					Expect(err).To(MatchError(expectedError))
   251  					Expect(warnings).To(ConsistOf(Warnings{"foo-1", "foo-2", "foo-3", "foo-4", "foo-5"}))
   252  				})
   253  			})
   254  		})
   255  	})
   256  })