code.cloudfoundry.org/cli@v7.1.0+incompatible/cf/net/cloud_controller_gateway_test.go (about)

     1  package net_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"log"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"time"
    10  
    11  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    12  	"code.cloudfoundry.org/cli/cf/errors"
    13  	. "code.cloudfoundry.org/cli/cf/net"
    14  	"code.cloudfoundry.org/cli/cf/terminal/terminalfakes"
    15  	testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration"
    16  
    17  	"code.cloudfoundry.org/cli/cf/trace/tracefakes"
    18  	. "github.com/onsi/ginkgo"
    19  	. "github.com/onsi/gomega"
    20  )
    21  
    22  var failingCloudControllerRequest = func(writer http.ResponseWriter, request *http.Request) {
    23  	writer.WriteHeader(http.StatusBadRequest)
    24  	jsonResponse := `{ "code": 210003, "description": "The host is taken: test1" }`
    25  	fmt.Fprintln(writer, jsonResponse)
    26  }
    27  
    28  var invalidTokenCloudControllerRequest = func(writer http.ResponseWriter, request *http.Request) {
    29  	writer.WriteHeader(http.StatusBadRequest)
    30  	jsonResponse := `{ "code": 1000, "description": "The token is invalid" }`
    31  	fmt.Fprintln(writer, jsonResponse)
    32  }
    33  
    34  var _ = Describe("Cloud Controller Gateway", func() {
    35  	var gateway Gateway
    36  	var config coreconfig.Reader
    37  	var timeout string
    38  
    39  	BeforeEach(func() {
    40  		timeout = "1"
    41  	})
    42  
    43  	JustBeforeEach(func() {
    44  		config = testconfig.NewRepository()
    45  		gateway = NewCloudControllerGateway(config, time.Now, new(terminalfakes.FakeUI), new(tracefakes.FakePrinter), timeout)
    46  	})
    47  
    48  	It("parses error responses", func() {
    49  		ts := httptest.NewTLSServer(http.HandlerFunc(failingCloudControllerRequest))
    50  		ts.Config.ErrorLog = log.New(&bytes.Buffer{}, "", 0)
    51  		defer ts.Close()
    52  		gateway.SetTrustedCerts(ts.TLS.Certificates)
    53  
    54  		request, apiErr := gateway.NewRequest("GET", ts.URL, "TOKEN", nil)
    55  		_, apiErr = gateway.PerformRequest(request)
    56  
    57  		Expect(apiErr).NotTo(BeNil())
    58  		Expect(apiErr.Error()).To(ContainSubstring("The host is taken: test1"))
    59  		Expect(apiErr.(errors.HTTPError).ErrorCode()).To(ContainSubstring("210003"))
    60  	})
    61  
    62  	It("parses invalid token responses", func() {
    63  		ts := httptest.NewTLSServer(http.HandlerFunc(invalidTokenCloudControllerRequest))
    64  		ts.Config.ErrorLog = log.New(&bytes.Buffer{}, "", 0)
    65  		defer ts.Close()
    66  		gateway.SetTrustedCerts(ts.TLS.Certificates)
    67  
    68  		request, apiErr := gateway.NewRequest("GET", ts.URL, "TOKEN", nil)
    69  		_, apiErr = gateway.PerformRequest(request)
    70  
    71  		Expect(apiErr).NotTo(BeNil())
    72  		Expect(apiErr.Error()).To(ContainSubstring("The token is invalid"))
    73  		Expect(apiErr.(*errors.InvalidTokenError)).To(HaveOccurred())
    74  	})
    75  
    76  	It("uses the set dial timeout", func() {
    77  		Expect(gateway.DialTimeout).To(Equal(1 * time.Second))
    78  	})
    79  
    80  	Context("with an invalid timeout", func() {
    81  		BeforeEach(func() {
    82  			timeout = ""
    83  		})
    84  
    85  		It("uses the default dial timeout", func() {
    86  			Expect(gateway.DialTimeout).To(Equal(5 * time.Second))
    87  		})
    88  	})
    89  })