github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/actor/v7action/droplet_test.go (about)

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