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&timespan=week&timestamp.gte=1041379200000&timestamp.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&timestamp.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&timestamp.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&timestamp.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  }