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