github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/api/uaa/uaa_connection_test.go (about)

     1  package uaa_test
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  
     7  	. "code.cloudfoundry.org/cli/api/uaa"
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  	. "github.com/onsi/gomega/ghttp"
    11  )
    12  
    13  type DummyResponse struct {
    14  	Val1 string `json:"val1"`
    15  	Val2 int    `json:"val2"`
    16  }
    17  
    18  var _ = Describe("UAA Connection", func() {
    19  	var (
    20  		connection *UAAConnection
    21  		request    *http.Request
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		connection = NewConnection(true, 0)
    26  	})
    27  
    28  	Describe("Make", func() {
    29  		Describe("Data Unmarshalling", func() {
    30  			BeforeEach(func() {
    31  				response := `{
    32  					"val1":"2.59.0",
    33  					"val2":2
    34  				}`
    35  				server.AppendHandlers(
    36  					CombineHandlers(
    37  						VerifyRequest(http.MethodGet, "/v2/foo", ""),
    38  						RespondWith(http.StatusOK, response),
    39  					),
    40  				)
    41  
    42  				var err error
    43  				request, err = http.NewRequest(http.MethodGet, fmt.Sprintf("%s/v2/foo", server.URL()), nil)
    44  				Expect(err).ToNot(HaveOccurred())
    45  			})
    46  
    47  			Context("when passed a response with a result set", func() {
    48  				It("unmarshals the data into a struct", func() {
    49  					var body DummyResponse
    50  					response := Response{
    51  						Result: &body,
    52  					}
    53  
    54  					err := connection.Make(request, &response)
    55  					Expect(err).NotTo(HaveOccurred())
    56  
    57  					Expect(body.Val1).To(Equal("2.59.0"))
    58  					Expect(body.Val2).To(Equal(2))
    59  				})
    60  			})
    61  
    62  			Context("when passed an empty response", func() {
    63  				It("skips the unmarshalling step", func() {
    64  					var response Response
    65  					err := connection.Make(request, &response)
    66  					Expect(err).NotTo(HaveOccurred())
    67  					Expect(response.Result).To(BeNil())
    68  				})
    69  			})
    70  		})
    71  
    72  		Describe("HTTP Response", func() {
    73  			var request *http.Request
    74  
    75  			BeforeEach(func() {
    76  				response := `{}`
    77  				server.AppendHandlers(
    78  					CombineHandlers(
    79  						VerifyRequest(http.MethodGet, "/v2/foo", ""),
    80  						RespondWith(http.StatusOK, response),
    81  					),
    82  				)
    83  
    84  				var err error
    85  				request, err = http.NewRequest(http.MethodGet, fmt.Sprintf("%s/v2/foo", server.URL()), nil)
    86  				Expect(err).ToNot(HaveOccurred())
    87  			})
    88  
    89  			It("returns the status", func() {
    90  				response := Response{}
    91  
    92  				err := connection.Make(request, &response)
    93  				Expect(err).NotTo(HaveOccurred())
    94  
    95  				Expect(response.HTTPResponse.Status).To(Equal("200 OK"))
    96  			})
    97  		})
    98  
    99  		Describe("Errors", func() {
   100  			Context("when the server does not exist", func() {
   101  				BeforeEach(func() {
   102  					connection = NewConnection(false, 0)
   103  				})
   104  
   105  				It("returns a RequestError", func() {
   106  					request, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/v2/foo", "http://i.hope.this.doesnt.exist.com"), nil)
   107  					Expect(err).ToNot(HaveOccurred())
   108  
   109  					var response Response
   110  					err = connection.Make(request, &response)
   111  					Expect(err).To(HaveOccurred())
   112  
   113  					requestErr, ok := err.(RequestError)
   114  					Expect(ok).To(BeTrue())
   115  					Expect(requestErr.Error()).To(MatchRegexp(".*http://i.hope.this.doesnt.exist.com/v2/foo.*[nN]o such host"))
   116  				})
   117  			})
   118  
   119  			Context("when the server does not have a verified certificate", func() {
   120  				Context("skipSSLValidation is false", func() {
   121  					BeforeEach(func() {
   122  						server.AppendHandlers(
   123  							CombineHandlers(
   124  								VerifyRequest(http.MethodGet, "/v2/foo"),
   125  							),
   126  						)
   127  
   128  						connection = NewConnection(false, 0)
   129  					})
   130  
   131  					It("returns a UnverifiedServerError", func() {
   132  						request, err := http.NewRequest(http.MethodGet, server.URL(), nil)
   133  						Expect(err).ToNot(HaveOccurred())
   134  
   135  						var response Response
   136  						err = connection.Make(request, &response)
   137  						Expect(err).To(MatchError(UnverifiedServerError{URL: server.URL()}))
   138  					})
   139  				})
   140  			})
   141  
   142  			Describe("RawHTTPStatusError", func() {
   143  				var uaaResponse string
   144  
   145  				BeforeEach(func() {
   146  					uaaResponse = `{
   147  						"error":"unauthorized",
   148  						"error_description":"Bad credentials"
   149  					}`
   150  
   151  					server.AppendHandlers(
   152  						CombineHandlers(
   153  							VerifyRequest(http.MethodGet, "/v2/foo"),
   154  							RespondWith(http.StatusUnauthorized, uaaResponse),
   155  						),
   156  					)
   157  				})
   158  
   159  				It("returns a RawHTTPStatusError", func() {
   160  					request, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/v2/foo", server.URL()), nil)
   161  					Expect(err).ToNot(HaveOccurred())
   162  
   163  					var response Response
   164  					err = connection.Make(request, &response)
   165  					Expect(err).To(MatchError(RawHTTPStatusError{
   166  						StatusCode:  http.StatusUnauthorized,
   167  						RawResponse: []byte(uaaResponse),
   168  					}))
   169  
   170  					Expect(server.ReceivedRequests()).To(HaveLen(1))
   171  				})
   172  			})
   173  		})
   174  	})
   175  })