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