github.com/pivotal-cf/go-pivnet/v6@v6.0.2/federation_token_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 - federation token", func() {
    18  	type requestBody struct {
    19  		ProductID string `json:"product_id"`
    20  	}
    21  
    22  	var (
    23  		server     *ghttp.Server
    24  		client     pivnet.Client
    25  		apiAddress string
    26  		userAgent  string
    27  
    28  		mockedResponse         interface{}
    29  		responseStatusCode     int
    30  		expectedRequestBody    requestBody
    31  		newClientConfig        pivnet.ClientConfig
    32  		fakeLogger             logger.Logger
    33  		fakeAccessTokenService *gopivnetfakes.FakeAccessTokenService
    34  
    35  		productSlug             string
    36  		expectedFederationToken pivnet.FederationToken
    37  	)
    38  
    39  	BeforeEach(func() {
    40  		server = ghttp.NewServer()
    41  		apiAddress = server.URL()
    42  		userAgent = "pivnet-resource/0.1.0 (some-url)"
    43  
    44  		fakeLogger = &loggerfakes.FakeLogger{}
    45  		fakeAccessTokenService = &gopivnetfakes.FakeAccessTokenService{}
    46  		newClientConfig = pivnet.ClientConfig{
    47  			Host:      apiAddress,
    48  			UserAgent: userAgent,
    49  		}
    50  		client = pivnet.NewClient(fakeAccessTokenService, newClientConfig, fakeLogger)
    51  	})
    52  
    53  	JustBeforeEach(func() {
    54  		expectedRequestBody = requestBody{
    55  			ProductID: productSlug,
    56  		}
    57  
    58  		server.AppendHandlers(
    59  			ghttp.CombineHandlers(
    60  				ghttp.VerifyRequest(
    61  					"POST",
    62  					fmt.Sprintf("%s/federation_token", apiPrefix),
    63  				),
    64  				ghttp.VerifyJSONRepresenting(&expectedRequestBody),
    65  				ghttp.RespondWithJSONEncoded(responseStatusCode, mockedResponse),
    66  			),
    67  		)
    68  	})
    69  
    70  	AfterEach(func() {
    71  		server.Close()
    72  	})
    73  
    74  	Describe("Generate a federated token", func() {
    75  		BeforeEach(func() {
    76  			productSlug = "banana"
    77  
    78  			mockedResponse = pivnet.FederationToken{
    79  				AccessKeyID:     "some-AccessKeyID",
    80  				SecretAccessKey: "some-SecretAccessKey",
    81  				SessionToken:    "some-SessionToken",
    82  				Bucket:          "some-bucket",
    83  				Region:          "some-region",
    84  			}
    85  
    86  			responseStatusCode = http.StatusOK
    87  			expectedFederationToken = pivnet.FederationToken{
    88  				AccessKeyID:     "some-AccessKeyID",
    89  				SecretAccessKey: "some-SecretAccessKey",
    90  				SessionToken:    "some-SessionToken",
    91  				Bucket:          "some-bucket",
    92  				Region:          "some-region",
    93  			}
    94  		})
    95  
    96  		It("returns the federated token without error", func() {
    97  			federationToken, err := client.FederationToken.GenerateFederationToken(
    98  				productSlug,
    99  			)
   100  			Expect(err).NotTo(HaveOccurred())
   101  
   102  			Expect(federationToken).ToNot(Equal(nil))
   103  			Expect(federationToken).To(Equal(expectedFederationToken))
   104  		})
   105  	})
   106  
   107  	Describe("Err when trying to generate token for restricted product", func() {
   108  		BeforeEach(func() {
   109  			productSlug = "something-i-dont-manage"
   110  
   111  			mockedResponse = pivnetErr{Message: "only available for product admins and partner product admins"}
   112  
   113  			responseStatusCode = http.StatusForbidden
   114  		})
   115  
   116  		It("returns a 403 error", func() {
   117  			federationToken, err := client.FederationToken.GenerateFederationToken(
   118  				productSlug,
   119  			)
   120  
   121  			Expect(federationToken).To(Equal(pivnet.FederationToken{}))
   122  			Expect(err).To(HaveOccurred())
   123  			Expect(err.Error()).To(ContainSubstring("403 - only available for product admins and partner product admins"))
   124  		})
   125  	})
   126  })