@@ -2,8 +2,10 @@ package client_test
22
33import (
44 "encoding/json"
5+ "io/ioutil"
56 "net/http"
67 "net/http/httptest"
8+ "net/url"
79 "testing"
810 "time"
911
@@ -35,7 +37,7 @@ func TestClient_SendRequestError(t *testing.T) {
3537 defer mockServer .Close ()
3638
3739 client := NewClient ("user" , "pass" )
38- resp , err := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
40+ resp , err := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
3941 twilioError := err .(* twilio.TwilioRestError )
4042 assert .Nil (t , resp )
4143 assert .Equal (t , 400 , twilioError .Status )
@@ -63,7 +65,7 @@ func TestClient_SendRequestErrorWithDetails(t *testing.T) {
6365 defer mockServer .Close ()
6466
6567 client := NewClient ("user" , "pass" )
66- resp , err := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
68+ resp , err := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
6769 twilioError := err .(* twilio.TwilioRestError )
6870 details := make (map [string ]interface {})
6971 details ["foo" ] = "bar"
@@ -84,7 +86,7 @@ func TestClient_SendRequestWithRedirect(t *testing.T) {
8486 defer mockServer .Close ()
8587
8688 client := NewClient ("user" , "pass" )
87- resp , _ := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
89+ resp , _ := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
8890 assert .Equal (t , 307 , resp .StatusCode )
8991}
9092
@@ -106,7 +108,7 @@ func TestClient_SetTimeoutTimesOut(t *testing.T) {
106108
107109 client := NewClient ("user" , "pass" )
108110 client .SetTimeout (10 * time .Microsecond )
109- _ , err := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
111+ _ , err := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
110112 assert .Error (t , err )
111113}
112114
@@ -127,7 +129,7 @@ func TestClient_SetTimeoutSucceeds(t *testing.T) {
127129
128130 client := NewClient ("user" , "pass" )
129131 client .SetTimeout (10 * time .Second )
130- resp , err := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
132+ resp , err := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
131133 assert .NoError (t , err )
132134 assert .Equal (t , 200 , resp .StatusCode )
133135}
@@ -151,7 +153,119 @@ func TestClient_SetTimeoutCreatesClient(t *testing.T) {
151153 Credentials : twilio .NewCredentials ("user" , "pass" ),
152154 }
153155 client .SetTimeout (20 * time .Second )
154- resp , err := client .SendRequest ("get " , mockServer .URL , nil , nil ) //nolint:bodyclose
156+ resp , err := client .SendRequest ("GET " , mockServer .URL , nil , nil ) //nolint:bodyclose
155157 assert .NoError (t , err )
156158 assert .Equal (t , 200 , resp .StatusCode )
157159}
160+
161+ func TestClient_RequestBodyShouldContainJson (t * testing.T ) {
162+ mockServer := httptest .NewServer (http .HandlerFunc (
163+ func (writer http.ResponseWriter , request * http.Request ) {
164+ bytes , err := ioutil .ReadAll (request .Body )
165+ assert .NoError (t , err )
166+ assert .Equal (t , `{"account_sid":"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","chat_service_instance_sid":"ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}` , string (bytes ))
167+
168+ writer .WriteHeader (200 )
169+ }),
170+ )
171+ defer mockServer .Close ()
172+
173+ client := & twilio.Client {
174+ Credentials : twilio .NewCredentials ("user" , "pass" ),
175+ }
176+
177+ headers := map [string ]interface {}{
178+ "Content-Type" : "application/json" ,
179+ }
180+ body := map [string ]interface {}{
181+ "account_sid" : "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ,
182+ "chat_service_instance_sid" : "ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ,
183+ }
184+
185+ resp , err := client .SendRequest ("POST" , mockServer .URL , body , headers ) //nolint:bodyclose
186+ assert .NoError (t , err )
187+ assert .Equal (t , 200 , resp .StatusCode )
188+ // Request body is asserted in the mock server. This can't be asserted here because the body has been consumed and will be nil
189+ }
190+
191+ func TestClient_RequestBodyShouldContainFormData (t * testing.T ) {
192+ mockServer := httptest .NewServer (http .HandlerFunc (
193+ func (writer http.ResponseWriter , request * http.Request ) {
194+ bytes , err := ioutil .ReadAll (request .Body )
195+ assert .NoError (t , err )
196+ assert .Equal (t , "AccountSid=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&ChatServiceInstanceSid=ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" , string (bytes ))
197+
198+ writer .WriteHeader (200 )
199+ }),
200+ )
201+ defer mockServer .Close ()
202+
203+ client := & twilio.Client {
204+ Credentials : twilio .NewCredentials ("user" , "pass" ),
205+ }
206+
207+ headers := map [string ]interface {}{
208+ "Content-Type" : "application/x-www-form-urlencoded" ,
209+ }
210+ body := url.Values {
211+ "AccountSid" : []string {"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" },
212+ "ChatServiceInstanceSid" : []string {"ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" },
213+ }
214+
215+ resp , err := client .SendRequest ("POST" , mockServer .URL , body , headers ) //nolint:bodyclose
216+ assert .NoError (t , err )
217+ assert .Equal (t , 200 , resp .StatusCode )
218+ // Request body is asserted in the mock server. This can't be asserted here because the body has been consumed and will be nil
219+ }
220+
221+ func TestClient_ShouldThrowErrorWhenNoContentTypeHeaderIsPresentOnAPostRequest (t * testing.T ) {
222+ mockServer := httptest .NewServer (http .HandlerFunc (
223+ func (writer http.ResponseWriter , request * http.Request ) {
224+ writer .WriteHeader (400 ) // This shouldn't be hit as an error should have already been returned
225+ }),
226+ )
227+ defer mockServer .Close ()
228+
229+ client := & twilio.Client {
230+ Credentials : twilio .NewCredentials ("user" , "pass" ),
231+ }
232+
233+ headers := map [string ]interface {}{}
234+ body := url.Values {
235+ "account_sid" : []string {"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" },
236+ "chat_service_instance_sid" : []string {"ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" },
237+ }
238+
239+ _ , err := client .SendRequest ("POST" , mockServer .URL , body , headers ) //nolint:bodyclose
240+ assert .EqualError (t , err , "the 'Content-Type' header must be set on a POST request" )
241+ }
242+
243+ func TestClient_ShouldMakeGetRequestWithQueryStringParams (t * testing.T ) {
244+ mockServer := httptest .NewServer (http .HandlerFunc (
245+ func (writer http.ResponseWriter , request * http.Request ) {
246+ d := map [string ]interface {}{
247+ "sid" : "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ,
248+ "status" : "closed" ,
249+ "date_updated" : "2021-06-01T12:00:00Z" ,
250+ }
251+ encoder := json .NewEncoder (writer )
252+ err := encoder .Encode (& d )
253+ if err != nil {
254+ t .Error (err )
255+ }
256+ }))
257+ defer mockServer .Close ()
258+
259+ client := & twilio.Client {
260+ Credentials : twilio .NewCredentials ("user" , "pass" ),
261+ }
262+
263+ queryParams := url.Values {
264+ "status" : []string {"closed" },
265+ }
266+
267+ resp , err := client .SendRequest ("GET" , mockServer .URL , queryParams , nil ) //nolint:bodyclose
268+ assert .NoError (t , err )
269+ assert .Equal (t , 200 , resp .StatusCode )
270+ assert .Equal (t , resp .Request .URL .RawQuery , "status=closed" )
271+ }
0 commit comments