github.com/polygon-io/client-go@v1.16.4/rest/quotes_test.go (about) 1 package polygon_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "testing" 7 "time" 8 9 "github.com/jarcoal/httpmock" 10 polygon "github.com/polygon-io/client-go/rest" 11 "github.com/polygon-io/client-go/rest/models" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestListQuotes(t *testing.T) { 16 c := polygon.New("API_KEY") 17 18 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 19 defer httpmock.DeactivateAndReset() 20 21 quote1 := `{ 22 "ask_exchange": 10, 23 "ask_price": 103.3, 24 "ask_size": 60, 25 "bid_exchange": 11, 26 "bid_price": 102.7, 27 "bid_size": 60, 28 "conditions": [ 29 1 30 ], 31 "participant_timestamp": 1517562000065321200, 32 "sequence_number": 2060, 33 "sip_timestamp": 1517562000065700400, 34 "tape": 3 35 }` 36 37 quote2 := `{ 38 "ask_exchange": 10, 39 "ask_price": 180, 40 "ask_size": 2, 41 "bid_exchange": 11, 42 "bid_price": 170, 43 "bid_size": 2, 44 "conditions": [ 45 1 46 ], 47 "participant_timestamp": 1517562000065408300, 48 "sequence_number": 2061, 49 "sip_timestamp": 1517562000065791500, 50 "tape": 3 51 }` 52 53 expectedResponse := `{ 54 "status": "OK", 55 "request_id": "a47d1beb8c11b6ae897ab76cdbbf35a3", 56 "next_url": "https://api.polygon.io/v3/quotes/AAPL?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZXI9YXNjJnBhZ2VfbWFya2VyPUElN0M5YWRjMjY0ZTgyM2E1ZjBiOGUyNDc5YmZiOGE1YmYwNDVkYzU0YjgwMDcyMWE2YmI1ZjBjMjQwMjU4MjFmNGZiJnNvcnQ9dGlja2Vy", 57 "results": [ 58 ` + indent(true, quote1, "\t\t") + `, 59 ` + indent(true, quote2, "\t\t") + ` 60 ] 61 }` 62 63 registerResponder("https://api.polygon.io/v3/quotes/AAPL?limit=2&order=asc&sort=timestamp×tamp=2021-07-22", expectedResponse) 64 registerResponder("https://api.polygon.io/v3/quotes/AAPL?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZXI9YXNjJnBhZ2VfbWFya2VyPUElN0M5YWRjMjY0ZTgyM2E1ZjBiOGUyNDc5YmZiOGE1YmYwNDVkYzU0YjgwMDcyMWE2YmI1ZjBjMjQwMjU4MjFmNGZiJnNvcnQ9dGlja2Vy", "{}") 65 iter := c.ListQuotes(context.Background(), models.ListQuotesParams{Ticker: "AAPL"}. 66 WithTimestamp(models.EQ, models.Nanos(time.Date(2021, 7, 22, 0, 0, 0, 0, time.UTC))). 67 WithSort(models.Timestamp).WithOrder(models.Asc).WithLimit(2)) 68 69 // iter creation 70 assert.Nil(t, iter.Err()) 71 assert.NotNil(t, iter.Item()) 72 73 // first item 74 assert.True(t, iter.Next()) 75 assert.Nil(t, iter.Err()) 76 var expect1 models.Quote 77 err := json.Unmarshal([]byte(quote1), &expect1) 78 assert.Nil(t, err) 79 assert.Equal(t, expect1, iter.Item()) 80 81 // second item 82 assert.True(t, iter.Next()) 83 assert.Nil(t, iter.Err()) 84 var expect2 models.Quote 85 err = json.Unmarshal([]byte(quote2), &expect2) 86 assert.Nil(t, err) 87 assert.Equal(t, expect2, iter.Item()) 88 89 // end of list 90 assert.False(t, iter.Next()) 91 assert.Nil(t, iter.Err()) 92 } 93 94 func TestGetLastQuote(t *testing.T) { 95 c := polygon.New("API_KEY") 96 97 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 98 defer httpmock.DeactivateAndReset() 99 100 expectedResponse := `{ 101 "status": "OK", 102 "request_id": "b84e24636301f19f88e0dfbf9a45ed5c", 103 "results": { 104 "T": "AAPL", 105 "X": 19, 106 "P": 127.98, 107 "S": 7, 108 "x": 11, 109 "p": 127.96, 110 "s": 1, 111 "y": 1617827221349366000, 112 "q": 83480742, 113 "t": 1617827221349730300, 114 "z": 3 115 } 116 }` 117 118 registerResponder("https://api.polygon.io/v2/last/nbbo/AAPL", expectedResponse) 119 res, err := c.GetLastQuote(context.Background(), &models.GetLastQuoteParams{ 120 Ticker: "AAPL", 121 }) 122 assert.Nil(t, err) 123 124 var expect models.GetLastQuoteResponse 125 err = json.Unmarshal([]byte(expectedResponse), &expect) 126 assert.Nil(t, err) 127 assert.Equal(t, &expect, res) 128 } 129 130 func TestGetLastForexQuote(t *testing.T) { 131 c := polygon.New("API_KEY") 132 133 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 134 defer httpmock.DeactivateAndReset() 135 136 expectedResponse := `{ 137 "status": "success", 138 "request_id": "a73a29dbcab4613eeaf48583d3baacf0", 139 "symbol": "AUD/USD", 140 "last": { 141 "ask": 0.73124, 142 "bid": 0.73122, 143 "exchange": 48, 144 "timestamp": 1605557756000 145 } 146 }` 147 148 registerResponder("https://api.polygon.io/v1/last_quote/currencies/USD/GBP", expectedResponse) 149 res, err := c.GetLastForexQuote(context.Background(), &models.GetLastForexQuoteParams{ 150 From: "USD", 151 To: "GBP", 152 }) 153 assert.Nil(t, err) 154 155 var expect models.GetLastForexQuoteResponse 156 err = json.Unmarshal([]byte(expectedResponse), &expect) 157 assert.Nil(t, err) 158 assert.Equal(t, &expect, res) 159 } 160 161 func TestGetRealTimeCurrencyConversion(t *testing.T) { 162 c := polygon.New("API_KEY") 163 164 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 165 defer httpmock.DeactivateAndReset() 166 167 expectedResponse := `{ 168 "status": "success", 169 "initialAmount": 100, 170 "converted": 73.14, 171 "from": "AUD", 172 "to": "USD", 173 "last": { 174 "ask": 1.3673344, 175 "bid": 1.3672596, 176 "exchange": 48, 177 "timestamp": 1605555313000 178 } 179 }` 180 181 registerResponder("https://api.polygon.io/v1/conversion/USD/GBP", expectedResponse) 182 res, err := c.GetRealTimeCurrencyConversion(context.Background(), &models.GetRealTimeCurrencyConversionParams{ 183 From: "USD", 184 To: "GBP", 185 }) 186 assert.Nil(t, err) 187 188 var expect models.GetRealTimeCurrencyConversionResponse 189 err = json.Unmarshal([]byte(expectedResponse), &expect) 190 assert.Nil(t, err) 191 assert.Equal(t, &expect, res) 192 }