github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/cf/net/routing_api_gateway_test.go (about)

     1  package net_test
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"time"
     8  
     9  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    10  	"code.cloudfoundry.org/cli/cf/errors"
    11  	. "code.cloudfoundry.org/cli/cf/net"
    12  	"code.cloudfoundry.org/cli/cf/terminal/terminalfakes"
    13  	"code.cloudfoundry.org/cli/cf/trace/tracefakes"
    14  	testconfig "code.cloudfoundry.org/cli/util/testhelpers/configuration"
    15  	. "github.com/onsi/ginkgo"
    16  	. "github.com/onsi/gomega"
    17  )
    18  
    19  var failingRoutingAPIRequest = func(writer http.ResponseWriter, request *http.Request) {
    20  	writer.WriteHeader(http.StatusBadRequest)
    21  	jsonResponse := `{ "name": "some-error", "message": "The host is taken: test1" }`
    22  	fmt.Fprintln(writer, jsonResponse)
    23  }
    24  
    25  var invalidTokenRoutingAPIRequest = func(writer http.ResponseWriter, request *http.Request) {
    26  	writer.WriteHeader(http.StatusUnauthorized)
    27  	jsonResponse := `{ "name": "UnauthorizedError", "message": "bad token!" }`
    28  	fmt.Fprintln(writer, jsonResponse)
    29  }
    30  
    31  var _ = Describe("Routing Api Gateway", func() {
    32  	var gateway Gateway
    33  	var config coreconfig.Reader
    34  	var fakeLogger *tracefakes.FakePrinter
    35  	var timeout string
    36  
    37  	BeforeEach(func() {
    38  		fakeLogger = new(tracefakes.FakePrinter)
    39  		config = testconfig.NewRepository()
    40  		timeout = "1"
    41  	})
    42  
    43  	JustBeforeEach(func() {
    44  		gateway = NewRoutingAPIGateway(config, time.Now, new(terminalfakes.FakeUI), fakeLogger, timeout)
    45  	})
    46  
    47  	It("parses error responses", func() {
    48  		ts := httptest.NewTLSServer(http.HandlerFunc(failingRoutingAPIRequest))
    49  		defer ts.Close()
    50  		gateway.SetTrustedCerts(ts.TLS.Certificates)
    51  
    52  		request, apiErr := gateway.NewRequest("GET", ts.URL, "TOKEN", nil)
    53  		_, apiErr = gateway.PerformRequest(request)
    54  
    55  		Expect(apiErr).NotTo(BeNil())
    56  		Expect(apiErr.Error()).To(ContainSubstring("The host is taken: test1"))
    57  		Expect(apiErr.(errors.HTTPError).ErrorCode()).To(ContainSubstring("some-error"))
    58  	})
    59  
    60  	It("parses invalid token responses", func() {
    61  		ts := httptest.NewTLSServer(http.HandlerFunc(invalidTokenRoutingAPIRequest))
    62  		defer ts.Close()
    63  		gateway.SetTrustedCerts(ts.TLS.Certificates)
    64  
    65  		request, apiErr := gateway.NewRequest("GET", ts.URL, "TOKEN", nil)
    66  		_, apiErr = gateway.PerformRequest(request)
    67  
    68  		Expect(apiErr).NotTo(BeNil())
    69  		Expect(apiErr.Error()).To(ContainSubstring("bad token"))
    70  		Expect(apiErr.(errors.HTTPError)).To(HaveOccurred())
    71  	})
    72  
    73  	Context("when the Routing API returns a invalid JSON", func() {
    74  		var invalidJSONResponse = func(writer http.ResponseWriter, request *http.Request) {
    75  			writer.WriteHeader(http.StatusUnauthorized)
    76  			jsonResponse := `¯\_(ツ)_/¯`
    77  			fmt.Fprintln(writer, jsonResponse)
    78  		}
    79  
    80  		It("returns a 500 http error", func() {
    81  			ts := httptest.NewTLSServer(http.HandlerFunc(invalidJSONResponse))
    82  			defer ts.Close()
    83  			gateway.SetTrustedCerts(ts.TLS.Certificates)
    84  
    85  			request, apiErr := gateway.NewRequest("GET", ts.URL, "TOKEN", nil)
    86  			_, apiErr = gateway.PerformRequest(request)
    87  
    88  			Expect(apiErr).NotTo(BeNil())
    89  			Expect(apiErr.(errors.HTTPError)).To(HaveOccurred())
    90  			Expect(apiErr.(errors.HTTPError).StatusCode()).To(Equal(http.StatusInternalServerError))
    91  		})
    92  	})
    93  
    94  	It("uses the set dial timeout", func() {
    95  		Expect(gateway.DialTimeout).To(Equal(1 * time.Second))
    96  	})
    97  
    98  	Context("with an invalid timeout", func() {
    99  		BeforeEach(func() {
   100  			timeout = ""
   101  		})
   102  
   103  		It("uses the default dial timeout", func() {
   104  			Expect(gateway.DialTimeout).To(Equal(5 * time.Second))
   105  		})
   106  	})
   107  })