github.com/twilio/twilio-go@v1.20.1/client/page_util_test.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "io" 7 "net/http" 8 "net/url" 9 "testing" 10 11 "github.com/golang/mock/gomock" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestPageUtil_ReadLimits(t *testing.T) { 17 assert.Equal(t, 5, ReadLimits(nil, setLimit(5))) 18 assert.Equal(t, 5, ReadLimits(setPageSize(10), setLimit(5))) 19 assert.Equal(t, 1000, ReadLimits(nil, setLimit(5000))) 20 assert.Equal(t, 10, ReadLimits(setPageSize(10), nil)) 21 assert.Equal(t, 50, ReadLimits(nil, nil)) 22 } 23 24 func setLimit(limit int) *int { 25 return &limit 26 } 27 28 func setPageSize(pageSize int) *int { 29 return &pageSize 30 } 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, err := getNextPageUrl(baseUrl, payload) 39 assert.Nil(t, err) 40 assert.Equal(t, "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1", nextPageUrl) 41 42 payload["next_page_uri"] = "2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1" 43 baseUrl = "https://api.twilio.com" 44 nextPageUrl, err = getNextPageUrl(baseUrl, payload) 45 assert.Nil(t, err) 46 assert.Equal(t, "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1", nextPageUrl) 47 48 payload = map[string]interface{}{} 49 nextPageUrl, err = getNextPageUrl(baseUrl, payload) 50 assert.Nil(t, err) 51 assert.Equal(t, "", nextPageUrl) 52 } 53 54 func TestPageUtil_GetNextPageUrl(t *testing.T) { 55 payload := map[string]interface{}{ 56 "meta": map[string]interface{}{ 57 "next_page_url": "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1", 58 "page_size": 50, 59 }, 60 } 61 62 nextPageUrl, err := getNextPageUrl("https://apitest.twilio.com", payload) 63 assert.Nil(t, err) 64 assert.Equal(t, "https://api.twilio.com/2010-04-01/Accounts/ACXX/IncomingPhoneNumbers.json?PageSize=50&Page=1", nextPageUrl) 65 } 66 67 func getTestClient(t *testing.T) *MockBaseClient { 68 mockCtrl := gomock.NewController(t) 69 testClient := NewMockBaseClient(mockCtrl) 70 testClient.EXPECT().AccountSid().DoAndReturn(func() string { 71 return "AC222222222222222222222222222222" 72 }).AnyTimes() 73 74 testClient.EXPECT().SendRequest( 75 gomock.Any(), 76 gomock.Any(), 77 gomock.Any(), 78 gomock.Any()). 79 DoAndReturn(func(method string, rawURL string, data url.Values, 80 headers map[string]interface{}) (*http.Response, error) { 81 response := map[string]interface{}{ 82 "end": 4, 83 "first_page_uri": "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=0", 84 "messages": []map[string]interface{}{ 85 { 86 "direction": "outbound-api", 87 "from": "4444444444", 88 "to": "9999999999", 89 "body": "Message 0", 90 "status": "delivered", 91 }, 92 { 93 "direction": "outbound-api", 94 "from": "4444444444", 95 "to": "9999999999", 96 "body": "Message 1", 97 "status": "delivered", 98 }, 99 }, 100 "uri": "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=0&PageToken=dummy", 101 "page_size": 5, 102 "start": 0, 103 "next_page_uri": "/2010-04-01/Accounts/ACXX/Messages.json?From=9999999999&PageNumber=&To=4444444444&PageSize=2&Page=1&PageToken=PASMXX", 104 "page": 0, 105 } 106 107 resp, _ := json.Marshal(response) 108 109 return &http.Response{ 110 Body: io.NopCloser(bytes.NewReader(resp)), 111 }, nil 112 }, 113 ) 114 115 return testClient 116 } 117 118 type testResponse struct { 119 End int `json:"end,omitempty"` 120 FirstPageUri string `json:"first_page_uri,omitempty"` 121 Messages []testMessage `json:"messages,omitempty"` 122 NextPageUri string `json:"next_page_uri,omitempty"` 123 Page int `json:"page,omitempty"` 124 PageSize int `json:"page_size,omitempty"` 125 PreviousPageUri string `json:"previous_page_uri,omitempty"` 126 Start int `json:"start,omitempty"` 127 Uri string `json:"uri,omitempty"` 128 } 129 130 type testMessage struct { 131 // The message text 132 Body *string `json:"body,omitempty"` 133 // The direction of the message 134 Direction *string `json:"direction,omitempty"` 135 // The phone number that initiated the message 136 From *string `json:"from,omitempty"` 137 // The status of the message 138 Status *string `json:"status,omitempty"` 139 // The phone number that received the message 140 To *string `json:"to,omitempty"` 141 } 142 143 func getSomething(nextPageUrl string) (interface{}, error) { 144 return nextPageUrl, nil 145 } 146 147 func TestPageUtil_GetNext(t *testing.T) { 148 testClient := getTestClient(t) 149 baseUrl := "https://api.twilio.com" 150 response, _ := testClient.SendRequest("get", "", nil, nil) //nolint:bodyclose 151 ps := &testResponse{} 152 _ = json.NewDecoder(response.Body).Decode(ps) 153 154 nextPageUrl, err := GetNext(baseUrl, ps, getSomething) 155 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) 156 assert.Nil(t, err) 157 158 nextPageUrl, err = GetNext(baseUrl, nil, getSomething) 159 assert.Empty(t, nextPageUrl) 160 assert.Nil(t, err) 161 } 162 163 func TestPageUtil_ToMap(t *testing.T) { 164 testMap, err := toMap("invalid") 165 assert.NotNil(t, err) 166 assert.Nil(t, testMap) 167 168 valid := testResponse{ 169 End: 0, 170 FirstPageUri: "first", 171 Messages: nil, 172 NextPageUri: "next", 173 Page: 0, 174 PageSize: 0, 175 PreviousPageUri: "previous", 176 Start: 0, 177 Uri: "uri", 178 } 179 testMap, err = toMap(valid) 180 assert.Nil(t, err) 181 assert.NotNil(t, testMap) 182 }