github.com/cloudfoundry/cli@v7.1.0+incompatible/actor/v3action/droplet_test.go (about)

     1  package v3action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	. "code.cloudfoundry.org/cli/actor/v3action"
     8  	"code.cloudfoundry.org/cli/actor/v3action/v3actionfakes"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    12  	"code.cloudfoundry.org/cli/resources"
    13  
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  var _ = Describe("Droplet Actions", func() {
    19  	var (
    20  		actor                     *Actor
    21  		fakeCloudControllerClient *v3actionfakes.FakeCloudControllerClient
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient)
    26  		actor = NewActor(fakeCloudControllerClient, nil, nil, nil)
    27  	})
    28  
    29  	Describe("SetApplicationDropletByApplicationNameAndSpace", func() {
    30  		When("there are no client errors", func() {
    31  			BeforeEach(func() {
    32  				fakeCloudControllerClient.GetApplicationsReturns(
    33  					[]resources.Application{
    34  						{GUID: "some-app-guid"},
    35  					},
    36  					ccv3.Warnings{"get-applications-warning"},
    37  					nil,
    38  				)
    39  
    40  				fakeCloudControllerClient.SetApplicationDropletReturns(
    41  					resources.Relationship{GUID: "some-droplet-guid"},
    42  					ccv3.Warnings{"set-application-droplet-warning"},
    43  					nil,
    44  				)
    45  			})
    46  
    47  			It("sets the app's droplet", func() {
    48  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
    49  
    50  				Expect(err).ToNot(HaveOccurred())
    51  				Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
    52  
    53  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
    54  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
    55  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}},
    56  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}},
    57  				))
    58  
    59  				Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1))
    60  				appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0)
    61  				Expect(appGUID).To(Equal("some-app-guid"))
    62  				Expect(dropletGUID).To(Equal("some-droplet-guid"))
    63  			})
    64  		})
    65  
    66  		When("getting the application fails", func() {
    67  			var expectedErr error
    68  
    69  			BeforeEach(func() {
    70  				expectedErr = errors.New("some get application error")
    71  
    72  				fakeCloudControllerClient.GetApplicationsReturns(
    73  					[]resources.Application{},
    74  					ccv3.Warnings{"get-applications-warning"},
    75  					expectedErr,
    76  				)
    77  			})
    78  
    79  			It("returns the error", func() {
    80  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
    81  
    82  				Expect(err).To(Equal(expectedErr))
    83  				Expect(warnings).To(ConsistOf("get-applications-warning"))
    84  			})
    85  		})
    86  
    87  		When("setting the droplet fails", func() {
    88  			var expectedErr error
    89  			BeforeEach(func() {
    90  				expectedErr = errors.New("some set application-droplet error")
    91  				fakeCloudControllerClient.GetApplicationsReturns(
    92  					[]resources.Application{
    93  						{GUID: "some-app-guid"},
    94  					},
    95  					ccv3.Warnings{"get-applications-warning"},
    96  					nil,
    97  				)
    98  
    99  				fakeCloudControllerClient.SetApplicationDropletReturns(
   100  					resources.Relationship{},
   101  					ccv3.Warnings{"set-application-droplet-warning"},
   102  					expectedErr,
   103  				)
   104  			})
   105  
   106  			It("returns the error", func() {
   107  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   108  
   109  				Expect(err).To(Equal(expectedErr))
   110  				Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
   111  			})
   112  
   113  			When("the cc client response contains an UnprocessableEntityError", func() {
   114  				BeforeEach(func() {
   115  					fakeCloudControllerClient.SetApplicationDropletReturns(
   116  						resources.Relationship{},
   117  						ccv3.Warnings{"set-application-droplet-warning"},
   118  						ccerror.UnprocessableEntityError{Message: "some-message"},
   119  					)
   120  				})
   121  
   122  				It("raises the error as AssignDropletError and returns warnings", func() {
   123  					warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   124  
   125  					Expect(err).To(MatchError("some-message"))
   126  					Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
   127  				})
   128  			})
   129  
   130  		})
   131  	})
   132  
   133  	Describe("SetApplicationDroplet", func() {
   134  		When("there are no client errors", func() {
   135  			BeforeEach(func() {
   136  				fakeCloudControllerClient.SetApplicationDropletReturns(
   137  					resources.Relationship{GUID: "some-droplet-guid"},
   138  					ccv3.Warnings{"set-application-droplet-warning"},
   139  					nil,
   140  				)
   141  			})
   142  
   143  			It("sets the app's droplet", func() {
   144  				warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   145  
   146  				Expect(err).ToNot(HaveOccurred())
   147  				Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   148  
   149  				Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1))
   150  				appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0)
   151  				Expect(appGUID).To(Equal("some-app-guid"))
   152  				Expect(dropletGUID).To(Equal("some-droplet-guid"))
   153  			})
   154  		})
   155  
   156  		When("setting the droplet fails", func() {
   157  			var expectedErr error
   158  
   159  			BeforeEach(func() {
   160  				expectedErr = errors.New("some set application-droplet error")
   161  
   162  				fakeCloudControllerClient.SetApplicationDropletReturns(
   163  					resources.Relationship{},
   164  					ccv3.Warnings{"set-application-droplet-warning"},
   165  					expectedErr,
   166  				)
   167  			})
   168  
   169  			It("returns the error", func() {
   170  				warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   171  
   172  				Expect(err).To(Equal(expectedErr))
   173  				Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   174  			})
   175  
   176  			When("the cc client response contains an UnprocessableEntityError", func() {
   177  				BeforeEach(func() {
   178  					fakeCloudControllerClient.SetApplicationDropletReturns(
   179  						resources.Relationship{},
   180  						ccv3.Warnings{"set-application-droplet-warning"},
   181  						ccerror.UnprocessableEntityError{Message: "some-message"},
   182  					)
   183  				})
   184  
   185  				It("raises the error as AssignDropletError and returns warnings", func() {
   186  					warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   187  
   188  					Expect(err).To(MatchError("some-message"))
   189  					Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   190  				})
   191  			})
   192  		})
   193  	})
   194  
   195  	Describe("GetApplicationDroplets", func() {
   196  		When("there are no client errors", func() {
   197  			BeforeEach(func() {
   198  				fakeCloudControllerClient.GetApplicationsReturns(
   199  					[]resources.Application{
   200  						{GUID: "some-app-guid"},
   201  					},
   202  					ccv3.Warnings{"get-applications-warning"},
   203  					nil,
   204  				)
   205  
   206  				fakeCloudControllerClient.GetDropletsReturns(
   207  					[]resources.Droplet{
   208  						{
   209  							GUID:      "some-droplet-guid-1",
   210  							State:     constant.DropletStaged,
   211  							CreatedAt: "2017-08-14T21:16:42Z",
   212  							Buildpacks: []resources.DropletBuildpack{
   213  								{Name: "ruby"},
   214  								{Name: "nodejs"},
   215  							},
   216  							Image: "docker/some-image",
   217  							Stack: "penguin",
   218  						},
   219  						{
   220  							GUID:      "some-droplet-guid-2",
   221  							State:     constant.DropletFailed,
   222  							CreatedAt: "2017-08-16T00:18:24Z",
   223  							Buildpacks: []resources.DropletBuildpack{
   224  								{Name: "java"},
   225  							},
   226  							Stack: "windows",
   227  						},
   228  					},
   229  					ccv3.Warnings{"get-application-droplets-warning"},
   230  					nil,
   231  				)
   232  			})
   233  
   234  			It("gets the app's droplets", func() {
   235  				droplets, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   236  
   237  				Expect(err).ToNot(HaveOccurred())
   238  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   239  				Expect(droplets).To(Equal([]Droplet{
   240  					{
   241  						GUID:      "some-droplet-guid-1",
   242  						State:     constant.DropletStaged,
   243  						CreatedAt: "2017-08-14T21:16:42Z",
   244  						Buildpacks: []Buildpack{
   245  							{Name: "ruby"},
   246  							{Name: "nodejs"},
   247  						},
   248  						Image: "docker/some-image",
   249  						Stack: "penguin",
   250  					},
   251  					{
   252  						GUID:      "some-droplet-guid-2",
   253  						State:     constant.DropletFailed,
   254  						CreatedAt: "2017-08-16T00:18:24Z",
   255  						Buildpacks: []Buildpack{
   256  							{Name: "java"},
   257  						},
   258  						Stack: "windows",
   259  					},
   260  				}))
   261  
   262  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   263  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
   264  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}},
   265  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}},
   266  				))
   267  
   268  				Expect(fakeCloudControllerClient.GetDropletsCallCount()).To(Equal(1))
   269  				Expect(fakeCloudControllerClient.GetDropletsArgsForCall(0)).To(ConsistOf(
   270  					ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}},
   271  				))
   272  			})
   273  		})
   274  
   275  		When("getting the application fails", func() {
   276  			var expectedErr error
   277  
   278  			BeforeEach(func() {
   279  				expectedErr = errors.New("some get application error")
   280  
   281  				fakeCloudControllerClient.GetApplicationsReturns(
   282  					[]resources.Application{},
   283  					ccv3.Warnings{"get-applications-warning"},
   284  					expectedErr,
   285  				)
   286  			})
   287  
   288  			It("returns the error", func() {
   289  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   290  
   291  				Expect(err).To(Equal(expectedErr))
   292  				Expect(warnings).To(ConsistOf("get-applications-warning"))
   293  			})
   294  		})
   295  
   296  		When("getting the application droplets fails", func() {
   297  			var expectedErr error
   298  
   299  			BeforeEach(func() {
   300  				expectedErr = errors.New("some get application error")
   301  
   302  				fakeCloudControllerClient.GetApplicationsReturns(
   303  					[]resources.Application{
   304  						{GUID: "some-app-guid"},
   305  					},
   306  					ccv3.Warnings{"get-applications-warning"},
   307  					nil,
   308  				)
   309  
   310  				fakeCloudControllerClient.GetDropletsReturns(
   311  					[]resources.Droplet{},
   312  					ccv3.Warnings{"get-application-droplets-warning"},
   313  					expectedErr,
   314  				)
   315  			})
   316  
   317  			It("returns the error", func() {
   318  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   319  
   320  				Expect(err).To(Equal(expectedErr))
   321  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   322  			})
   323  		})
   324  	})
   325  
   326  	Describe("GetCurrentDropletByApplication", func() {
   327  		var (
   328  			appGUID string
   329  
   330  			currentDroplet Droplet
   331  			warnings       Warnings
   332  			executionErr   error
   333  		)
   334  
   335  		BeforeEach(func() {
   336  			appGUID = "some-app-guid"
   337  		})
   338  
   339  		JustBeforeEach(func() {
   340  			currentDroplet, warnings, executionErr = actor.GetCurrentDropletByApplication(appGUID)
   341  		})
   342  
   343  		When("the current droplet exists", func() {
   344  			BeforeEach(func() {
   345  				fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, nil)
   346  			})
   347  
   348  			It("returns the current droplet", func() {
   349  				Expect(executionErr).ToNot(HaveOccurred())
   350  				Expect(warnings).To(ConsistOf("some-warning"))
   351  				Expect(currentDroplet).To(Equal(Droplet{GUID: "some-droplet-guid"}))
   352  
   353  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentCallCount()).To(Equal(1))
   354  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentArgsForCall(0)).To(Equal("some-app-guid"))
   355  			})
   356  		})
   357  
   358  		When("an error occurs", func() {
   359  			When("the app does not exist", func() {
   360  				BeforeEach(func() {
   361  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, ccerror.ApplicationNotFoundError{})
   362  				})
   363  
   364  				It("returns an ApplicationNotFoundError and warnings", func() {
   365  					Expect(executionErr).To(MatchError(actionerror.ApplicationNotFoundError{GUID: appGUID}))
   366  					Expect(warnings).To(ConsistOf("some-warning"))
   367  				})
   368  			})
   369  
   370  			When("the current droplet does not exist", func() {
   371  				BeforeEach(func() {
   372  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{}, ccv3.Warnings{"some-warning"}, ccerror.DropletNotFoundError{})
   373  				})
   374  
   375  				It("returns an DropletNotFoundError and warnings", func() {
   376  					Expect(executionErr).To(MatchError(actionerror.DropletNotFoundError{AppGUID: appGUID}))
   377  					Expect(warnings).To(ConsistOf("some-warning"))
   378  				})
   379  			})
   380  
   381  			When("a generic error occurs", func() {
   382  				var expectedErr error
   383  
   384  				BeforeEach(func() {
   385  					expectedErr = errors.New("some error")
   386  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(resources.Droplet{}, ccv3.Warnings{"some-warning"}, expectedErr)
   387  				})
   388  
   389  				It("returns the error and warnings", func() {
   390  					Expect(executionErr).To(MatchError(expectedErr))
   391  					Expect(warnings).To(ConsistOf("some-warning"))
   392  				})
   393  			})
   394  		})
   395  	})
   396  })