github.com/pivotal-cf/go-pivnet/v6@v6.0.2/release_dependencies_test.go (about) 1 package pivnet_test 2 3 import ( 4 "fmt" 5 "github.com/pivotal-cf/go-pivnet/v6/go-pivnetfakes" 6 "net/http" 7 8 "github.com/onsi/gomega/ghttp" 9 "github.com/pivotal-cf/go-pivnet/v6" 10 "github.com/pivotal-cf/go-pivnet/v6/logger" 11 "github.com/pivotal-cf/go-pivnet/v6/logger/loggerfakes" 12 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("PivnetClient - release dependencies", func() { 18 var ( 19 server *ghttp.Server 20 client pivnet.Client 21 apiAddress string 22 userAgent string 23 24 newClientConfig pivnet.ClientConfig 25 fakeLogger logger.Logger 26 fakeAccessTokenService *gopivnetfakes.FakeAccessTokenService 27 28 productSlug string 29 releaseID int 30 ) 31 32 BeforeEach(func() { 33 server = ghttp.NewServer() 34 apiAddress = server.URL() 35 userAgent = "pivnet-resource/0.1.0 (some-url)" 36 37 productSlug = "some-product" 38 releaseID = 2345 39 40 fakeLogger = &loggerfakes.FakeLogger{} 41 fakeAccessTokenService = &gopivnetfakes.FakeAccessTokenService{} 42 newClientConfig = pivnet.ClientConfig{ 43 Host: apiAddress, 44 UserAgent: userAgent, 45 } 46 client = pivnet.NewClient(fakeAccessTokenService, newClientConfig, fakeLogger) 47 }) 48 49 AfterEach(func() { 50 server.Close() 51 }) 52 53 Describe("Get", func() { 54 It("returns the release dependencies", func() { 55 56 response := pivnet.ReleaseDependenciesResponse{ 57 ReleaseDependencies: []pivnet.ReleaseDependency{ 58 { 59 Release: pivnet.DependentRelease{ 60 ID: 9876, 61 Version: "release 9876", 62 Product: pivnet.Product{ 63 ID: 23, 64 Name: "Product 23", 65 }, 66 }, 67 }, 68 { 69 Release: pivnet.DependentRelease{ 70 ID: 8765, 71 Version: "release 8765", 72 Product: pivnet.Product{ 73 ID: 23, 74 Name: "Product 23", 75 }, 76 }, 77 }, 78 }, 79 } 80 81 server.AppendHandlers( 82 ghttp.CombineHandlers( 83 ghttp.VerifyRequest("GET", fmt.Sprintf( 84 "%s/products/%s/releases/%d/dependencies", 85 apiPrefix, 86 productSlug, 87 releaseID, 88 )), 89 ghttp.RespondWithJSONEncoded(http.StatusOK, response), 90 ), 91 ) 92 93 releaseDependencies, err := client.ReleaseDependencies.List(productSlug, releaseID) 94 Expect(err).NotTo(HaveOccurred()) 95 96 Expect(releaseDependencies).To(HaveLen(2)) 97 Expect(releaseDependencies[0].Release.ID).To(Equal(9876)) 98 Expect(releaseDependencies[1].Release.ID).To(Equal(8765)) 99 }) 100 101 Context("when the server responds with a non-2XX status code", func() { 102 var ( 103 body []byte 104 ) 105 106 BeforeEach(func() { 107 body = []byte(`{"message":"foo message"}`) 108 }) 109 110 BeforeEach(func() { 111 server.AppendHandlers( 112 ghttp.CombineHandlers( 113 ghttp.VerifyRequest("GET", fmt.Sprintf( 114 "%s/products/%s/releases/%d/dependencies", 115 apiPrefix, 116 productSlug, 117 releaseID, 118 )), 119 ghttp.RespondWith(http.StatusTeapot, body), 120 ), 121 ) 122 }) 123 124 It("returns an error", func() { 125 _, err := client.ReleaseDependencies.List(productSlug, releaseID) 126 Expect(err.Error()).To(ContainSubstring("foo message")) 127 }) 128 }) 129 130 Context("when the json unmarshalling fails with error", func() { 131 It("forwards the error", func() { 132 server.AppendHandlers( 133 ghttp.CombineHandlers( 134 ghttp.VerifyRequest("GET", fmt.Sprintf( 135 "%s/products/%s/releases/%d/dependencies", 136 apiPrefix, 137 productSlug, 138 releaseID, 139 )), 140 ghttp.RespondWith(http.StatusTeapot, "%%%"), 141 ), 142 ) 143 144 _, err := client.ReleaseDependencies.List(productSlug, releaseID) 145 Expect(err).To(HaveOccurred()) 146 147 Expect(err.Error()).To(ContainSubstring("invalid character")) 148 }) 149 }) 150 }) 151 152 Describe("Add", func() { 153 var ( 154 dependentReleaseID int 155 ) 156 157 BeforeEach(func() { 158 dependentReleaseID = 1234 159 }) 160 161 It("adds the release dependency", func() { 162 expectedRequestBody := `{"dependency":{"release_id":1234}}` 163 164 server.AppendHandlers( 165 ghttp.CombineHandlers( 166 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 167 "%s/products/%s/releases/%d/add_dependency", 168 apiPrefix, 169 productSlug, 170 releaseID, 171 )), 172 ghttp.VerifyJSON(expectedRequestBody), 173 ghttp.RespondWithJSONEncoded(http.StatusNoContent, nil), 174 ), 175 ) 176 177 err := client.ReleaseDependencies.Add( 178 productSlug, 179 releaseID, 180 dependentReleaseID, 181 ) 182 Expect(err).NotTo(HaveOccurred()) 183 }) 184 185 Context("when the server responds with a non-2XX status code", func() { 186 var ( 187 body []byte 188 ) 189 190 BeforeEach(func() { 191 body = []byte(`{"message":"foo message"}`) 192 }) 193 194 BeforeEach(func() { 195 server.AppendHandlers( 196 ghttp.CombineHandlers( 197 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 198 "%s/products/%s/releases/%d/add_dependency", 199 apiPrefix, 200 productSlug, 201 releaseID, 202 )), 203 ghttp.RespondWith(http.StatusTeapot, body), 204 ), 205 ) 206 }) 207 208 It("returns an error", func() { 209 err := client.ReleaseDependencies.Add( 210 productSlug, 211 releaseID, 212 dependentReleaseID, 213 ) 214 Expect(err.Error()).To(ContainSubstring("foo message")) 215 }) 216 }) 217 218 Context("when the json unmarshalling fails with error", func() { 219 It("forwards the error", func() { 220 server.AppendHandlers( 221 ghttp.CombineHandlers( 222 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 223 "%s/products/%s/releases/%d/add_dependency", 224 apiPrefix, 225 productSlug, 226 releaseID, 227 )), 228 ghttp.RespondWith(http.StatusTeapot, "%%%"), 229 ), 230 ) 231 232 err := client.ReleaseDependencies.Add( 233 productSlug, 234 releaseID, 235 dependentReleaseID, 236 ) 237 Expect(err).To(HaveOccurred()) 238 239 Expect(err.Error()).To(ContainSubstring("invalid character")) 240 }) 241 }) 242 }) 243 244 Describe("Remove", func() { 245 var ( 246 dependentReleaseID int 247 ) 248 249 BeforeEach(func() { 250 dependentReleaseID = 1234 251 }) 252 253 It("removes the release dependency", func() { 254 expectedRequestBody := `{"dependency":{"release_id":1234}}` 255 256 server.AppendHandlers( 257 ghttp.CombineHandlers( 258 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 259 "%s/products/%s/releases/%d/remove_dependency", 260 apiPrefix, 261 productSlug, 262 releaseID, 263 )), 264 ghttp.VerifyJSON(expectedRequestBody), 265 ghttp.RespondWithJSONEncoded(http.StatusNoContent, nil), 266 ), 267 ) 268 269 err := client.ReleaseDependencies.Remove( 270 productSlug, 271 releaseID, 272 dependentReleaseID, 273 ) 274 Expect(err).NotTo(HaveOccurred()) 275 }) 276 277 Context("when the server responds with a non-2XX status code", func() { 278 var ( 279 body []byte 280 ) 281 282 BeforeEach(func() { 283 body = []byte(`{"message":"foo message"}`) 284 }) 285 286 BeforeEach(func() { 287 server.AppendHandlers( 288 ghttp.CombineHandlers( 289 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 290 "%s/products/%s/releases/%d/remove_dependency", 291 apiPrefix, 292 productSlug, 293 releaseID, 294 )), 295 ghttp.RespondWith(http.StatusTeapot, body), 296 ), 297 ) 298 }) 299 300 It("returns an error", func() { 301 err := client.ReleaseDependencies.Remove( 302 productSlug, 303 releaseID, 304 dependentReleaseID, 305 ) 306 Expect(err.Error()).To(ContainSubstring("foo message")) 307 }) 308 }) 309 310 Context("when the json unmarshalling fails with error", func() { 311 It("forwards the error", func() { 312 server.AppendHandlers( 313 ghttp.CombineHandlers( 314 ghttp.VerifyRequest("PATCH", fmt.Sprintf( 315 "%s/products/%s/releases/%d/remove_dependency", 316 apiPrefix, 317 productSlug, 318 releaseID, 319 )), 320 ghttp.RespondWith(http.StatusTeapot, "%%%"), 321 ), 322 ) 323 324 err := client.ReleaseDependencies.Remove( 325 productSlug, 326 releaseID, 327 dependentReleaseID, 328 ) 329 Expect(err).To(HaveOccurred()) 330 331 Expect(err.Error()).To(ContainSubstring("invalid character")) 332 }) 333 }) 334 }) 335 })