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&timestamp=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  }