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