github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/droplet_test.go (about)

     1  package v7action_test
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/actor/actionerror"
     9  	. "code.cloudfoundry.org/cli/actor/v7action"
    10  	"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    13  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    14  
    15  	. "github.com/onsi/ginkgo"
    16  	. "github.com/onsi/gomega"
    17  )
    18  
    19  var _ = Describe("Droplet Actions", func() {
    20  	var (
    21  		actor                     *Actor
    22  		fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient
    23  	)
    24  
    25  	BeforeEach(func() {
    26  		fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient)
    27  		actor = NewActor(fakeCloudControllerClient, nil, nil, nil, nil)
    28  	})
    29  
    30  	Describe("CreateApplicationDroplet", func() {
    31  		When("there are no client errors", func() {
    32  			BeforeEach(func() {
    33  				fakeCloudControllerClient.CreateDropletReturns(
    34  					ccv3.Droplet{
    35  						GUID:      "some-droplet-guid",
    36  						State:     constant.DropletAwaitingUpload,
    37  						CreatedAt: "2017-08-14T21:16:42Z",
    38  						Image:     "docker/some-image",
    39  						Stack:     "penguin",
    40  					},
    41  					ccv3.Warnings{"create-application-droplet-warning"},
    42  					nil,
    43  				)
    44  			})
    45  
    46  			It("creates a droplet for the app", func() {
    47  				droplet, warnings, err := actor.CreateApplicationDroplet("some-app-guid")
    48  
    49  				Expect(err).ToNot(HaveOccurred())
    50  				Expect(warnings).To(ConsistOf("create-application-droplet-warning"))
    51  				Expect(droplet).To(Equal(Droplet{
    52  					GUID:      "some-droplet-guid",
    53  					State:     constant.DropletAwaitingUpload,
    54  					CreatedAt: "2017-08-14T21:16:42Z",
    55  					Image:     "docker/some-image",
    56  					Stack:     "penguin",
    57  				}))
    58  
    59  				Expect(fakeCloudControllerClient.CreateDropletCallCount()).To(Equal(1))
    60  				Expect(fakeCloudControllerClient.CreateDropletArgsForCall(0)).To(Equal("some-app-guid"))
    61  			})
    62  		})
    63  
    64  		When("creating the application droplet fails", func() {
    65  			var expectedErr error
    66  
    67  			BeforeEach(func() {
    68  				expectedErr = errors.New("some upload droplet error")
    69  
    70  				fakeCloudControllerClient.CreateDropletReturns(
    71  					ccv3.Droplet{},
    72  					ccv3.Warnings{"create-application-droplet-warning"},
    73  					expectedErr,
    74  				)
    75  			})
    76  
    77  			It("returns the error", func() {
    78  				_, warnings, err := actor.CreateApplicationDroplet("some-app-guid")
    79  
    80  				Expect(err).To(Equal(expectedErr))
    81  				Expect(warnings).To(ConsistOf("create-application-droplet-warning"))
    82  			})
    83  		})
    84  	})
    85  
    86  	Describe("SetApplicationDropletByApplicationNameAndSpace", func() {
    87  		When("there are no client errors", func() {
    88  			BeforeEach(func() {
    89  				fakeCloudControllerClient.GetApplicationsReturns(
    90  					[]ccv3.Application{
    91  						{GUID: "some-app-guid"},
    92  					},
    93  					ccv3.Warnings{"get-applications-warning"},
    94  					nil,
    95  				)
    96  
    97  				fakeCloudControllerClient.SetApplicationDropletReturns(
    98  					ccv3.Relationship{GUID: "some-droplet-guid"},
    99  					ccv3.Warnings{"set-application-droplet-warning"},
   100  					nil,
   101  				)
   102  			})
   103  
   104  			It("sets the app's droplet", func() {
   105  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   106  
   107  				Expect(err).ToNot(HaveOccurred())
   108  				Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
   109  
   110  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   111  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
   112  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}},
   113  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}},
   114  				))
   115  
   116  				Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1))
   117  				appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0)
   118  				Expect(appGUID).To(Equal("some-app-guid"))
   119  				Expect(dropletGUID).To(Equal("some-droplet-guid"))
   120  			})
   121  		})
   122  
   123  		When("getting the application fails", func() {
   124  			var expectedErr error
   125  
   126  			BeforeEach(func() {
   127  				expectedErr = errors.New("some get application error")
   128  
   129  				fakeCloudControllerClient.GetApplicationsReturns(
   130  					[]ccv3.Application{},
   131  					ccv3.Warnings{"get-applications-warning"},
   132  					expectedErr,
   133  				)
   134  			})
   135  
   136  			It("returns the error", func() {
   137  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   138  
   139  				Expect(err).To(Equal(expectedErr))
   140  				Expect(warnings).To(ConsistOf("get-applications-warning"))
   141  			})
   142  		})
   143  
   144  		When("setting the droplet fails", func() {
   145  			var expectedErr error
   146  			BeforeEach(func() {
   147  				expectedErr = errors.New("some set application-droplet error")
   148  				fakeCloudControllerClient.GetApplicationsReturns(
   149  					[]ccv3.Application{
   150  						{GUID: "some-app-guid"},
   151  					},
   152  					ccv3.Warnings{"get-applications-warning"},
   153  					nil,
   154  				)
   155  
   156  				fakeCloudControllerClient.SetApplicationDropletReturns(
   157  					ccv3.Relationship{},
   158  					ccv3.Warnings{"set-application-droplet-warning"},
   159  					expectedErr,
   160  				)
   161  			})
   162  
   163  			It("returns the error", func() {
   164  				warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   165  
   166  				Expect(err).To(Equal(expectedErr))
   167  				Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
   168  			})
   169  
   170  			When("the cc client response contains an UnprocessableEntityError", func() {
   171  				BeforeEach(func() {
   172  					fakeCloudControllerClient.SetApplicationDropletReturns(
   173  						ccv3.Relationship{},
   174  						ccv3.Warnings{"set-application-droplet-warning"},
   175  						ccerror.UnprocessableEntityError{Message: "some-message"},
   176  					)
   177  				})
   178  
   179  				It("raises the error as AssignDropletError and returns warnings", func() {
   180  					warnings, err := actor.SetApplicationDropletByApplicationNameAndSpace("some-app-name", "some-space-guid", "some-droplet-guid")
   181  
   182  					Expect(err).To(MatchError("some-message"))
   183  					Expect(warnings).To(ConsistOf("get-applications-warning", "set-application-droplet-warning"))
   184  				})
   185  			})
   186  
   187  		})
   188  	})
   189  
   190  	Describe("SetApplicationDroplet", func() {
   191  		When("there are no client errors", func() {
   192  			BeforeEach(func() {
   193  				fakeCloudControllerClient.SetApplicationDropletReturns(
   194  					ccv3.Relationship{GUID: "some-droplet-guid"},
   195  					ccv3.Warnings{"set-application-droplet-warning"},
   196  					nil,
   197  				)
   198  			})
   199  
   200  			It("sets the app's droplet", func() {
   201  				warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   202  
   203  				Expect(err).ToNot(HaveOccurred())
   204  				Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   205  
   206  				Expect(fakeCloudControllerClient.SetApplicationDropletCallCount()).To(Equal(1))
   207  				appGUID, dropletGUID := fakeCloudControllerClient.SetApplicationDropletArgsForCall(0)
   208  				Expect(appGUID).To(Equal("some-app-guid"))
   209  				Expect(dropletGUID).To(Equal("some-droplet-guid"))
   210  			})
   211  		})
   212  
   213  		When("setting the droplet fails", func() {
   214  			var expectedErr error
   215  
   216  			BeforeEach(func() {
   217  				expectedErr = errors.New("some set application-droplet error")
   218  
   219  				fakeCloudControllerClient.SetApplicationDropletReturns(
   220  					ccv3.Relationship{},
   221  					ccv3.Warnings{"set-application-droplet-warning"},
   222  					expectedErr,
   223  				)
   224  			})
   225  
   226  			It("returns the error", func() {
   227  				warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   228  
   229  				Expect(err).To(Equal(expectedErr))
   230  				Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   231  			})
   232  
   233  			When("the cc client response contains an UnprocessableEntityError", func() {
   234  				BeforeEach(func() {
   235  					fakeCloudControllerClient.SetApplicationDropletReturns(
   236  						ccv3.Relationship{},
   237  						ccv3.Warnings{"set-application-droplet-warning"},
   238  						ccerror.UnprocessableEntityError{Message: "some-message"},
   239  					)
   240  				})
   241  
   242  				It("raises the error as AssignDropletError and returns warnings", func() {
   243  					warnings, err := actor.SetApplicationDroplet("some-app-guid", "some-droplet-guid")
   244  
   245  					Expect(err).To(MatchError("some-message"))
   246  					Expect(warnings).To(ConsistOf("set-application-droplet-warning"))
   247  				})
   248  			})
   249  		})
   250  	})
   251  
   252  	Describe("GetApplicationDroplets", func() {
   253  		When("there are no client errors", func() {
   254  			BeforeEach(func() {
   255  				fakeCloudControllerClient.GetApplicationsReturns(
   256  					[]ccv3.Application{
   257  						{GUID: "some-app-guid"},
   258  					},
   259  					ccv3.Warnings{"get-applications-warning"},
   260  					nil,
   261  				)
   262  
   263  				fakeCloudControllerClient.GetDropletsReturns(
   264  					[]ccv3.Droplet{
   265  						{
   266  							GUID:      "some-droplet-guid-1",
   267  							State:     constant.DropletStaged,
   268  							CreatedAt: "2017-08-14T21:16:42Z",
   269  							Buildpacks: []ccv3.DropletBuildpack{
   270  								{Name: "ruby"},
   271  								{Name: "nodejs"},
   272  							},
   273  							Image: "docker/some-image",
   274  							Stack: "penguin",
   275  						},
   276  						{
   277  							GUID:      "some-droplet-guid-2",
   278  							State:     constant.DropletFailed,
   279  							CreatedAt: "2017-08-16T00:18:24Z",
   280  							Buildpacks: []ccv3.DropletBuildpack{
   281  								{Name: "java"},
   282  							},
   283  							Stack: "windows",
   284  						},
   285  					},
   286  					ccv3.Warnings{"get-application-droplets-warning"},
   287  					nil,
   288  				)
   289  			})
   290  
   291  			It("gets the app's droplets", func() {
   292  				droplets, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   293  
   294  				Expect(err).ToNot(HaveOccurred())
   295  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   296  				Expect(droplets).To(Equal([]Droplet{
   297  					{
   298  						GUID:      "some-droplet-guid-1",
   299  						State:     constant.DropletStaged,
   300  						CreatedAt: "2017-08-14T21:16:42Z",
   301  						Buildpacks: []DropletBuildpack{
   302  							{Name: "ruby"},
   303  							{Name: "nodejs"},
   304  						},
   305  						Image: "docker/some-image",
   306  						Stack: "penguin",
   307  					},
   308  					{
   309  						GUID:      "some-droplet-guid-2",
   310  						State:     constant.DropletFailed,
   311  						CreatedAt: "2017-08-16T00:18:24Z",
   312  						Buildpacks: []DropletBuildpack{
   313  							{Name: "java"},
   314  						},
   315  						Stack: "windows",
   316  					},
   317  				}))
   318  
   319  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   320  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
   321  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}},
   322  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}},
   323  				))
   324  
   325  				Expect(fakeCloudControllerClient.GetDropletsCallCount()).To(Equal(1))
   326  				Expect(fakeCloudControllerClient.GetDropletsArgsForCall(0)).To(ConsistOf(
   327  					ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}},
   328  				))
   329  			})
   330  		})
   331  
   332  		When("getting the application fails", func() {
   333  			var expectedErr error
   334  
   335  			BeforeEach(func() {
   336  				expectedErr = errors.New("some get application error")
   337  
   338  				fakeCloudControllerClient.GetApplicationsReturns(
   339  					[]ccv3.Application{},
   340  					ccv3.Warnings{"get-applications-warning"},
   341  					expectedErr,
   342  				)
   343  			})
   344  
   345  			It("returns the error", func() {
   346  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   347  
   348  				Expect(err).To(Equal(expectedErr))
   349  				Expect(warnings).To(ConsistOf("get-applications-warning"))
   350  			})
   351  		})
   352  
   353  		When("getting the application droplets fails", func() {
   354  			var expectedErr error
   355  
   356  			BeforeEach(func() {
   357  				expectedErr = errors.New("some get application error")
   358  
   359  				fakeCloudControllerClient.GetApplicationsReturns(
   360  					[]ccv3.Application{
   361  						{GUID: "some-app-guid"},
   362  					},
   363  					ccv3.Warnings{"get-applications-warning"},
   364  					nil,
   365  				)
   366  
   367  				fakeCloudControllerClient.GetDropletsReturns(
   368  					[]ccv3.Droplet{},
   369  					ccv3.Warnings{"get-application-droplets-warning"},
   370  					expectedErr,
   371  				)
   372  			})
   373  
   374  			It("returns the error", func() {
   375  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   376  
   377  				Expect(err).To(Equal(expectedErr))
   378  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   379  			})
   380  		})
   381  	})
   382  
   383  	Describe("GetCurrentDropletByApplication", func() {
   384  		var (
   385  			appGUID string
   386  
   387  			currentDroplet Droplet
   388  			warnings       Warnings
   389  			executionErr   error
   390  		)
   391  
   392  		BeforeEach(func() {
   393  			appGUID = "some-app-guid"
   394  		})
   395  
   396  		JustBeforeEach(func() {
   397  			currentDroplet, warnings, executionErr = actor.GetCurrentDropletByApplication(appGUID)
   398  		})
   399  
   400  		When("the current droplet exists", func() {
   401  			BeforeEach(func() {
   402  				fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, nil)
   403  			})
   404  
   405  			It("returns the current droplet", func() {
   406  				Expect(executionErr).ToNot(HaveOccurred())
   407  				Expect(warnings).To(ConsistOf("some-warning"))
   408  				Expect(currentDroplet).To(Equal(Droplet{GUID: "some-droplet-guid"}))
   409  
   410  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentCallCount()).To(Equal(1))
   411  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentArgsForCall(0)).To(Equal("some-app-guid"))
   412  			})
   413  		})
   414  
   415  		When("an error occurs", func() {
   416  			When("the app does not exist", func() {
   417  				BeforeEach(func() {
   418  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, ccerror.ApplicationNotFoundError{})
   419  				})
   420  
   421  				It("returns an ApplicationNotFoundError and warnings", func() {
   422  					Expect(executionErr).To(MatchError(actionerror.ApplicationNotFoundError{GUID: appGUID}))
   423  					Expect(warnings).To(ConsistOf("some-warning"))
   424  				})
   425  			})
   426  
   427  			When("the current droplet does not exist", func() {
   428  				BeforeEach(func() {
   429  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, ccerror.DropletNotFoundError{})
   430  				})
   431  
   432  				It("returns an DropletNotFoundError and warnings", func() {
   433  					Expect(executionErr).To(MatchError(actionerror.DropletNotFoundError{AppGUID: appGUID}))
   434  					Expect(warnings).To(ConsistOf("some-warning"))
   435  				})
   436  			})
   437  
   438  			When("a generic error occurs", func() {
   439  				var expectedErr error
   440  
   441  				BeforeEach(func() {
   442  					expectedErr = errors.New("some error")
   443  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, expectedErr)
   444  				})
   445  
   446  				It("returns the error and warnings", func() {
   447  					Expect(executionErr).To(MatchError(expectedErr))
   448  					Expect(warnings).To(ConsistOf("some-warning"))
   449  				})
   450  			})
   451  		})
   452  	})
   453  
   454  	Describe("UploadDroplet", func() {
   455  		var (
   456  			dropletGUID     string
   457  			dropletFilePath string
   458  			reader          io.Reader
   459  			readerLength    int64
   460  
   461  			warnings   Warnings
   462  			executeErr error
   463  		)
   464  
   465  		BeforeEach(func() {
   466  			dropletGUID = "some-droplet-guid"
   467  			dropletContents := "i am a droplet"
   468  			reader = strings.NewReader(dropletContents)
   469  			readerLength = int64(len([]byte(dropletContents)))
   470  		})
   471  
   472  		JustBeforeEach(func() {
   473  			dropletFilePath = "tmp/droplet.tgz"
   474  			warnings, executeErr = actor.UploadDroplet(dropletGUID, dropletFilePath, reader, readerLength)
   475  		})
   476  
   477  		When("the upload is successful", func() {
   478  			BeforeEach(func() {
   479  				fakeCloudControllerClient.UploadDropletBitsReturns(
   480  					ccv3.JobURL("some-job-url"),
   481  					ccv3.Warnings{"some-upload-warning"},
   482  					nil,
   483  				)
   484  
   485  				fakeCloudControllerClient.PollJobReturns(
   486  					ccv3.Warnings{"some-job-warning"},
   487  					nil,
   488  				)
   489  			})
   490  
   491  			It("returns any CC warnings", func() {
   492  				Expect(warnings).To(Equal(Warnings{"some-upload-warning", "some-job-warning"}))
   493  				Expect(executeErr).NotTo(HaveOccurred())
   494  			})
   495  		})
   496  
   497  		When("the upload returns an error", func() {
   498  			var uploadErr = errors.New("upload failed")
   499  
   500  			BeforeEach(func() {
   501  				fakeCloudControllerClient.UploadDropletBitsReturns(
   502  					"",
   503  					ccv3.Warnings{"some-upload-warning"},
   504  					uploadErr,
   505  				)
   506  			})
   507  
   508  			It("returns any warnings and the error", func() {
   509  				Expect(warnings).To(Equal(Warnings{"some-upload-warning"}))
   510  				Expect(executeErr).To(Equal(uploadErr))
   511  			})
   512  		})
   513  
   514  		When("the upload job fails eventually", func() {
   515  			var jobErr = errors.New("job failed")
   516  
   517  			BeforeEach(func() {
   518  				fakeCloudControllerClient.UploadDropletBitsReturns(
   519  					ccv3.JobURL("some-job-url"),
   520  					ccv3.Warnings{"some-upload-warning"},
   521  					nil,
   522  				)
   523  
   524  				fakeCloudControllerClient.PollJobReturns(
   525  					ccv3.Warnings{"some-job-warning"},
   526  					jobErr,
   527  				)
   528  			})
   529  
   530  			It("returns any warning and the error", func() {
   531  				Expect(warnings).To(Equal(Warnings{"some-upload-warning", "some-job-warning"}))
   532  				Expect(executeErr).To(Equal(jobErr))
   533  			})
   534  		})
   535  	})
   536  })