github.com/polygon-io/client-go@v1.16.4/rest/indicators_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 const ( 16 expectedGetSMAURL = "https://api.polygon.io/v1/indicators/sma/AAPL" 17 expectedGetSMAResponse = `{ 18 "status": "OK", 19 "request_id": "6a7e466379af0a71039d60cc78e72282", 20 "next_url": "https://api.polygon.io/v1/indicators/SMA/AAPL?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZ", 21 "results": { 22 "values":[ 23 { 24 "timestamp": 1578027600, 25 "value": 141.34 26 }, 27 { 28 "timestamp": 1578035600, 29 "value": 139.33 30 }, 31 { 32 "timestamp": 1578049600, 33 "value": 138.22 34 } 35 ], 36 "underlying": { 37 "aggregates": [ 38 { 39 "v": 135647456, 40 "vw": 74.6099, 41 "o": 74.06, 42 "c": 75.0875, 43 "h": 75.15, 44 "l": 73.7975, 45 "t": 1577941200000, 46 "n": 1 47 }, 48 { 49 "v": 146535512, 50 "vw": 74.7026, 51 "o": 74.2875, 52 "c": 74.3575, 53 "h": 75.145, 54 "l": 74.125, 55 "t": 1578027600000, 56 "n": 1 57 } 58 ], 59 "url": "https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/1626912000000/1629590400000?adjusted=true&limit=1&sort=desc" 60 } 61 } 62 }` 63 64 expectedGetSMAResponseNoAggsNoNextURL = `{ 65 "status": "OK", 66 "request_id": "6a7e466379af0a71039d60cc78e72282", 67 "results": { 68 "values":[ 69 { 70 "timestamp": 1578027600, 71 "value": 141.34 72 } 73 ], 74 "underlying": { 75 "url": "https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/1626912000000/1629590400000?adjusted=true&limit=1&sort=desc" 76 } 77 } 78 }` 79 ) 80 81 func TestGetSMA(t *testing.T) { 82 c := polygon.New("API_KEY") 83 84 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 85 defer httpmock.DeactivateAndReset() 86 registerResponder(expectedGetSMAURL, expectedGetSMAResponse) 87 88 res, err := c.GetSMA(context.Background(), &models.GetSMAParams{ 89 Ticker: "AAPL", 90 }) 91 assert.Nil(t, err) 92 93 var expect models.GetSMAResponse 94 err = json.Unmarshal([]byte(expectedGetSMAResponse), &expect) 95 assert.Nil(t, err) 96 assert.Equal(t, &expect, res) 97 } 98 99 func TestGetSMAWithQueryParams(t *testing.T) { 100 c := polygon.New("API_KEY") 101 102 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 103 defer httpmock.DeactivateAndReset() 104 registerResponder("https://api.polygon.io/v1/indicators/sma/AAPL?adjusted=false&order=asc&series_type=open×pan=week×tamp.gte=1041379200000×tamp.lte=1658707200000&window=6", expectedGetSMAResponseNoAggsNoNextURL) 105 106 res, err := c.GetSMA(context.Background(), models.GetSMAParams{ 107 Ticker: "AAPL", 108 }.WithOrder(models.Asc). 109 WithAdjusted(false). 110 WithTimestamp(models.GTE, models.Millis(time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC))). 111 WithTimestamp(models.LTE, models.Millis(time.Date(2022, 7, 25, 0, 0, 0, 0, time.UTC))). 112 WithTimespan(models.Week). 113 WithSeriesType(models.Open). 114 WithWindow(6)) 115 116 assert.Nil(t, err) 117 118 var expect models.GetSMAResponse 119 err = json.Unmarshal([]byte(expectedGetSMAResponseNoAggsNoNextURL), &expect) 120 assert.Nil(t, err) 121 assert.Equal(t, &expect, res) 122 } 123 124 func TestGetEMA(t *testing.T) { 125 c := polygon.New("API_KEY") 126 127 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 128 defer httpmock.DeactivateAndReset() 129 130 expectedEMAResponse := `{ 131 "status": "OK", 132 "request_id": "6a7e466379af0a71039d60cc78e72282", 133 "next_url": "https://api.polygon.io/v1/indicators/EMA/X:BTC-USD?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZ", 134 "results": { 135 "values":[ 136 { 137 "timestamp": 1578027600, 138 "value": 141.34 139 } 140 ], 141 "underlying": { 142 "aggregates": [ 143 { 144 "v": 135647456, 145 "vw": 74.6099, 146 "o": 74.06, 147 "c": 75.0875, 148 "h": 75.15, 149 "l": 73.7975, 150 "t": 1577941200000, 151 "n": 1 152 } 153 ], 154 "url": "https://api.polygon.io/v2/aggs/ticker/X:BTC-USD/range/1/day/1626912000000/1629590400000?adjusted=true&limit=1&sort=desc" 155 } 156 } 157 }` 158 159 registerResponder("https://api.polygon.io/v1/indicators/ema/X:BTC-USD?order=desc×tamp.gte=1041379200000&window=10", expectedEMAResponse) 160 161 res, err := c.GetEMA(context.Background(), models.GetEMAParams{ 162 Ticker: "X:BTC-USD", 163 }.WithWindow(10). 164 WithOrder(models.Desc). 165 WithTimestamp(models.GTE, models.Millis(time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC)))) 166 167 assert.Nil(t, err) 168 169 var expect models.GetEMAResponse 170 err = json.Unmarshal([]byte(expectedEMAResponse), &expect) 171 assert.Nil(t, err) 172 assert.Equal(t, &expect, res) 173 } 174 175 func TestGetRSI(t *testing.T) { 176 c := polygon.New("API_KEY") 177 178 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 179 defer httpmock.DeactivateAndReset() 180 181 expectedRSIResponse := `{ 182 "status": "OK", 183 "request_id": "6a7e466379af0a71039d60cc78e72282", 184 "next_url": "https://api.polygon.io/v1/indicators/RSI/O:SPY241220P00720000?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZ", 185 "results": { 186 "underlying": { 187 "url": "https://api.polygon.io/v2/aggs/ticker/O:SPY241220P00720000/range/1/day/1626912000000/1629590400000?adjusted=true&limit=1&sort=desc" 188 } 189 } 190 }` 191 192 registerResponder("https://api.polygon.io/v1/indicators/rsi/O:SPY241220P00720000?order=desc×tamp.gte=1041379200000&window=10", expectedRSIResponse) 193 194 res, err := c.GetRSI(context.Background(), models.GetRSIParams{ 195 Ticker: "O:SPY241220P00720000", 196 }.WithWindow(10). 197 WithOrder(models.Desc). 198 WithTimestamp(models.GTE, models.Millis(time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC)))) 199 200 assert.Nil(t, err) 201 202 var expect models.GetRSIResponse 203 err = json.Unmarshal([]byte(expectedRSIResponse), &expect) 204 assert.Nil(t, err) 205 assert.Equal(t, &expect, res) 206 } 207 208 func TestGetMACD(t *testing.T) { 209 c := polygon.New("API_KEY") 210 211 httpmock.ActivateNonDefault(c.HTTP.GetClient()) 212 defer httpmock.DeactivateAndReset() 213 214 expectedMACDResponse := `{ 215 "status": "OK", 216 "request_id": "6a7e466379af0a71039d60cc78e72282", 217 "results": { 218 "underlying": { 219 "url": "https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/day/1626912000000/1629590400000?adjusted=true&limit=1&sort=desc" 220 }, 221 "values":[ 222 { 223 "timestamp": 1578027600, 224 "value": 141.34, 225 "signal": 143.34, 226 "histogram": 145.34 227 }, 228 { 229 "timestamp": 1578028400, 230 "value": 146.34, 231 "signal": 148.34, 232 "histogram": 150.34 233 } 234 ] 235 } 236 }` 237 238 registerResponder("https://api.polygon.io/v1/indicators/macd/AAPL?long_window=26&order=desc&short_window=12&signal_window=9×tamp.lte=1041379200000", expectedMACDResponse) 239 240 res, err := c.GetMACD(context.Background(), models.GetMACDParams{ 241 Ticker: "AAPL", 242 }.WithShortWindow(12). 243 WithLongWindow(26). 244 WithSignalWindow(9). 245 WithOrder(models.Desc). 246 WithTimestamp(models.LTE, models.Millis(time.Date(2003, 1, 1, 0, 0, 0, 0, time.UTC)))) 247 248 assert.Nil(t, err) 249 250 var expect models.GetMACDResponse 251 err = json.Unmarshal([]byte(expectedMACDResponse), &expect) 252 assert.Nil(t, err) 253 assert.Equal(t, &expect, res) 254 }