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