From 832bcbc5c46db261324d03b0e8794952dc85dc56 Mon Sep 17 00:00:00 2001 From: Ivan Wang Date: Thu, 26 Sep 2019 16:03:46 -0400 Subject: [PATCH] implement add image reference to release [#168464628] Signed-off-by: Ivan Wang --- image_references.go | 38 ++++++++++++++++++++ image_references_test.go | 77 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/image_references.go b/image_references.go index 341b447..4d864dc 100644 --- a/image_references.go +++ b/image_references.go @@ -81,6 +81,44 @@ func (p ImageReferencesService) Create(config CreateImageReferenceConfig) (Image return response.ImageReference, nil } +func (p ImageReferencesService) AddToRelease( + productSlug string, + releaseID int, + imageReferenceID int, +) error { + url := fmt.Sprintf( + "/products/%s/releases/%d/add_image_reference", + productSlug, + releaseID, + ) + + body := createUpdateImageReferenceBody{ + ImageReference: ImageReference{ + ID: imageReferenceID, + }, + } + + b, err := json.Marshal(body) + if err != nil { + // Untested as we cannot force an error because we are marshalling + // a known-good body + return err + } + + resp, err := p.client.MakeRequest( + "PATCH", + url, + http.StatusNoContent, + bytes.NewReader(b), + ) + if err != nil { + return err + } + defer resp.Body.Close() + + return nil +} + type createUpdateImageReferenceBody struct { ImageReference ImageReference `json:"image_reference"` } diff --git a/image_references_test.go b/image_references_test.go index 4c107fb..7b55559 100644 --- a/image_references_test.go +++ b/image_references_test.go @@ -174,4 +174,81 @@ var _ = Describe("PivnetClient - image references", func() { }) }) + Describe("Add Image Reference to release", func() { + var ( + productSlug = "some-product" + releaseID = 2345 + imageReferenceID = 3456 + + expectedRequestBody = `{"image_reference":{"id":3456}}` + ) + + Context("when the server responds with a 204 status code", func() { + It("returns without error", func() { + server.AppendHandlers( + ghttp.CombineHandlers( + ghttp.VerifyRequest("PATCH", fmt.Sprintf( + "%s/products/%s/releases/%d/add_image_reference", + apiPrefix, + productSlug, + releaseID, + )), + ghttp.VerifyJSON(expectedRequestBody), + ghttp.RespondWith(http.StatusNoContent, nil), + ), + ) + + err := client.ImageReferences.AddToRelease(productSlug, releaseID, imageReferenceID) + Expect(err).NotTo(HaveOccurred()) + }) + }) + + Context("when the server responds with a non-204 status code", func() { + var ( + response interface{} + ) + + BeforeEach(func() { + response = pivnetErr{Message: "foo message"} + }) + + It("returns an error", func() { + server.AppendHandlers( + ghttp.CombineHandlers( + ghttp.VerifyRequest("PATCH", fmt.Sprintf( + "%s/products/%s/releases/%d/add_image_reference", + apiPrefix, + productSlug, + releaseID, + )), + ghttp.RespondWithJSONEncoded(http.StatusTeapot, response), + ), + ) + + err := client.ImageReferences.AddToRelease(productSlug, releaseID, imageReferenceID) + Expect(err.Error()).To(ContainSubstring("foo message")) + }) + }) + + Context("when the json unmarshalling fails with error", func() { + It("forwards the error", func() { + server.AppendHandlers( + ghttp.CombineHandlers( + ghttp.VerifyRequest("PATCH", fmt.Sprintf( + "%s/products/%s/releases/%d/add_image_reference", + apiPrefix, + productSlug, + releaseID, + )), + ghttp.RespondWith(http.StatusTeapot, "%%%"), + ), + ) + + err := client.ImageReferences.AddToRelease(productSlug, releaseID, imageReferenceID) + Expect(err).To(HaveOccurred()) + + Expect(err.Error()).To(ContainSubstring("invalid character")) + }) + }) + }) })