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