github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv3/droplet_test.go (about) 1 package ccv3_test 2 3 import ( 4 "code.cloudfoundry.org/cli/resources" 5 "fmt" 6 "net/http" 7 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 . "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 . "github.com/onsi/gomega/ghttp" 14 ) 15 16 var _ = Describe("Droplet", func() { 17 var client *Client 18 19 BeforeEach(func() { 20 client, _ = NewTestClient() 21 }) 22 23 Describe("GetApplicationDropletCurrent", func() { 24 var ( 25 droplet resources.Droplet 26 warnings Warnings 27 executeErr error 28 ) 29 30 JustBeforeEach(func() { 31 droplet, warnings, executeErr = client.GetApplicationDropletCurrent("some-guid") 32 }) 33 34 When("the request succeeds", func() { 35 BeforeEach(func() { 36 response := `{ 37 "guid": "some-guid", 38 "state": "STAGED", 39 "error": null, 40 "lifecycle": { 41 "type": "buildpack", 42 "data": {} 43 }, 44 "buildpacks": [ 45 { 46 "name": "some-buildpack", 47 "detect_output": "detected-buildpack" 48 } 49 ], 50 "image": "docker/some-image", 51 "stack": "some-stack", 52 "created_at": "2016-03-28T23:39:34Z", 53 "updated_at": "2016-03-28T23:39:47Z" 54 }` 55 server.AppendHandlers( 56 CombineHandlers( 57 VerifyRequest(http.MethodGet, "/v3/apps/some-guid/droplets/current"), 58 RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 59 ), 60 ) 61 }) 62 63 It("returns the given droplet and all warnings", func() { 64 Expect(executeErr).ToNot(HaveOccurred()) 65 66 Expect(droplet).To(Equal(resources.Droplet{ 67 GUID: "some-guid", 68 Stack: "some-stack", 69 State: constant.DropletStaged, 70 Buildpacks: []resources.DropletBuildpack{ 71 { 72 Name: "some-buildpack", 73 DetectOutput: "detected-buildpack", 74 }, 75 }, 76 Image: "docker/some-image", 77 CreatedAt: "2016-03-28T23:39:34Z", 78 })) 79 Expect(warnings).To(ConsistOf("warning-1")) 80 }) 81 }) 82 83 When("cloud controller returns an error", func() { 84 BeforeEach(func() { 85 response := `{ 86 "errors": [ 87 { 88 "code": 10010, 89 "detail": "Droplet not found", 90 "title": "CF-ResourceNotFound" 91 } 92 ] 93 }` 94 server.AppendHandlers( 95 CombineHandlers( 96 VerifyRequest(http.MethodGet, "/v3/apps/some-guid/droplets/current"), 97 RespondWith(http.StatusNotFound, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 98 ), 99 ) 100 }) 101 102 It("returns the error and all given warnings", func() { 103 Expect(executeErr).To(MatchError(ccerror.DropletNotFoundError{})) 104 Expect(warnings).To(ConsistOf("warning-1")) 105 }) 106 }) 107 }) 108 109 Describe("GetDroplet", func() { 110 var ( 111 droplet resources.Droplet 112 warnings Warnings 113 executeErr error 114 ) 115 116 JustBeforeEach(func() { 117 droplet, warnings, executeErr = client.GetDroplet("some-guid") 118 }) 119 120 When("the request succeeds", func() { 121 BeforeEach(func() { 122 response := `{ 123 "guid": "some-guid", 124 "state": "STAGED", 125 "error": null, 126 "lifecycle": { 127 "type": "buildpack", 128 "data": {} 129 }, 130 "buildpacks": [ 131 { 132 "name": "some-buildpack", 133 "detect_output": "detected-buildpack" 134 } 135 ], 136 "image": "docker/some-image", 137 "stack": "some-stack", 138 "created_at": "2016-03-28T23:39:34Z", 139 "updated_at": "2016-03-28T23:39:47Z" 140 }` 141 server.AppendHandlers( 142 CombineHandlers( 143 VerifyRequest(http.MethodGet, "/v3/droplets/some-guid"), 144 RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 145 ), 146 ) 147 }) 148 149 It("returns the given droplet and all warnings", func() { 150 Expect(executeErr).ToNot(HaveOccurred()) 151 152 Expect(droplet).To(Equal(resources.Droplet{ 153 GUID: "some-guid", 154 Stack: "some-stack", 155 State: constant.DropletStaged, 156 Buildpacks: []resources.DropletBuildpack{ 157 { 158 Name: "some-buildpack", 159 DetectOutput: "detected-buildpack", 160 }, 161 }, 162 Image: "docker/some-image", 163 CreatedAt: "2016-03-28T23:39:34Z", 164 })) 165 Expect(warnings).To(ConsistOf("warning-1")) 166 }) 167 }) 168 169 When("cloud controller returns an error", func() { 170 BeforeEach(func() { 171 response := `{ 172 "errors": [ 173 { 174 "code": 10010, 175 "detail": "Droplet not found", 176 "title": "CF-ResourceNotFound" 177 } 178 ] 179 }` 180 server.AppendHandlers( 181 CombineHandlers( 182 VerifyRequest(http.MethodGet, "/v3/droplets/some-guid"), 183 RespondWith(http.StatusNotFound, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 184 ), 185 ) 186 }) 187 188 It("returns the error", func() { 189 Expect(executeErr).To(MatchError(ccerror.DropletNotFoundError{})) 190 Expect(warnings).To(ConsistOf("warning-1")) 191 }) 192 }) 193 }) 194 195 Describe("GetDroplets", func() { 196 var ( 197 droplets []resources.Droplet 198 warnings Warnings 199 executeErr error 200 ) 201 202 JustBeforeEach(func() { 203 droplets, warnings, executeErr = client.GetDroplets( 204 Query{Key: AppGUIDFilter, Values: []string{"some-app-guid"}}, 205 Query{Key: PerPage, Values: []string{"2"}}, 206 ) 207 }) 208 209 When("the CC returns back droplets", func() { 210 BeforeEach(func() { 211 response1 := fmt.Sprintf(`{ 212 "pagination": { 213 "next": { 214 "href": "%s/v3/droplets?app_guids=some-app-guid&per_page=2&page=2" 215 } 216 }, 217 "resources": [ 218 { 219 "guid": "some-guid-1", 220 "stack": "some-stack-1", 221 "buildpacks": [{ 222 "name": "some-buildpack-1", 223 "detect_output": "detected-buildpack-1" 224 }], 225 "state": "STAGED", 226 "created_at": "2017-08-16T00:18:24Z", 227 "links": { 228 "package": "https://api.com/v3/packages/some-package-guid" 229 } 230 }, 231 { 232 "guid": "some-guid-2", 233 "stack": "some-stack-2", 234 "buildpacks": [{ 235 "name": "some-buildpack-2", 236 "detect_output": "detected-buildpack-2" 237 }], 238 "state": "COPYING", 239 "created_at": "2017-08-16T00:19:05Z" 240 } 241 ] 242 }`, server.URL()) 243 response2 := `{ 244 "pagination": { 245 "next": null 246 }, 247 "resources": [ 248 { 249 "guid": "some-guid-3", 250 "stack": "some-stack-3", 251 "buildpacks": [{ 252 "name": "some-buildpack-3", 253 "detect_output": "detected-buildpack-3" 254 }], 255 "state": "FAILED", 256 "created_at": "2017-08-22T17:55:02Z" 257 } 258 ] 259 }` 260 server.AppendHandlers( 261 CombineHandlers( 262 VerifyRequest(http.MethodGet, "/v3/droplets", "app_guids=some-app-guid&per_page=2"), 263 RespondWith(http.StatusOK, response1, http.Header{"X-Cf-Warnings": {"warning-1"}}), 264 ), 265 ) 266 server.AppendHandlers( 267 CombineHandlers( 268 VerifyRequest(http.MethodGet, "/v3/droplets", "app_guids=some-app-guid&per_page=2&page=2"), 269 RespondWith(http.StatusOK, response2, http.Header{"X-Cf-Warnings": {"warning-2"}}), 270 ), 271 ) 272 }) 273 274 It("returns the droplets and all warnings", func() { 275 Expect(executeErr).ToNot(HaveOccurred()) 276 Expect(droplets).To(HaveLen(3)) 277 278 Expect(droplets[0]).To(Equal(resources.Droplet{ 279 GUID: "some-guid-1", 280 Stack: "some-stack-1", 281 State: constant.DropletStaged, 282 Buildpacks: []resources.DropletBuildpack{ 283 { 284 Name: "some-buildpack-1", 285 DetectOutput: "detected-buildpack-1", 286 }, 287 }, 288 CreatedAt: "2017-08-16T00:18:24Z", 289 })) 290 Expect(droplets[1]).To(Equal(resources.Droplet{ 291 GUID: "some-guid-2", 292 Stack: "some-stack-2", 293 State: constant.DropletCopying, 294 Buildpacks: []resources.DropletBuildpack{ 295 { 296 Name: "some-buildpack-2", 297 DetectOutput: "detected-buildpack-2", 298 }, 299 }, 300 CreatedAt: "2017-08-16T00:19:05Z", 301 })) 302 Expect(droplets[2]).To(Equal(resources.Droplet{ 303 GUID: "some-guid-3", 304 Stack: "some-stack-3", 305 State: constant.DropletFailed, 306 Buildpacks: []resources.DropletBuildpack{ 307 { 308 Name: "some-buildpack-3", 309 DetectOutput: "detected-buildpack-3", 310 }, 311 }, 312 CreatedAt: "2017-08-22T17:55:02Z", 313 })) 314 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 315 }) 316 }) 317 318 When("cloud controller returns an error", func() { 319 BeforeEach(func() { 320 response := `{ 321 "errors": [ 322 { 323 "code": 10010, 324 "detail": "App not found", 325 "title": "CF-ResourceNotFound" 326 } 327 ] 328 }` 329 server.AppendHandlers( 330 CombineHandlers( 331 VerifyRequest(http.MethodGet, "/v3/droplets", "app_guids=some-app-guid&per_page=2"), 332 RespondWith(http.StatusNotFound, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 333 ), 334 ) 335 }) 336 337 It("returns the error", func() { 338 Expect(executeErr).To(MatchError(ccerror.ApplicationNotFoundError{})) 339 Expect(warnings).To(ConsistOf("warning-1")) 340 }) 341 }) 342 }) 343 })