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 })