github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+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  
    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 *v3actionfakes.FakeCloudControllerClient
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient)
    25  		actor = NewActor(fakeCloudControllerClient, nil, nil, nil)
    26  	})
    27  
    28  	Describe("SetApplicationDroplet", func() {
    29  		Context("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.SetApplicationDroplet("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  		Context("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.SetApplicationDroplet("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  		Context("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.SetApplicationDroplet("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  			Context("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.SetApplicationDroplet("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("GetApplicationDroplets", func() {
   133  		Context("when there are no client errors", func() {
   134  			BeforeEach(func() {
   135  				fakeCloudControllerClient.GetApplicationsReturns(
   136  					[]ccv3.Application{
   137  						{GUID: "some-app-guid"},
   138  					},
   139  					ccv3.Warnings{"get-applications-warning"},
   140  					nil,
   141  				)
   142  
   143  				fakeCloudControllerClient.GetDropletsReturns(
   144  					[]ccv3.Droplet{
   145  						{
   146  							GUID:      "some-droplet-guid-1",
   147  							State:     constant.DropletStaged,
   148  							CreatedAt: "2017-08-14T21:16:42Z",
   149  							Buildpacks: []ccv3.DropletBuildpack{
   150  								{Name: "ruby"},
   151  								{Name: "nodejs"},
   152  							},
   153  							Image: "docker/some-image",
   154  							Stack: "penguin",
   155  						},
   156  						{
   157  							GUID:      "some-droplet-guid-2",
   158  							State:     constant.DropletFailed,
   159  							CreatedAt: "2017-08-16T00:18:24Z",
   160  							Buildpacks: []ccv3.DropletBuildpack{
   161  								{Name: "java"},
   162  							},
   163  							Stack: "windows",
   164  						},
   165  					},
   166  					ccv3.Warnings{"get-application-droplets-warning"},
   167  					nil,
   168  				)
   169  			})
   170  
   171  			It("gets the app's droplets", func() {
   172  				droplets, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   173  
   174  				Expect(err).ToNot(HaveOccurred())
   175  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   176  				Expect(droplets).To(Equal([]Droplet{
   177  					{
   178  						GUID:      "some-droplet-guid-1",
   179  						State:     constant.DropletStaged,
   180  						CreatedAt: "2017-08-14T21:16:42Z",
   181  						Buildpacks: []Buildpack{
   182  							{Name: "ruby"},
   183  							{Name: "nodejs"},
   184  						},
   185  						Image: "docker/some-image",
   186  						Stack: "penguin",
   187  					},
   188  					{
   189  						GUID:      "some-droplet-guid-2",
   190  						State:     constant.DropletFailed,
   191  						CreatedAt: "2017-08-16T00:18:24Z",
   192  						Buildpacks: []Buildpack{
   193  							{Name: "java"},
   194  						},
   195  						Stack: "windows",
   196  					},
   197  				}))
   198  
   199  				Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1))
   200  				Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(ConsistOf(
   201  					ccv3.Query{Key: ccv3.NameFilter, Values: []string{"some-app-name"}},
   202  					ccv3.Query{Key: ccv3.SpaceGUIDFilter, Values: []string{"some-space-guid"}},
   203  				))
   204  
   205  				Expect(fakeCloudControllerClient.GetDropletsCallCount()).To(Equal(1))
   206  				Expect(fakeCloudControllerClient.GetDropletsArgsForCall(0)).To(ConsistOf(
   207  					ccv3.Query{Key: ccv3.AppGUIDFilter, Values: []string{"some-app-guid"}},
   208  				))
   209  			})
   210  		})
   211  
   212  		Context("when getting the application fails", func() {
   213  			var expectedErr error
   214  
   215  			BeforeEach(func() {
   216  				expectedErr = errors.New("some get application error")
   217  
   218  				fakeCloudControllerClient.GetApplicationsReturns(
   219  					[]ccv3.Application{},
   220  					ccv3.Warnings{"get-applications-warning"},
   221  					expectedErr,
   222  				)
   223  			})
   224  
   225  			It("returns the error", func() {
   226  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   227  
   228  				Expect(err).To(Equal(expectedErr))
   229  				Expect(warnings).To(ConsistOf("get-applications-warning"))
   230  			})
   231  		})
   232  
   233  		Context("when getting the application droplets fails", func() {
   234  			var expectedErr error
   235  
   236  			BeforeEach(func() {
   237  				expectedErr = errors.New("some get application error")
   238  
   239  				fakeCloudControllerClient.GetApplicationsReturns(
   240  					[]ccv3.Application{
   241  						{GUID: "some-app-guid"},
   242  					},
   243  					ccv3.Warnings{"get-applications-warning"},
   244  					nil,
   245  				)
   246  
   247  				fakeCloudControllerClient.GetDropletsReturns(
   248  					[]ccv3.Droplet{},
   249  					ccv3.Warnings{"get-application-droplets-warning"},
   250  					expectedErr,
   251  				)
   252  			})
   253  
   254  			It("returns the error", func() {
   255  				_, warnings, err := actor.GetApplicationDroplets("some-app-name", "some-space-guid")
   256  
   257  				Expect(err).To(Equal(expectedErr))
   258  				Expect(warnings).To(ConsistOf("get-applications-warning", "get-application-droplets-warning"))
   259  			})
   260  		})
   261  	})
   262  
   263  	Describe("GetCurrentDropletByApplication", func() {
   264  		var (
   265  			appGUID string
   266  
   267  			currentDroplet Droplet
   268  			warnings       Warnings
   269  			executionErr   error
   270  		)
   271  
   272  		BeforeEach(func() {
   273  			appGUID = "some-app-guid"
   274  		})
   275  
   276  		JustBeforeEach(func() {
   277  			currentDroplet, warnings, executionErr = actor.GetCurrentDropletByApplication(appGUID)
   278  		})
   279  
   280  		Context("when the current droplet exists", func() {
   281  			BeforeEach(func() {
   282  				fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, nil)
   283  			})
   284  
   285  			It("returns the current droplet", func() {
   286  				Expect(executionErr).ToNot(HaveOccurred())
   287  				Expect(warnings).To(ConsistOf("some-warning"))
   288  				Expect(currentDroplet).To(Equal(Droplet{GUID: "some-droplet-guid"}))
   289  
   290  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentCallCount()).To(Equal(1))
   291  				Expect(fakeCloudControllerClient.GetApplicationDropletCurrentArgsForCall(0)).To(Equal("some-app-guid"))
   292  			})
   293  		})
   294  
   295  		Context("when an error occurs", func() {
   296  			Context("when the app does not exist", func() {
   297  				BeforeEach(func() {
   298  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{GUID: "some-droplet-guid"}, ccv3.Warnings{"some-warning"}, ccerror.ApplicationNotFoundError{})
   299  				})
   300  
   301  				It("returns an ApplicationNotFoundError and warnings", func() {
   302  					Expect(executionErr).To(MatchError(actionerror.ApplicationNotFoundError{GUID: appGUID}))
   303  					Expect(warnings).To(ConsistOf("some-warning"))
   304  				})
   305  			})
   306  
   307  			Context("when the current droplet does not exist", func() {
   308  				BeforeEach(func() {
   309  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, ccerror.DropletNotFoundError{})
   310  				})
   311  
   312  				It("returns an DropletNotFoundError and warnings", func() {
   313  					Expect(executionErr).To(MatchError(actionerror.DropletNotFoundError{AppGUID: appGUID}))
   314  					Expect(warnings).To(ConsistOf("some-warning"))
   315  				})
   316  			})
   317  
   318  			Context("when a generic error occurs", func() {
   319  				var expectedErr error
   320  
   321  				BeforeEach(func() {
   322  					expectedErr = errors.New("some error")
   323  					fakeCloudControllerClient.GetApplicationDropletCurrentReturns(ccv3.Droplet{}, ccv3.Warnings{"some-warning"}, expectedErr)
   324  				})
   325  
   326  				It("returns the error and warnings", func() {
   327  					Expect(executionErr).To(MatchError(expectedErr))
   328  					Expect(warnings).To(ConsistOf("some-warning"))
   329  				})
   330  			})
   331  		})
   332  	})
   333  })