11package client
22
33import (
4+ "bytes"
5+ "encoding/json"
6+ "io/ioutil"
7+ "net/http"
8+ "net/url"
49 "testing"
510
11+ "github.com/golang/mock/gomock"
12+
613 "github.com/stretchr/testify/assert"
714)
815
9- func TestReadLimits (t * testing.T ) {
16+ func TestPageUtil_ReadLimits (t * testing.T ) {
1017 assert .Equal (t , 5 , ReadLimits (nil , setLimit (5 )))
1118 assert .Equal (t , 5 , ReadLimits (setPageSize (10 ), setLimit (5 )))
1219 assert .Equal (t , 1000 , ReadLimits (nil , setLimit (5000 )))
@@ -21,3 +28,195 @@ func setLimit(limit int) *int {
2128func setPageSize (pageSize int ) * int {
2229 return & pageSize
2330}
31+
32+ func TestPageUtil_GetNextPageUri (t * testing.T ) {
33+ payload := map [string ]interface {}{
34+ "next_page_uri" : "/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" ,
35+ "page_size" : 50 ,
36+ }
37+ baseUrl := "https://api.twilio.com/"
38+ nextPageUrl := getNextPageUrl (baseUrl , payload )
39+ assert .Equal (t , "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" , nextPageUrl )
40+
41+ payload ["next_page_uri" ] = "2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1"
42+ baseUrl = "https://api.twilio.com"
43+ nextPageUrl = getNextPageUrl (baseUrl , payload )
44+ assert .Equal (t , "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" , nextPageUrl )
45+
46+ payload = map [string ]interface {}{}
47+ nextPageUrl = getNextPageUrl (baseUrl , payload )
48+ assert .Equal (t , "" , nextPageUrl )
49+ }
50+
51+ func TestPageUtil_GetNextPageUrl (t * testing.T ) {
52+ payload := map [string ]interface {}{
53+ "meta" : map [string ]interface {}{
54+ "next_page_url" : "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" ,
55+ "page_size" : 50 ,
56+ },
57+ }
58+
59+ nextPageUrl := getNextPageUrl ("https://apitest.twilio.com" , payload )
60+ assert .Equal (t , "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" , nextPageUrl )
61+ }
62+
63+ func getTestClient (t * testing.T ) * MockBaseClient {
64+ mockCtrl := gomock .NewController (t )
65+ testClient := NewMockBaseClient (mockCtrl )
66+ testClient .EXPECT ().AccountSid ().DoAndReturn (func () string {
67+ return "AC222222222222222222222222222222"
68+ }).AnyTimes ()
69+
70+ testClient .EXPECT ().SendRequest (
71+ gomock .Any (),
72+ gomock .Any (),
73+ gomock .Any (),
74+ gomock .Any ()).
75+ DoAndReturn (func (method string , rawURL string , data url.Values ,
76+ headers map [string ]interface {}) (* http.Response , error ) {
77+ response := map [string ]interface {}{
78+ "end" : 4 ,
79+ "first_page_uri" : "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=0" ,
80+ "messages" : []map [string ]interface {}{
81+ {
82+ "direction" : "outbound-api" ,
83+ "from" : "4444444444" ,
84+ "to" : "9999999999" ,
85+ "body" : "Message 0" ,
86+ "status" : "delivered" ,
87+ },
88+ {
89+ "direction" : "outbound-api" ,
90+ "from" : "4444444444" ,
91+ "to" : "9999999999" ,
92+ "body" : "Message 1" ,
93+ "status" : "delivered" ,
94+ },
95+ },
96+ "uri" : "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=0&PageToken=dummy" ,
97+ "page_size" : 5 ,
98+ "start" : 0 ,
99+ "next_page_uri" : "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=1&PageToken=PASMXX" ,
100+ "page" : 0 ,
101+ }
102+
103+ resp , _ := json .Marshal (response )
104+
105+ return & http.Response {
106+ Body : ioutil .NopCloser (bytes .NewReader (resp )),
107+ }, nil
108+ },
109+ )
110+
111+ return testClient
112+ }
113+
114+ type testResponse struct {
115+ End int `json:"end,omitempty"`
116+ FirstPageUri string `json:"first_page_uri,omitempty"`
117+ Messages []testMessage `json:"messages,omitempty"`
118+ NextPageUri string `json:"next_page_uri,omitempty"`
119+ Page int `json:"page,omitempty"`
120+ PageSize int `json:"page_size,omitempty"`
121+ PreviousPageUri string `json:"previous_page_uri,omitempty"`
122+ Start int `json:"start,omitempty"`
123+ Uri string `json:"uri,omitempty"`
124+ }
125+
126+ type testMessage struct {
127+ // The message text
128+ Body * string `json:"body,omitempty"`
129+ // The direction of the message
130+ Direction * string `json:"direction,omitempty"`
131+ // The phone number that initiated the message
132+ From * string `json:"from,omitempty"`
133+ // The status of the message
134+ Status * string `json:"status,omitempty"`
135+ // The phone number that received the message
136+ To * string `json:"to,omitempty"`
137+ }
138+
139+ func getSomething (nextPageUrl string ) (interface {}, error ) {
140+ return nextPageUrl , nil
141+ }
142+
143+ func TestPageUtil_GetNext (t * testing.T ) {
144+ testClient := getTestClient (t )
145+ baseUrl := "https://api.twilio.com"
146+ response , _ := testClient .SendRequest ("get" , "" , nil , nil ) //nolint:bodyclose
147+ ps := & testResponse {}
148+ _ = json .NewDecoder (response .Body ).Decode (ps )
149+
150+ curRecord := 0
151+ limit := 10
152+
153+ nextPageUrl , err := GetNext (baseUrl , ps , & curRecord , & limit , getSomething )
154+ assert .Equal (t , "https://api.twilio.com/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=1&PageToken=PASMXX" , nextPageUrl )
155+ assert .Nil (t , err )
156+
157+ curRecord = 15
158+ nextPageUrl , err = GetNext (baseUrl , ps , & curRecord , & limit , getSomething )
159+ assert .Empty (t , nextPageUrl )
160+ assert .Nil (t , err )
161+ }
162+
163+ func TestPageUtil_GetNextWithErr (t * testing.T ) {
164+ nextPageUrl , err := GetNext ("baseUrl" , nil , nil , nil , getSomething )
165+ assert .Nil (t , nextPageUrl )
166+ assert .NotNil (t , err )
167+ }
168+
169+ func TestPageUtil_ToMap (t * testing.T ) {
170+ testMap := toMap ("invalid" )
171+ assert .Nil (t , testMap )
172+
173+ valid := testResponse {
174+ End : 0 ,
175+ FirstPageUri : "first" ,
176+ Messages : nil ,
177+ NextPageUri : "next" ,
178+ Page : 0 ,
179+ PageSize : 0 ,
180+ PreviousPageUri : "previous" ,
181+ Start : 0 ,
182+ Uri : "uri" ,
183+ }
184+ testMap = toMap (valid )
185+ assert .NotNil (t , testMap )
186+ }
187+
188+ func TestPageUtil_GetNextPageAddress (t * testing.T ) {
189+ nextPageAddress , _ := getNextPageAddress ("baseUrl" , nil , nil , nil )
190+ assert .Empty (t , nextPageAddress )
191+ }
192+
193+ func TestPageUtil_GetPayload (t * testing.T ) {
194+ response := map [string ]interface {}{
195+ "end" : 4 ,
196+ "first_page_uri" : "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=0" ,
197+ "messages" : []map [string ]interface {}{
198+ {
199+ "direction" : "outbound-api" ,
200+ "from" : "4444444444" ,
201+ "to" : "9999999999" ,
202+ "body" : "Message 0" ,
203+ "status" : "delivered" ,
204+ },
205+ },
206+ "messages2" : []map [string ]interface {}{
207+ {
208+ "direction" : "outbound-api" ,
209+ "from" : "4444444444" ,
210+ "to" : "9999999999" ,
211+ "body" : "Message 0" ,
212+ "status" : "delivered" ,
213+ },
214+ },
215+ }
216+
217+ payload , nextPageUrl , err := GetPayload ("baseUrl" , response )
218+ assert .Nil (t , payload )
219+ assert .Empty (t , nextPageUrl )
220+ assert .NotNil (t , err )
221+ assert .Equal (t , "payload contains more than 1 record of type array" , err .Error ())
222+ }
0 commit comments