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 }