github.com/polygon-io/client-go@v1.16.4/rest/trades_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 TestListTrades(t *testing.T) {
    16  	c := polygon.New("API_KEY")
    17  
    18  	httpmock.ActivateNonDefault(c.HTTP.GetClient())
    19  	defer httpmock.DeactivateAndReset()
    20  
    21  	trade1 := `{
    22  	"conditions": [
    23  		12,
    24  		41
    25  	],
    26  	"exchange": 11,
    27  	"id": "1",
    28  	"participant_timestamp": 1517562000015577000,
    29  	"price": 171.55,
    30  	"sequence_number": 1063,
    31  	"sip_timestamp": 1517562000016036600,
    32  	"size": 100,
    33  	"tape": 3
    34  }`
    35  
    36  	trade2 := `{
    37  	"conditions": [
    38  		12,
    39  		41
    40  	],
    41  	"exchange": 11,
    42  	"id": "2",
    43  	"participant_timestamp": 1517562000015577600,
    44  	"price": 171.55,
    45  	"sequence_number": 1064,
    46  	"sip_timestamp": 1517562000016038100,
    47  	"size": 100,
    48  	"tape": 3
    49  }`
    50  
    51  	expectedResponse := `{
    52  	"status": "OK",
    53  	"request_id": "a47d1beb8c11b6ae897ab76cdbbf35a3",
    54  	"next_url": "https://api.polygon.io/v3/trades/AAPL?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZXI9YXNjJnBhZ2VfbWFya2VyPUElN0M5YWRjMjY0ZTgyM2E1ZjBiOGUyNDc5YmZiOGE1YmYwNDVkYzU0YjgwMDcyMWE2YmI1ZjBjMjQwMjU4MjFmNGZiJnNvcnQ9dGlja2Vy",
    55  	"results": [
    56  ` + indent(true, trade1, "\t\t") + `,
    57  ` + indent(true, trade2, "\t\t") + `
    58  	]
    59  }`
    60  
    61  	registerResponder("https://api.polygon.io/v3/trades/AAPL?limit=2&order=asc&sort=timestamp&timestamp.gte=1626948000000000000", expectedResponse)
    62  	registerResponder("https://api.polygon.io/v3/trades/AAPL?cursor=YWN0aXZlPXRydWUmZGF0ZT0yMDIxLTA0LTI1JmxpbWl0PTEmb3JkZXI9YXNjJnBhZ2VfbWFya2VyPUElN0M5YWRjMjY0ZTgyM2E1ZjBiOGUyNDc5YmZiOGE1YmYwNDVkYzU0YjgwMDcyMWE2YmI1ZjBjMjQwMjU4MjFmNGZiJnNvcnQ9dGlja2Vy&sort=timestamp", "{}")
    63  	iter := c.ListTrades(context.Background(), models.ListTradesParams{Ticker: "AAPL"}.
    64  		WithTimestamp(models.GTE, models.Nanos(time.Date(2021, 7, 22, 10, 0, 0, 0, time.UTC))).
    65  		WithOrder(models.Asc).WithLimit(2), models.QueryParam("sort", string(models.Timestamp)))
    66  
    67  	// iter creation
    68  	assert.Nil(t, iter.Err())
    69  	assert.NotNil(t, iter.Item())
    70  
    71  	// first item
    72  	assert.True(t, iter.Next())
    73  	assert.Nil(t, iter.Err())
    74  	var expect1 models.Trade
    75  	err := json.Unmarshal([]byte(trade1), &expect1)
    76  	assert.Nil(t, err)
    77  	assert.Equal(t, expect1, iter.Item())
    78  
    79  	// second item
    80  	assert.True(t, iter.Next())
    81  	assert.Nil(t, iter.Err())
    82  	var expect2 models.Trade
    83  	err = json.Unmarshal([]byte(trade2), &expect2)
    84  	assert.Nil(t, err)
    85  	assert.Equal(t, expect2, iter.Item())
    86  
    87  	// end of list
    88  	assert.False(t, iter.Next())
    89  	assert.Nil(t, iter.Err())
    90  }
    91  
    92  func TestGetLastTrade(t *testing.T) {
    93  	c := polygon.New("API_KEY")
    94  
    95  	httpmock.ActivateNonDefault(c.HTTP.GetClient())
    96  	defer httpmock.DeactivateAndReset()
    97  
    98  	expectedResponse := `{
    99  	"status": "OK",
   100  	"request_id": "f05562305bd26ced64b98ed68b3c5d96",
   101  	"results": {
   102  		"T": "AAPL",
   103  		"f": 1617901342969796400,
   104  		"q": 3135876,
   105  		"t": 1617901342969834000,
   106  		"y": 1617901342968000000,
   107  		"c": [
   108  			37
   109  		],
   110  		"i": "118749",
   111  		"p": 129.8473,
   112  		"r": 202,
   113  		"s": 25,
   114  		"x": 4,
   115  		"z": 3
   116  	}
   117  }`
   118  
   119  	registerResponder("https://api.polygon.io/v2/last/trade/AAPL", expectedResponse)
   120  	res, err := c.GetLastTrade(context.Background(), &models.GetLastTradeParams{
   121  		Ticker: "AAPL",
   122  	})
   123  	assert.Nil(t, err)
   124  
   125  	var expect models.GetLastTradeResponse
   126  	err = json.Unmarshal([]byte(expectedResponse), &expect)
   127  	assert.Nil(t, err)
   128  	assert.Equal(t, &expect, res)
   129  }
   130  
   131  func TestGetLastCryptoTrade(t *testing.T) {
   132  	c := polygon.New("API_KEY")
   133  
   134  	httpmock.ActivateNonDefault(c.HTTP.GetClient())
   135  	defer httpmock.DeactivateAndReset()
   136  
   137  	expectedResponse := `{
   138  	"status": "success",
   139  	"request_id": "d2d779df015fe2b7fbb8e58366610ef7",
   140  	"symbol": "BTC-USD",
   141  	"last": {
   142  		"price": 16835.42,
   143  		"size": 0.006909,
   144  		"exchange": 4,
   145  		"conditions": [
   146  			1
   147  		],
   148  		"timestamp": 1605560885027
   149  	}
   150  }`
   151  
   152  	registerResponder("https://api.polygon.io/v1/last/crypto/BTC/USD", expectedResponse)
   153  	res, err := c.GetLastCryptoTrade(context.Background(), &models.GetLastCryptoTradeParams{
   154  		From: "BTC",
   155  		To:   "USD",
   156  	})
   157  	assert.Nil(t, err)
   158  
   159  	var expect models.GetLastCryptoTradeResponse
   160  	err = json.Unmarshal([]byte(expectedResponse), &expect)
   161  	assert.Nil(t, err)
   162  	assert.Equal(t, &expect, res)
   163  }