github.com/pivotal-cf/go-pivnet/v6@v6.0.2/eulas_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 - EULA", func() {
    18  	var (
    19  		server     *ghttp.Server
    20  		client     pivnet.Client
    21  		token      string
    22  		apiAddress string
    23  		userAgent  string
    24  
    25  		newClientConfig        pivnet.ClientConfig
    26  		fakeLogger             logger.Logger
    27  		fakeAccessTokenService *gopivnetfakes.FakeAccessTokenService
    28  	)
    29  
    30  	BeforeEach(func() {
    31  		server = ghttp.NewServer()
    32  		apiAddress = server.URL()
    33  		token = "my-auth-token"
    34  		userAgent = "pivnet-resource/0.1.0 (some-url)"
    35  
    36  		fakeLogger = &loggerfakes.FakeLogger{}
    37  		fakeAccessTokenService = &gopivnetfakes.FakeAccessTokenService{}
    38  		newClientConfig = pivnet.ClientConfig{
    39  			Host:      apiAddress,
    40  			UserAgent: userAgent,
    41  		}
    42  		client = pivnet.NewClient(fakeAccessTokenService, newClientConfig, fakeLogger)
    43  	})
    44  
    45  	AfterEach(func() {
    46  		server.Close()
    47  	})
    48  
    49  	Describe("List", func() {
    50  		It("returns all EULAs", func() {
    51  			response := `{"eulas": [{"id":1,"name":"eula1"},{"id": 2,"name":"eula2"}]}`
    52  
    53  			server.AppendHandlers(
    54  				ghttp.CombineHandlers(
    55  					ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas", apiPrefix)),
    56  					ghttp.RespondWith(http.StatusOK, response),
    57  				),
    58  			)
    59  
    60  			eulas, err := client.EULA.List()
    61  			Expect(err).NotTo(HaveOccurred())
    62  
    63  			Expect(eulas).To(HaveLen(2))
    64  
    65  			Expect(eulas[0].ID).To(Equal(1))
    66  			Expect(eulas[0].Name).To(Equal("eula1"))
    67  			Expect(eulas[1].ID).To(Equal(2))
    68  			Expect(eulas[1].Name).To(Equal("eula2"))
    69  		})
    70  
    71  		Context("when the server responds with a non-2XX status code", func() {
    72  			var (
    73  				body []byte
    74  			)
    75  
    76  			BeforeEach(func() {
    77  				body = []byte(`{"message":"foo message"}`)
    78  			})
    79  
    80  			It("returns an error", func() {
    81  				server.AppendHandlers(
    82  					ghttp.CombineHandlers(
    83  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas", apiPrefix)),
    84  						ghttp.RespondWith(http.StatusTeapot, body),
    85  					),
    86  				)
    87  
    88  				_, err := client.EULA.List()
    89  				Expect(err.Error()).To(ContainSubstring("foo message"))
    90  			})
    91  		})
    92  
    93  		Context("when the json unmarshalling fails with error", func() {
    94  			It("forwards the error", func() {
    95  				server.AppendHandlers(
    96  					ghttp.CombineHandlers(
    97  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas", apiPrefix)),
    98  						ghttp.RespondWith(http.StatusOK, "%%%"),
    99  					),
   100  				)
   101  
   102  				_, err := client.EULA.List()
   103  				Expect(err).To(HaveOccurred())
   104  
   105  				Expect(err.Error()).To(ContainSubstring("invalid character"))
   106  			})
   107  		})
   108  	})
   109  
   110  	Describe("Get", func() {
   111  		var (
   112  			eulaSlug string
   113  		)
   114  
   115  		BeforeEach(func() {
   116  			eulaSlug = "eula_1"
   117  		})
   118  
   119  		It("returns the EULA for the provided eula slug", func() {
   120  			response := `{"id":1,"name":"eula1","slug":"eula_1"}`
   121  
   122  			server.AppendHandlers(
   123  				ghttp.CombineHandlers(
   124  					ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas/%s", apiPrefix, eulaSlug)),
   125  					ghttp.RespondWith(http.StatusOK, response),
   126  				),
   127  			)
   128  
   129  			eula, err := client.EULA.Get(eulaSlug)
   130  			Expect(err).NotTo(HaveOccurred())
   131  
   132  			Expect(eula.ID).To(Equal(1))
   133  			Expect(eula.Name).To(Equal("eula1"))
   134  			Expect(eula.Slug).To(Equal(eulaSlug))
   135  		})
   136  
   137  		Context("when the server responds with a non-2XX status code", func() {
   138  			var (
   139  				body []byte
   140  			)
   141  
   142  			BeforeEach(func() {
   143  				body = []byte(`{"message":"foo message"}`)
   144  			})
   145  
   146  			It("returns an error", func() {
   147  				server.AppendHandlers(
   148  					ghttp.CombineHandlers(
   149  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas/%s", apiPrefix, eulaSlug)),
   150  						ghttp.RespondWith(http.StatusTeapot, body),
   151  					),
   152  				)
   153  
   154  				_, err := client.EULA.Get(eulaSlug)
   155  				Expect(err.Error()).To(ContainSubstring("foo message"))
   156  			})
   157  		})
   158  
   159  		Context("when the json unmarshalling fails with error", func() {
   160  			It("forwards the error", func() {
   161  				server.AppendHandlers(
   162  					ghttp.CombineHandlers(
   163  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/eulas/%s", apiPrefix, eulaSlug)),
   164  						ghttp.RespondWith(http.StatusOK, "%%%"),
   165  					),
   166  				)
   167  
   168  				_, err := client.EULA.Get(eulaSlug)
   169  				Expect(err).To(HaveOccurred())
   170  
   171  				Expect(err.Error()).To(ContainSubstring("invalid character"))
   172  			})
   173  		})
   174  	})
   175  
   176  	Describe("Accept", func() {
   177  		var (
   178  			releaseID         int
   179  			productSlug       string
   180  			EULAAcceptanceURL string
   181  		)
   182  
   183  		BeforeEach(func() {
   184  			productSlug = "banana-slug"
   185  			releaseID = 42
   186  			EULAAcceptanceURL = fmt.Sprintf(apiPrefix+"/products/%s/releases/%d/pivnet_resource_eula_acceptance", productSlug, releaseID)
   187  			fakeAccessTokenService.AccessTokenReturns(token, nil)
   188  		})
   189  
   190  		It("accepts the EULA for a given release and product ID", func() {
   191  			response := fmt.Sprintf(`{"accepted_at": "2016-01-11","_links":{}}`)
   192  
   193  			server.AppendHandlers(
   194  				ghttp.CombineHandlers(
   195  					ghttp.VerifyRequest("POST", EULAAcceptanceURL),
   196  					ghttp.VerifyHeaderKV("Authorization", fmt.Sprintf("Token %s", token)),
   197  					ghttp.VerifyJSON(`{}`),
   198  					ghttp.RespondWith(http.StatusOK, response),
   199  				),
   200  			)
   201  
   202  			Expect(client.EULA.Accept(productSlug, releaseID)).To(Succeed())
   203  		})
   204  
   205  		Context("when any other non-200 status code comes back", func() {
   206  			var (
   207  				body []byte
   208  			)
   209  
   210  			BeforeEach(func() {
   211  				body = []byte(`{"message":"foo message"}`)
   212  			})
   213  
   214  			It("returns an error", func() {
   215  				server.AppendHandlers(
   216  					ghttp.CombineHandlers(
   217  						ghttp.VerifyRequest("POST", EULAAcceptanceURL),
   218  						ghttp.VerifyHeaderKV("Authorization", fmt.Sprintf("Token %s", token)),
   219  						ghttp.VerifyJSON(`{}`),
   220  						ghttp.RespondWith(http.StatusTeapot, body),
   221  					),
   222  				)
   223  
   224  				err := client.EULA.Accept(productSlug, releaseID)
   225  				Expect(err.Error()).To(ContainSubstring("foo message"))
   226  			})
   227  		})
   228  	})
   229  })