github.com/twilio/twilio-go@v1.20.1/client/request_handler_test.go (about)

     1  package client_test
     2  
     3  import (
     4  	"errors"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"net/url"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/twilio/twilio-go/client"
    12  )
    13  
    14  func NewRequestHandler(accountSid string, authToken string) *client.RequestHandler {
    15  	c := NewClient(accountSid, authToken)
    16  	return client.NewRequestHandler(c)
    17  }
    18  
    19  func TestRequestHandler_BuildUrlSetRegion(t *testing.T) {
    20  	// Region set via url
    21  	requestHandler := NewRequestHandler("user", "pass")
    22  	assert.Equal(t, "https://api.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.region.twilio.com"))
    23  
    24  	// Region set via requestHandler
    25  	requestHandler.Region = "region"
    26  	assert.Equal(t, "https://api.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.twilio.com"))
    27  	assert.Equal(t, "https://api.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.urlRegion.twilio.com"))
    28  }
    29  
    30  func TestRequestHandler_BuildUrlSetEdgeDefaultRegion(t *testing.T) {
    31  	// Edge set via client
    32  	requestHandler := NewRequestHandler("user", "pass")
    33  	requestHandler.Edge = "edge"
    34  	assert.Equal(t, "https://api.edge.us1.twilio.com", assertAndGetURL(t, requestHandler, "https://api.twilio.com"))
    35  }
    36  
    37  func TestRequestHandler_BuildUrlSetEdgeRegion(t *testing.T) {
    38  	//Edge and Region set via url
    39  	requestHandler := NewRequestHandler("user", "pass")
    40  	assert.Equal(t, "https://api.edge.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.edge.region.twilio.com"))
    41  
    42  	// Edge and Region set via client
    43  	requestHandler.Edge = "edge"
    44  	assert.Equal(t, "https://api.edge.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.region.twilio.com"))
    45  	requestHandler.Region = "region"
    46  	assert.Equal(t, "https://api.edge.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.twilio.com"))
    47  	assert.Equal(t, "https://api.edge.region.twilio.com", assertAndGetURL(t, requestHandler, "https://api.urlEdge.urlRegion.twilio.com"))
    48  }
    49  
    50  func TestRequestHandler_BuildHostRawHostWithoutPeriods(t *testing.T) {
    51  	requestHandler := NewRequestHandler("user", "pass")
    52  	assert.Equal(t, "https://prism_twilio:4010", assertAndGetURL(t, requestHandler, "https://prism_twilio:4010"))
    53  }
    54  
    55  func TestRequestHandler_BuildUrlInvalidCTLCharacter(t *testing.T) {
    56  	requestHandler := NewRequestHandler("user", "pass")
    57  	rawURL := "https://api.twilio.com/ServiceId\n"
    58  	parsedURL, err := requestHandler.BuildUrl(rawURL)
    59  
    60  	expectedErr := url.Error{Op: "parse", URL: rawURL, Err: errors.New("net/url: invalid control character in URL")}
    61  	assert.Equal(t, &expectedErr, err)
    62  	assert.Equal(t, parsedURL, "")
    63  }
    64  
    65  func assertAndGetURL(t *testing.T, requestHandler *client.RequestHandler, rawURL string) string {
    66  	parsedURL, err := requestHandler.BuildUrl(rawURL)
    67  	assert.Nil(t, err)
    68  	return parsedURL
    69  }
    70  
    71  func TestRequestHandler_SendGetRequest(t *testing.T) {
    72  	errorResponse := `{
    73  	"status": 400,
    74  	"code":20001,
    75  	"message":"Bad request",
    76  	"more_info":"https://www.twilio.com/docs/errors/20001"
    77  }`
    78  	errorServer := httptest.NewServer(http.HandlerFunc(
    79  		func(resp http.ResponseWriter, req *http.Request) {
    80  			resp.WriteHeader(400)
    81  			_, _ = resp.Write([]byte(errorResponse))
    82  		}))
    83  	defer errorServer.Close()
    84  
    85  	requestHandler := NewRequestHandler("user", "pass")
    86  	resp, err := requestHandler.Get(errorServer.URL, nil, nil) //nolint:bodyclose
    87  	twilioError := err.(*client.TwilioRestError)
    88  	assert.Nil(t, resp)
    89  	assert.Equal(t, 400, twilioError.Status)
    90  	assert.Equal(t, 20001, twilioError.Code)
    91  	assert.Equal(t, "https://www.twilio.com/docs/errors/20001", twilioError.MoreInfo)
    92  	assert.Equal(t, "Bad request", twilioError.Message)
    93  	assert.Nil(t, twilioError.Details)
    94  }
    95  
    96  func TestRequestHandler_SendPostRequest(t *testing.T) {
    97  	errorResponse := `{
    98  	"status": 400,
    99  	"code":20001,
   100  	"message":"Bad request",
   101  	"more_info":"https://www.twilio.com/docs/errors/20001"
   102  }`
   103  	errorServer := httptest.NewServer(http.HandlerFunc(
   104  		func(resp http.ResponseWriter, req *http.Request) {
   105  			resp.WriteHeader(400)
   106  			_, _ = resp.Write([]byte(errorResponse))
   107  		}))
   108  	defer errorServer.Close()
   109  
   110  	requestHandler := NewRequestHandler("user", "pass")
   111  	resp, err := requestHandler.Post(errorServer.URL, nil, nil) //nolint:bodyclose
   112  	twilioError := err.(*client.TwilioRestError)
   113  	assert.Nil(t, resp)
   114  	assert.Equal(t, 400, twilioError.Status)
   115  	assert.Equal(t, 20001, twilioError.Code)
   116  	assert.Equal(t, "https://www.twilio.com/docs/errors/20001", twilioError.MoreInfo)
   117  	assert.Equal(t, "Bad request", twilioError.Message)
   118  	assert.Nil(t, twilioError.Details)
   119  }