github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/api/cloudcontroller/ccv3/droplet_test.go (about) 1 package ccv3_test 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 . "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 10 . "github.com/onsi/ginkgo" 11 . "github.com/onsi/gomega" 12 . "github.com/onsi/gomega/ghttp" 13 ) 14 15 var _ = Describe("Droplet", func() { 16 var client *Client 17 18 BeforeEach(func() { 19 client = NewTestClient() 20 }) 21 22 Describe("GetApplicationDroplets", func() { 23 Context("when the application exists", func() { 24 BeforeEach(func() { 25 response1 := fmt.Sprintf(`{ 26 "pagination": { 27 "next": { 28 "href": "%s/v3/apps/some-app-guid/droplets?current=true&per_page=2&page=2" 29 } 30 }, 31 "resources": [ 32 { 33 "guid": "some-guid-1", 34 "stack": "some-stack-1", 35 "buildpacks": [{ 36 "name": "some-buildpack-1", 37 "detect_output": "detected-buildpack-1" 38 }], 39 "state": "STAGED", 40 "created_at": "2017-08-16T00:18:24Z", 41 "links": { 42 "package": "https://api.com/v3/packages/some-package-guid" 43 } 44 }, 45 { 46 "guid": "some-guid-2", 47 "stack": "some-stack-2", 48 "buildpacks": [{ 49 "name": "some-buildpack-2", 50 "detect_output": "detected-buildpack-2" 51 }], 52 "state": "COPYING", 53 "created_at": "2017-08-16T00:19:05Z" 54 } 55 ] 56 }`, server.URL()) 57 response2 := `{ 58 "pagination": { 59 "next": null 60 }, 61 "resources": [ 62 { 63 "guid": "some-guid-3", 64 "stack": "some-stack-3", 65 "buildpacks": [{ 66 "name": "some-buildpack-3", 67 "detect_output": "detected-buildpack-3" 68 }], 69 "state": "FAILED", 70 "created_at": "2017-08-22T17:55:02Z" 71 } 72 ] 73 }` 74 server.AppendHandlers( 75 CombineHandlers( 76 VerifyRequest(http.MethodGet, "/v3/apps/some-app-guid/droplets", "current=true&per_page=2"), 77 RespondWith(http.StatusOK, response1, http.Header{"X-Cf-Warnings": {"warning-1"}}), 78 ), 79 ) 80 server.AppendHandlers( 81 CombineHandlers( 82 VerifyRequest(http.MethodGet, "/v3/apps/some-app-guid/droplets", "current=true&per_page=2&page=2"), 83 RespondWith(http.StatusOK, response2, http.Header{"X-Cf-Warnings": {"warning-2"}}), 84 ), 85 ) 86 }) 87 88 It("returns the current droplet for the given app and all warnings", func() { 89 droplets, warnings, err := client.GetApplicationDroplets("some-app-guid", url.Values{"per_page": []string{"2"}, "current": []string{"true"}}) 90 Expect(err).ToNot(HaveOccurred()) 91 Expect(droplets).To(HaveLen(3)) 92 93 Expect(droplets[0]).To(Equal(Droplet{ 94 GUID: "some-guid-1", 95 Stack: "some-stack-1", 96 State: "STAGED", 97 Buildpacks: []DropletBuildpack{ 98 { 99 Name: "some-buildpack-1", 100 DetectOutput: "detected-buildpack-1", 101 }, 102 }, 103 CreatedAt: "2017-08-16T00:18:24Z", 104 })) 105 Expect(droplets[1]).To(Equal(Droplet{ 106 GUID: "some-guid-2", 107 Stack: "some-stack-2", 108 State: "COPYING", 109 Buildpacks: []DropletBuildpack{ 110 { 111 Name: "some-buildpack-2", 112 DetectOutput: "detected-buildpack-2", 113 }, 114 }, 115 CreatedAt: "2017-08-16T00:19:05Z", 116 })) 117 Expect(droplets[2]).To(Equal(Droplet{ 118 GUID: "some-guid-3", 119 Stack: "some-stack-3", 120 State: "FAILED", 121 Buildpacks: []DropletBuildpack{ 122 { 123 Name: "some-buildpack-3", 124 DetectOutput: "detected-buildpack-3", 125 }, 126 }, 127 CreatedAt: "2017-08-22T17:55:02Z", 128 })) 129 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 130 }) 131 }) 132 133 Context("when cloud controller returns an error", func() { 134 BeforeEach(func() { 135 response := `{ 136 "errors": [ 137 { 138 "code": 10010, 139 "detail": "App not found", 140 "title": "CF-ResourceNotFound" 141 } 142 ] 143 }` 144 server.AppendHandlers( 145 CombineHandlers( 146 VerifyRequest(http.MethodGet, "/v3/apps/some-app-guid/droplets"), 147 RespondWith(http.StatusNotFound, response), 148 ), 149 ) 150 }) 151 152 It("returns the error", func() { 153 _, _, err := client.GetApplicationDroplets("some-app-guid", url.Values{}) 154 Expect(err).To(MatchError(ccerror.ApplicationNotFoundError{})) 155 }) 156 }) 157 }) 158 159 Describe("GetDroplet", func() { 160 Context("when the request succeeds", func() { 161 BeforeEach(func() { 162 response := `{ 163 "guid": "some-guid", 164 "state": "STAGED", 165 "error": null, 166 "lifecycle": { 167 "type": "buildpack", 168 "data": {} 169 }, 170 "buildpacks": [ 171 { 172 "name": "some-buildpack", 173 "detect_output": "detected-buildpack" 174 } 175 ], 176 "image": "docker/some-image", 177 "stack": "some-stack", 178 "created_at": "2016-03-28T23:39:34Z", 179 "updated_at": "2016-03-28T23:39:47Z" 180 }` 181 server.AppendHandlers( 182 CombineHandlers( 183 VerifyRequest(http.MethodGet, "/v3/droplets/some-guid"), 184 RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"warning-1"}}), 185 ), 186 ) 187 }) 188 189 It("returns the given droplet and all warnings", func() { 190 droplet, warnings, err := client.GetDroplet("some-guid") 191 Expect(err).ToNot(HaveOccurred()) 192 193 Expect(droplet).To(Equal(Droplet{ 194 GUID: "some-guid", 195 Stack: "some-stack", 196 State: "STAGED", 197 Buildpacks: []DropletBuildpack{ 198 { 199 Name: "some-buildpack", 200 DetectOutput: "detected-buildpack", 201 }, 202 }, 203 Image: "docker/some-image", 204 CreatedAt: "2016-03-28T23:39:34Z", 205 })) 206 Expect(warnings).To(ConsistOf("warning-1")) 207 }) 208 }) 209 210 Context("when cloud controller returns an error", func() { 211 BeforeEach(func() { 212 response := `{ 213 "errors": [ 214 { 215 "code": 10010, 216 "detail": "Droplet not found", 217 "title": "CF-ResourceNotFound" 218 } 219 ] 220 }` 221 server.AppendHandlers( 222 CombineHandlers( 223 VerifyRequest(http.MethodGet, "/v3/droplets/some-guid"), 224 RespondWith(http.StatusNotFound, response), 225 ), 226 ) 227 }) 228 229 It("returns the error", func() { 230 _, _, err := client.GetDroplet("some-guid") 231 Expect(err).To(MatchError(ccerror.DropletNotFoundError{})) 232 }) 233 }) 234 }) 235 })