github.com/polygon-io/client-go@v1.16.4/rest/vx_test.go (about)

     1  package polygon_test
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"testing"
     7  
     8  	"github.com/jarcoal/httpmock"
     9  	polygon "github.com/polygon-io/client-go/rest"
    10  	"github.com/polygon-io/client-go/rest/models"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestListStockFinancials(t *testing.T) {
    16  	c := polygon.New("API_KEY")
    17  
    18  	httpmock.ActivateNonDefault(c.HTTP.GetClient())
    19  	defer httpmock.DeactivateAndReset()
    20  
    21  	financial := `
    22  	{
    23  		"financials":{
    24  			"comprehensive_income":{
    25  			"other_comprehensive_income_loss":{
    26  				"label":"Other Comprehensive Income/Loss",
    27  				"value":-3.9e+06,
    28  				"unit":"USD",
    29  				"order":400
    30  			},
    31  			"comprehensive_income_loss":{
    32  				"label":"Comprehensive Income/Loss",
    33  				"value":4.1e+07,
    34  				"unit":"USD",
    35  				"order":100
    36  			},
    37  			"comprehensive_income_loss_attributable_to_noncontrolling_interest":{
    38  				"label":"Comprehensive Income/Loss Attributable To Noncontrolling Interest",
    39  				"value":900000,
    40  				"unit":"USD",
    41  				"order":200
    42  			},
    43  			"comprehensive_income_loss_attributable_to_parent":{
    44  				"label":"Comprehensive Income/Loss Attributable To Parent",
    45  				"value":4.01e+07,
    46  				"unit":"USD",
    47  				"order":300
    48  			}
    49  			},
    50  			"income_statement":{
    51  			"income_loss_from_continuing_operations_before_tax":{
    52  				"label":"Income/Loss From Continuing Operations Before Tax",
    53  				"value":5.6e+07,
    54  				"unit":"USD",
    55  				"order":1500
    56  			},
    57  			"nonoperating_income_loss":{
    58  				"label":"Nonoperating Income/Loss",
    59  				"value":-1.02e+07,
    60  				"unit":"USD",
    61  				"order":900
    62  			},
    63  			"revenues":{
    64  				"label":"Revenues",
    65  				"value":5.191e+08,
    66  				"unit":"USD",
    67  				"order":100
    68  			},
    69  			"income_loss_from_equity_method_investments":{
    70  				"label":"Income/Loss From Equity Method Investments",
    71  				"value":100000,
    72  				"unit":"USD",
    73  				"order":2100
    74  			},
    75  			"net_income_loss_attributable_to_noncontrolling_interest":{
    76  				"label":"Net Income/Loss Attributable To Noncontrolling Interest",
    77  				"value":800000,
    78  				"unit":"USD",
    79  				"order":3300
    80  			},
    81  			"income_tax_expense_benefit":{
    82  				"label":"Income Tax Expense/Benefit",
    83  				"value":1.12e+07,
    84  				"unit":"USD",
    85  				"order":2200
    86  			},
    87  			"basic_earnings_per_share":{
    88  				"label":"Basic Earnings Per Share",
    89  				"value":1.33,
    90  				"unit":"USD / shares",
    91  				"order":4200
    92  			},
    93  			"income_loss_from_continuing_operations_after_tax":{
    94  				"label":"Income/Loss From Continuing Operations After Tax",
    95  				"value":4.48e+07,
    96  				"unit":"USD",
    97  				"order":1400
    98  			},
    99  			"participating_securities_distributed_and_undistributed_earnings_loss_basic":{
   100  				"label":"Participating Securities, Distributed And Undistributed Earnings/Loss, Basic",
   101  				"value":0,
   102  				"unit":"USD",
   103  				"order":3800
   104  			},
   105  			"benefits_costs_expenses":{
   106  				"label":"Benefits Costs and Expenses",
   107  				"value":4.631e+08,
   108  				"unit":"USD",
   109  				"order":200
   110  			},
   111  			"gross_profit":{
   112  				"label":"Gross Profit",
   113  				"value":1.217e+08,
   114  				"unit":"USD",
   115  				"order":800
   116  			},
   117  			"costs_and_expenses":{
   118  				"label":"Costs And Expenses",
   119  				"value":4.631e+08,
   120  				"unit":"USD",
   121  				"order":600
   122  			},
   123  			"operating_expenses":{
   124  				"label":"Operating Expenses",
   125  				"value":5.55e+07,
   126  				"unit":"USD",
   127  				"order":1000
   128  			},
   129  			"preferred_stock_dividends_and_other_adjustments":{
   130  				"label":"Preferred Stock Dividends And Other Adjustments",
   131  				"value":0,
   132  				"unit":"USD",
   133  				"order":3900
   134  			},
   135  			"interest_expense_operating":{
   136  				"label":"Interest Expense, Operating",
   137  				"value":9.8e+06,
   138  				"unit":"USD",
   139  				"order":2700
   140  			},
   141  			"cost_of_revenue":{
   142  				"label":"Cost Of Revenue",
   143  				"value":3.974e+08,
   144  				"unit":"USD",
   145  				"order":300
   146  			},
   147  			"diluted_earnings_per_share":{
   148  				"label":"Diluted Earnings Per Share",
   149  				"value":1.33,
   150  				"unit":"USD / shares",
   151  				"order":4300
   152  			},
   153  			"net_income_loss_available_to_common_stockholders_basic":{
   154  				"label":"Net Income/Loss Available To Common Stockholders, Basic",
   155  				"value":4.41e+07,
   156  				"unit":"USD",
   157  				"order":3700
   158  			},
   159  			"net_income_loss":{
   160  				"label":"Net Income/Loss",
   161  				"value":4.49e+07,
   162  				"unit":"USD",
   163  				"order":3200
   164  			},
   165  			"operating_income_loss":{
   166  				"label":"Operating Income/Loss",
   167  				"value":6.62e+07,
   168  				"unit":"USD",
   169  				"order":1100
   170  			},
   171  			"income_loss_before_equity_method_investments":{
   172  				"label":"Income/Loss Before Equity Method Investments",
   173  				"value":5.6e+07,
   174  				"unit":"USD",
   175  				"order":1300
   176  			},
   177  			"net_income_loss_attributable_to_parent":{
   178  				"label":"Net Income/Loss Attributable To Parent",
   179  				"value":4.41e+07,
   180  				"unit":"USD",
   181  				"order":3500
   182  			}
   183  			},
   184  			"balance_sheet":{
   185  			"equity":{
   186  				"label":"Equity",
   187  				"value":1.603e+09,
   188  				"unit":"USD",
   189  				"order":1400
   190  			},
   191  			"current_assets":{
   192  				"label":"Current Assets",
   193  				"value":1.0903e+09,
   194  				"unit":"USD",
   195  				"order":200
   196  			},
   197  			"liabilities":{
   198  				"label":"Liabilities",
   199  				"value":1.8228e+09,
   200  				"unit":"USD",
   201  				"order":600
   202  			},
   203  			"fixed_assets":{
   204  				"label":"Fixed Assets",
   205  				"value":1.0462e+09,
   206  				"unit":"USD",
   207  				"order":400
   208  			},
   209  			"equity_attributable_to_parent":{
   210  				"label":"Equity Attributable To Parent",
   211  				"value":1.562e+09,
   212  				"unit":"USD",
   213  				"order":1600
   214  			},
   215  			"noncurrent_assets":{
   216  				"label":"Noncurrent Assets",
   217  				"value":2.3355e+09,
   218  				"unit":"USD",
   219  				"order":300
   220  			},
   221  			"equity_attributable_to_noncontrolling_interest":{
   222  				"label":"Equity Attributable To Noncontrolling Interest",
   223  				"value":4.1e+07,
   224  				"unit":"USD",
   225  				"order":1500
   226  			},
   227  			"assets":{
   228  				"label":"Assets",
   229  				"value":3.4258e+09,
   230  				"unit":"USD",
   231  				"order":100
   232  			},
   233  			"liabilities_and_equity":{
   234  				"label":"Liabilities And Equity",
   235  				"value":3.4258e+09,
   236  				"unit":"USD",
   237  				"order":1900
   238  			},
   239  			"noncurrent_liabilities":{
   240  				"label":"Noncurrent Liabilities",
   241  				"value":1.3677e+09,
   242  				"unit":"USD",
   243  				"order":800
   244  			},
   245  			"other_than_fixed_noncurrent_assets":{
   246  				"label":"Other Than Fixed Noncurrent Assets",
   247  				"value":1.2893e+09,
   248  				"unit":"USD",
   249  				"order":500
   250  			},
   251  			"current_liabilities":{
   252  				"label":"Current Liabilities",
   253  				"value":4.551e+08,
   254  				"unit":"USD",
   255  				"order":700
   256  			}
   257  			},
   258  			"cash_flow_statement":{
   259  			"net_cash_flow_from_operating_activities":{
   260  				"label":"Net Cash Flow From Operating Activities",
   261  				"value":300000,
   262  				"unit":"USD",
   263  				"order":100
   264  			},
   265  			"exchange_gains_losses":{
   266  				"label":"Exchange Gains/Losses",
   267  				"value":-3.6e+06,
   268  				"unit":"USD",
   269  				"order":1000
   270  			},
   271  			"net_cash_flow_from_investing_activities":{
   272  				"label":"Net Cash Flow From Investing Activities",
   273  				"value":-1.71e+07,
   274  				"unit":"USD",
   275  				"order":400
   276  			},
   277  			"net_cash_flow_continuing":{
   278  				"label":"Net Cash Flow, Continuing",
   279  				"value":-7.9e+06,
   280  				"unit":"USD",
   281  				"order":1200
   282  			},
   283  			"net_cash_flow":{
   284  				"label":"Net Cash Flow",
   285  				"value":-1.15e+07,
   286  				"unit":"USD",
   287  				"order":1100
   288  			},
   289  			"net_cash_flow_from_financing_activities":{
   290  				"label":"Net Cash Flow From Financing Activities",
   291  				"value":8.9e+06,
   292  				"unit":"USD",
   293  				"order":700
   294  			},
   295  			"net_cash_flow_from_operating_activities_continuing":{
   296  				"label":"Net Cash Flow From Operating Activities, Continuing",
   297  				"value":300000,
   298  				"unit":"USD",
   299  				"order":200
   300  			},
   301  			"net_cash_flow_from_financing_activities_continuing":{
   302  				"label":"Net Cash Flow From Financing Activities, Continuing",
   303  				"value":8.9e+06,
   304  				"unit":"USD",
   305  				"order":800
   306  			},
   307  			"net_cash_flow_from_investing_activities_continuing":{
   308  				"label":"Net Cash Flow From Investing Activities, Continuing",
   309  				"value":-1.71e+07,
   310  				"unit":"USD",
   311  				"order":500
   312  			}
   313  			}
   314  		},
   315  		"start_date":"2022-01-01",
   316  		"end_date":"2022-04-03",
   317  		"filing_date":"2022-04-29",
   318  		"cik":"0000891014",
   319  		"company_name":"MINERALS TECHNOLOGIES INC.",
   320  		"fiscal_period":"Q1",
   321  		"fiscal_year":"2022",
   322  		"source_filing_url":"https://api.polygon.io/v1/reference/sec/filings/0000891014-22-000022",
   323  		"source_filing_file_url":"https://api.polygon.io/v1/reference/sec/filings/0000891014-22-000022/files/form10q_htm.xml"
   324  	}
   325  	`
   326  
   327  	expectedResponse := `{
   328  	"status": "OK",
   329  	"request_id":"874d62dbbce4b437bde7885d44a6be36",
   330  	"count":1,
   331  	"next_url":"https://api.polygon.io/vX/reference/financials?cursor=YXA9MjAyMjA0MDMmYXM9MDAwMDg5MTAxNC0yMi0wMDAwMjImaGFzX3hicmw9dHJ1ZSZsaW1pdD0xJnNvcnQ9cGVyaW9kX29mX3JlcG9ydF9kYXRlJnR5cGU9MTAtUQ",
   332  	"results": [
   333  ` + indent(true, financial, "\t\t") + `
   334  	]
   335  }`
   336  
   337  	registerResponder("https://api.polygon.io/vX/reference/financials?ticker=MTX", expectedResponse)
   338  	registerResponder("https://api.polygon.io/vX/reference/financials?cursor=YXA9MjAyMjA0MDMmYXM9MDAwMDg5MTAxNC0yMi0wMDAwMjImaGFzX3hicmw9dHJ1ZSZsaW1pdD0xJnNvcnQ9cGVyaW9kX29mX3JlcG9ydF9kYXRlJnR5cGU9MTAtUQ", "{}")
   339  	iter := c.VX.ListStockFinancials(context.Background(), models.ListStockFinancialsParams{}.WithTicker("MTX"))
   340  
   341  	// iter creation
   342  	assert.Nil(t, iter.Err())
   343  	assert.NotNil(t, iter.Item())
   344  
   345  	// first item
   346  	assert.True(t, iter.Next())
   347  	assert.Nil(t, iter.Err())
   348  	var expect models.StockFinancial
   349  	err := json.Unmarshal([]byte(financial), &expect)
   350  	assert.Nil(t, err)
   351  	assert.Equal(t, expect, iter.Item())
   352  
   353  	// end of list
   354  	assert.False(t, iter.Next())
   355  	assert.Nil(t, iter.Err())
   356  }
   357  
   358  func TestGetTickerEvents(t *testing.T) {
   359  	c := polygon.New("API_KEY")
   360  
   361  	httpmock.ActivateNonDefault(c.HTTP.GetClient())
   362  	defer httpmock.DeactivateAndReset()
   363  
   364  	events := `
   365  	{
   366  	  "events": [
   367  		{
   368  		  "date": "2022-06-09",
   369  		  "ticker_change": {
   370  			"ticker": "META"
   371  		  },
   372  		  "type": "ticker_change"
   373  		},
   374  		{
   375  		  "date": "2012-05-18",
   376  		  "ticker_change": {
   377  			"ticker": "FB"
   378  		  },
   379  		  "type": "ticker_change"
   380  		}
   381  	  ],
   382  	  "name": "Meta Platforms, Inc. Class A Common Stock"
   383  	}
   384  	`
   385  
   386  	expectedResponse := `{
   387  	"status": "OK",
   388  	"request_id":"874d62dbbce4b437bde7885d44a6be36",
   389  	"count":1,
   390  	"next_url":"https://api.polygon.io/vX/reference/financials?cursor=YXA9MjAyMjA0MDMmYXM9MDAwMDg5MTAxNC0yMi0wMDAwMjImaGFzX3hicmw9dHJ1ZSZsaW1pdD0xJnNvcnQ9cGVyaW9kX29mX3JlcG9ydF9kYXRlJnR5cGU9MTAtUQ",
   391  	"results": [
   392  ` + indent(true, events, "\t\t") + `
   393  	]
   394  }`
   395  
   396  	registerResponder("https://api.polygon.io/vX/reference/tickers/META/events", expectedResponse)
   397  
   398  	res, err := c.VX.GetTickerEvents(context.Background(), &models.GetTickerEventsParams{ID: "META"})
   399  	require.NoError(t, err)
   400  
   401  	var expect models.GetTickerEventsResponse
   402  	err = json.Unmarshal([]byte(expectedResponse), &expect)
   403  	assert.Nil(t, err)
   404  	assert.Equal(t, &expect, res)
   405  }