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