github.com/pivotal-cf/go-pivnet/v6@v6.0.2/auth_test.go (about)

     1  package pivnet_test
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  
     7  	"github.com/onsi/gomega/ghttp"
     8  	"github.com/pivotal-cf/go-pivnet/v6"
     9  	"github.com/pivotal-cf/go-pivnet/v6/logger"
    10  	"github.com/pivotal-cf/go-pivnet/v6/logger/loggerfakes"
    11  
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("PivnetClient - Auth", func() {
    17  	var (
    18  		server     *ghttp.Server
    19  		client     pivnet.Client
    20  		token      string
    21  		apiAddress string
    22  		userAgent  string
    23  
    24  		refresh_token string
    25  
    26  		newClientConfig pivnet.ClientConfig
    27  		fakeLogger      logger.Logger
    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  		newClientConfig = pivnet.ClientConfig{
    38  			Host:      apiAddress,
    39  			UserAgent: userAgent,
    40  		}
    41  		accessTokenService := pivnet.NewAccessTokenOrLegacyToken(token, apiAddress, false)
    42  		client = pivnet.NewClient(accessTokenService, newClientConfig, fakeLogger)
    43  	})
    44  
    45  	AfterEach(func() {
    46  		server.Close()
    47  	})
    48  
    49  	Describe("Check", func() {
    50  		It("returns true,nil", func() {
    51  			server.AppendHandlers(
    52  				ghttp.CombineHandlers(
    53  					ghttp.VerifyRequest("GET", fmt.Sprintf("%s/authentication", apiPrefix)),
    54  					ghttp.RespondWith(http.StatusOK, nil),
    55  				),
    56  			)
    57  
    58  			ok, err := client.Auth.Check()
    59  			Expect(err).NotTo(HaveOccurred())
    60  
    61  			Expect(ok).To(BeTrue())
    62  		})
    63  
    64  		Context("when the server responds with a 401 status code", func() {
    65  			var (
    66  				body []byte
    67  			)
    68  
    69  			BeforeEach(func() {
    70  				body = []byte(`{"message":"foo message"}`)
    71  			})
    72  
    73  			It("returns false,nil", func() {
    74  				server.AppendHandlers(
    75  					ghttp.CombineHandlers(
    76  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/authentication", apiPrefix)),
    77  						ghttp.RespondWith(http.StatusUnauthorized, body),
    78  					),
    79  				)
    80  
    81  				ok, err := client.Auth.Check()
    82  				Expect(err).NotTo(HaveOccurred())
    83  
    84  				Expect(ok).To(BeFalse())
    85  			})
    86  		})
    87  
    88  		Context("when the server responds with a 403 status code", func() {
    89  			var (
    90  				body []byte
    91  			)
    92  
    93  			BeforeEach(func() {
    94  				body = []byte(`{"message":"foo message"}`)
    95  			})
    96  
    97  			It("returns false,nil", func() {
    98  				server.AppendHandlers(
    99  					ghttp.CombineHandlers(
   100  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/authentication", apiPrefix)),
   101  						ghttp.RespondWith(http.StatusForbidden, body),
   102  					),
   103  				)
   104  
   105  				ok, err := client.Auth.Check()
   106  				Expect(err).NotTo(HaveOccurred())
   107  
   108  				Expect(ok).To(BeFalse())
   109  			})
   110  		})
   111  
   112  		Context("when the server responds with any other status code", func() {
   113  			var (
   114  				body []byte
   115  			)
   116  
   117  			BeforeEach(func() {
   118  				body = []byte(`{"message":"foo message"}`)
   119  			})
   120  
   121  			It("returns false,err", func() {
   122  				server.AppendHandlers(
   123  					ghttp.CombineHandlers(
   124  						ghttp.VerifyRequest("GET", fmt.Sprintf("%s/authentication", apiPrefix)),
   125  						ghttp.RespondWith(http.StatusTeapot, body),
   126  					),
   127  				)
   128  
   129  				ok, err := client.Auth.Check()
   130  				Expect(err.Error()).To(ContainSubstring("foo message"))
   131  
   132  				Expect(ok).To(BeFalse())
   133  			})
   134  		})
   135  	})
   136  
   137  	Describe("FetchUAAToken", func() {
   138  		It("returns the UAA token", func() {
   139  			refresh_token = "some-refresh-token"
   140  
   141  			expectedRequestBody := fmt.Sprintf(
   142  				`{"refresh_token":"%s"}`,
   143  				refresh_token,
   144  			)
   145  
   146  			response := pivnet.UAATokenResponse{
   147  				Token: "some-token",
   148  			}
   149  
   150  			server.AppendHandlers(
   151  				ghttp.CombineHandlers(
   152  					ghttp.VerifyRequest("POST", fmt.Sprintf(
   153  						"%s/authentication/access_tokens",
   154  						apiPrefix,
   155  					)),
   156  					ghttp.VerifyJSON(expectedRequestBody),
   157  					ghttp.RespondWithJSONEncoded(http.StatusOK, response),
   158  				),
   159  			)
   160  
   161  			tokenResponse, err := client.Auth.FetchUAAToken(refresh_token)
   162  			Expect(err).NotTo(HaveOccurred())
   163  			Expect(tokenResponse.Token).To(Equal("some-token"))
   164  		})
   165  
   166  		Context("When Pivnet returns a 401", func() {
   167  			It("returns an error", func() {
   168  				refresh_token = "some-refresh-token"
   169  
   170  				expectedRequestBody := fmt.Sprintf(
   171  					`{"refresh_token":"%s"}`,
   172  					refresh_token,
   173  				)
   174  
   175  				server.AppendHandlers(
   176  					ghttp.CombineHandlers(
   177  						ghttp.VerifyRequest("POST", fmt.Sprintf(
   178  							"%s/authentication/access_tokens",
   179  							apiPrefix,
   180  						)),
   181  						ghttp.VerifyJSON(expectedRequestBody),
   182  						ghttp.RespondWithJSONEncoded(http.StatusUnauthorized, nil),
   183  					),
   184  				)
   185  
   186  				_, err := client.Auth.FetchUAAToken(refresh_token)
   187  				Expect(err).To(HaveOccurred())
   188  			})
   189  		})
   190  	})
   191  })