|
|
"""Test etf extension.""" |
|
|
|
|
|
import pytest |
|
|
from extensions.tests.conftest import parametrize |
|
|
from openbb_core.app.model.obbject import OBBject |
|
|
|
|
|
|
|
|
@pytest.fixture(scope="session") |
|
|
def obb(pytestconfig): |
|
|
"""Fixture to setup obb.""" |
|
|
|
|
|
if pytestconfig.getoption("markexpr") != "not integration": |
|
|
import openbb |
|
|
|
|
|
return openbb.obb |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"query": None, "provider": "fmp"}), |
|
|
( |
|
|
{ |
|
|
"query": "vanguard", |
|
|
"provider": "tmx", |
|
|
"div_freq": "quarterly", |
|
|
"sort_by": "return_1y", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"query": "vanguard", |
|
|
"provider": "intrinio", |
|
|
"exchange": "arcx", |
|
|
} |
|
|
), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_search(params, obb): |
|
|
"""Test the ETF search endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.search(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
( |
|
|
{ |
|
|
"adjustment": "unadjusted", |
|
|
"extended_hours": True, |
|
|
"provider": "alpha_vantage", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "15m", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "cboe", |
|
|
"symbol": "SPY", |
|
|
"start_date": None, |
|
|
"end_date": None, |
|
|
"interval": "1m", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "cboe", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "fmp", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"timezone": "UTC", |
|
|
"source": "realtime", |
|
|
"start_time": None, |
|
|
"end_time": None, |
|
|
"provider": "intrinio", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-06-01", |
|
|
"end_date": "2023-06-03", |
|
|
"interval": "1h", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"timezone": None, |
|
|
"source": "delayed", |
|
|
"start_time": None, |
|
|
"end_time": None, |
|
|
"provider": "intrinio", |
|
|
"symbol": "AAPL", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"sort": "desc", |
|
|
"limit": "49999", |
|
|
"adjustment": "unadjusted", |
|
|
"provider": "polygon", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-01-03", |
|
|
"interval": "1m", |
|
|
"extended_hours": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"sort": "desc", |
|
|
"limit": "49999", |
|
|
"adjustment": "splits_only", |
|
|
"provider": "polygon", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
"extended_hours": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"extended_hours": False, |
|
|
"include_actions": False, |
|
|
"adjustment": "splits_and_dividends", |
|
|
"provider": "yfinance", |
|
|
"symbol": "SPY", |
|
|
"start_date": None, |
|
|
"end_date": None, |
|
|
"interval": "1h", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"extended_hours": False, |
|
|
"include_actions": True, |
|
|
"adjustment": "splits_only", |
|
|
"provider": "yfinance", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "tiingo", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1d", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "tiingo", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1M", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "tradier", |
|
|
"symbol": "SPY", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-06-06", |
|
|
"interval": "1M", |
|
|
"extended_hours": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "tradier", |
|
|
"symbol": "SPY,DJIA", |
|
|
"start_date": None, |
|
|
"end_date": None, |
|
|
"interval": "15m", |
|
|
"extended_hours": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"provider": "tmx", |
|
|
"symbol": "SPY:US", |
|
|
"start_date": "2023-01-01", |
|
|
"end_date": "2023-12-31", |
|
|
"interval": "1d", |
|
|
"adjustment": "splits_only", |
|
|
} |
|
|
), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_historical(params, obb): |
|
|
"""Test the ETF historical endpoint.""" |
|
|
result = obb.equity.price.historical(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "IOO", "provider": "fmp"}), |
|
|
({"symbol": "XIU", "provider": "tmx", "use_cache": False}), |
|
|
({"symbol": "QQQ", "provider": "yfinance"}), |
|
|
({"symbol": "IOO,QQQ", "provider": "intrinio"}), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_info(params, obb): |
|
|
"""Test the ETF info endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.info(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "IOO", "provider": "fmp"}), |
|
|
({"symbol": "XIU", "provider": "tmx", "use_cache": False}), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_sectors(params, obb): |
|
|
"""Test the ETF sectors endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.sectors(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "QQQ", "cik": None, "provider": "fmp"}), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_holdings_date(params, obb): |
|
|
"""Test the ETF holdings date endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.holdings_date(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
( |
|
|
{ |
|
|
"symbol": "IOO", |
|
|
"date": "2023-03-31", |
|
|
"cik": None, |
|
|
"provider": "fmp", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "SILJ", |
|
|
"date": "2019-12-31", |
|
|
"cik": None, |
|
|
"provider": "fmp", |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "TQQQ", |
|
|
"date": None, |
|
|
"provider": "sec", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "QQQ", |
|
|
"date": "2021-06-30", |
|
|
"provider": "sec", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "XIU", |
|
|
"provider": "tmx", |
|
|
"use_cache": False, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "DJIA", |
|
|
"provider": "intrinio", |
|
|
"date": None, |
|
|
} |
|
|
), |
|
|
( |
|
|
{ |
|
|
"symbol": "QQQ", |
|
|
"provider": "intrinio", |
|
|
"date": "2020-04-03", |
|
|
} |
|
|
), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_holdings(params, obb): |
|
|
"""Test the ETF holdings endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.holdings(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "SPY,VOO,QQQ,IWM,IWN,GOVT,JNK", "provider": "fmp"}), |
|
|
({"symbol": "SPY,VOO,QQQ,IWM,IWN,GOVT,JNK", "provider": "finviz"}), |
|
|
( |
|
|
{ |
|
|
"symbol": "SPY,VOO,QQQ,IWM,IWN,GOVT,JNK", |
|
|
"return_type": "trailing", |
|
|
"adjustment": "splits_and_dividends", |
|
|
"provider": "intrinio", |
|
|
} |
|
|
), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_price_performance(params, obb): |
|
|
"""Test the ETF price performance endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.price_performance(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "IOO", "provider": "fmp"}), |
|
|
({"symbol": "XIU", "provider": "tmx", "use_cache": False}), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_countries(params, obb): |
|
|
"""Test the ETF countries endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.countries(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[({"sort": "desc", "limit": 10})], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_discovery_gainers(params, obb): |
|
|
"""Test the ETF discovery gainers endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.discovery.gainers(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[({"sort": "desc", "limit": 10})], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_discovery_losers(params, obb): |
|
|
"""Test the ETF discovery losers endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.discovery.losers(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[({"sort": "desc", "limit": 10})], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_discovery_active(params, obb): |
|
|
"""Test the ETF discovery active endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.discovery.active(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|
|
|
|
|
|
@parametrize( |
|
|
"params", |
|
|
[ |
|
|
({"symbol": "SPY,VOO,QQQ,IWM,IWN", "provider": "fmp"}), |
|
|
], |
|
|
) |
|
|
@pytest.mark.integration |
|
|
def test_etf_equity_exposure(params, obb): |
|
|
"""Test the ETF equity exposure endpoint.""" |
|
|
params = {p: v for p, v in params.items() if v} |
|
|
|
|
|
result = obb.etf.equity_exposure(**params) |
|
|
assert result |
|
|
assert isinstance(result, OBBject) |
|
|
assert len(result.results) > 0 |
|
|
|