diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-02-02 03:45:09 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-02 11:45:09 +0000 |
commit | c9f1aec2b3fdc683d7e373029d5172017abc582c (patch) | |
tree | 2516e562207b8bbfb433eecc8124ede1a9c9a98f | |
parent | 9ddbf34456b748fd38aa7e1bd4e95618dc253f94 (diff) |
[feature]: feature/overview-to-profile: Deprecate `equity.fundamental.overview()` and move to `equity.profile()` (#6011)
* fmp overview to equity profile
* deprecation warning
* urls
* wrangle fields
* black
* pylint unused argument
* insert additional securityID fields to standard model
* custom deprecation using OpenBBDeprecationWarning
* typo - need to have the deprecated=True flag
* static assets
* fix non related test
* minor adjustment - removing the need for the try/except block - using the get and pop removes the need for key existance checking. cc @deeleeramone
---------
Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
Co-authored-by: Henrique Joaquim <h.joaquim@campus.fct.unl.pt>
11 files changed, 312 insertions, 17 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/equity_info.py b/openbb_platform/core/openbb_core/provider/standard_models/equity_info.py index b23c82bda9f..bc62fc538e8 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/equity_info.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/equity_info.py @@ -36,6 +36,12 @@ class EquityInfoData(Data): default=None, description=DATA_DESCRIPTIONS.get("cik", ""), ) + cusip: Optional[str] = Field( + default=None, description="CUSIP identifier for the company." + ) + isin: Optional[str] = Field( + default=None, description="International Securities Identification Number." + ) lei: Optional[str] = Field( default=None, description="Legal Entity Identifier assigned to the company." ) diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index 6cd0709dcb1..d09fca2fef3 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -1271,6 +1271,7 @@ def test_equity_price_quote(params, headers): ({"symbol": "AAPL,MSFT", "provider": "intrinio"}), ({"symbol": "AAPL,MSFT", "provider": "finviz"}), ({"symbol": "AAPL,MSFT", "provider": "yfinance"}), + ({"symbol": "AAPL,MSFT", "provider": "fmp"}), ], ) @pytest.mark.integration diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index 09adb9bb956..0fd11eac27c 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -1204,6 +1204,7 @@ def test_equity_price_quote(params, obb): ({"symbol": "AAPL,MSFT", "provider": "intrinio"}), ({"symbol": "AAPL,MSFT", "provider": "finviz"}), ({"symbol": "AAPL,MSFT", "provider": "yfinance"}), + ({"symbol": "AAPL,MSFT", "provider": "fmp"}), ], ) @pytest.mark.integration @@ -1368,7 +1369,7 @@ def test_equity_discovery_upcoming_release_days(params, obb): "start_date": None, "end_date": None, "limit": 10, - "form_type": None, + "form_type": "1-A", "is_done": None, "provider": "fmp", } diff --git a/openbb_platform/extensions/equity/openbb_equity/fundamental/fundamental_router.py b/openbb_platform/extensions/equity/openbb_equity/fundamental/fundamental_router.py index dbaddcb70ba..b4525ec4e35 100644 --- a/openbb_platform/extensions/equity/openbb_equity/fundamental/fundamental_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/fundamental/fundamental_router.py @@ -1,6 +1,7 @@ # pylint: disable=W0613:unused-argument """Fundamental Analysis Router.""" +from openbb_core.app.deprecation import OpenBBDeprecationWarning from openbb_core.app.model.command_context import CommandContext from openbb_core.app.model.obbject import OBBject from openbb_core.app.provider_interface import ( @@ -202,7 +203,15 @@ async def management_compensation( return await OBBject.from_query(Query(**locals())) -@router.command(model="CompanyOverview") +@router.command( + model="CompanyOverview", + deprecated=True, + deprecation=OpenBBDeprecationWarning( + message="This endpoint is deprecated; use `/equity/profile` instead.", + since=(4, 1), + expected_removal=(4, 3), + ), +) async def overview( cc: CommandContext, provider_choices: ProviderChoices, diff --git a/openbb_platform/openbb/package/equity.py b/openbb_platform/openbb/package/equity.py index 105c6423e47..8a4feb09b85 100644 --- a/openbb_platform/openbb/package/equity.py +++ b/openbb_platform/openbb/package/equity.py @@ -224,7 +224,7 @@ class ROUTER_equity(Container): Union[str, List[str]], OpenBBCustomParameter(description="Symbol to get data for."), ], - provider: Optional[Literal["intrinio", "yfinance"]] = None, + provider: Optional[Literal["fmp", "intrinio", "yfinance"]] = None, **kwargs ) -> OBBject: """Equity Info. Get general price and performance metrics of a stock. @@ -233,9 +233,9 @@ class ROUTER_equity(Container): ---------- symbol : str Symbol to get data for. - provider : Optional[Literal['intrinio', 'yfinance']] + provider : Optional[Literal['fmp', 'intrinio', 'yfinance']] The provider to use for the query, by default None. - If None, the provider specified in defaults is selected or 'intrinio' if there is + If None, the provider specified in defaults is selected or 'fmp' if there is no default. Returns @@ -243,7 +243,7 @@ class ROUTER_equity(Container): OBBject results : List[EquityInfo] Serializable results. - provider : Optional[Literal['intrinio', 'yfinance']] + provider : Optional[Literal['fmp', 'intrinio', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -260,6 +260,10 @@ class ROUTER_equity(Container): Common name of the company. cik : Optional[str] Central Index Key (CIK) for the requested entity. + cusip : Optional[str] + CUSIP identifier for the company. + isin : Optional[str] + International Securities Identification Number. lei : Optional[str] Legal Entity Identifier assigned to the company. legal_name : Optional[str] @@ -326,6 +330,33 @@ class ROUTER_equity(Container): Date of the company's first stock price. last_stock_price_date : Optional[date] Date of the company's last stock price. + is_etf : Optional[bool] + If the symbol is an ETF. (provider: fmp) + is_actively_trading : Optional[bool] + If the company is actively trading. (provider: fmp) + is_adr : Optional[bool] + If the stock is an ADR. (provider: fmp) + is_fund : Optional[bool] + If the company is a fund. (provider: fmp) + image : Optional[str] + Image of the company. (provider: fmp) + currency : Optional[str] + Currency in which the stock is traded. (provider: fmp, yfinance) + market_cap : Optional[int] + Market capitalization of the company. (provider: fmp); + The market capitalization of the asset. (provider: yfinance) + last_price : Optional[float] + The last traded price. (provider: fmp) + year_high : Optional[float] + The one-year high of the price. (provider: fmp) + year_low : Optional[float] + The one-year low of the price. (provider: fmp) + volume_avg : Optional[int] + Average daily trading volume. (provider: fmp) + annualized_dividend_amount : Optional[float] + The annualized dividend payment based on the most recent regular dividend payment. (provider: fmp) + beta : Optional[float] + Beta of the stock relative to the market. (provider: fmp, yfinance) id : Optional[str] Intrinio ID for the company. (provider: intrinio) thea_enabled : Optional[bool] @@ -334,10 +365,6 @@ class ROUTER_equity(Container): The timezone of the exchange. (provider: yfinance) issue_type : Optional[str] The issuance type of the asset. (provider: yfinance) - currency : Optional[str] - The currency in which the asset is traded. (provider: yfinance) - market_cap : Optional[int] - The market capitalization of the asset. (provider: yfinance) shares_outstanding : Optional[int] The number of listed shares outstanding. (provider: yfinance) shares_float : Optional[int] @@ -348,8 +375,6 @@ class ROUTER_equity(Container): The reported number of shares short. (provider: yfinance) dividend_yield : Optional[float] The dividend yield of the asset, as a normalized percent. (provider: yfinance) - beta : Optional[float] - The beta of the asset relative to the broad market. (provider: yfinance) Example ------- diff --git a/openbb_platform/openbb/package/equity_fundamental.py b/openbb_platform/openbb/package/equity_fundamental.py index c7447aae0bf..ced8bb656d4 100644 --- a/openbb_platform/openbb/package/equity_fundamental.py +++ b/openbb_platform/openbb/package/equity_fundamental.py @@ -2,14 +2,16 @@ import datetime from typing import List, Literal, Optional, Union +from warnings import simplefilter, warn from annotated_types import Ge +from openbb_core.app.deprecation import OpenBBDeprecationWarning from openbb_core.app.model.custom_parameter import OpenBBCustomParameter from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import validate from openbb_core.app.static.utils.filters import filter_inputs -from typing_extensions import Annotated +from typing_extensions import Annotated, deprecated class ROUTER_equity_fundamental(Container): @@ -2611,6 +2613,10 @@ class ROUTER_equity_fundamental(Container): ) @validate + @deprecated( + "This endpoint is deprecated; use `/equity/profile` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3.", + category=OpenBBDeprecationWarning, + ) def overview( self, symbol: Annotated[ @@ -2726,6 +2732,13 @@ class ROUTER_equity_fundamental(Container): >>> obb.equity.fundamental.overview(symbol="AAPL") """ # noqa: E501 + simplefilter("always", DeprecationWarning) + warn( + "This endpoint is deprecated; use `/equity/profile` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3.", + category=DeprecationWarning, + stacklevel=2, + ) + return self._run( "/equity/fundamental/overview", **filter_inputs( diff --git a/openbb_platform/providers/finviz/openbb_finviz/models/equity_profile.py b/openbb_platform/providers/finviz/openbb_finviz/models/equity_profile.py index eba392f56a8..c8fd5eff7d4 100644 --- a/openbb_platform/providers/finviz/openbb_finviz/models/equity_profile.py +++ b/openbb_platform/providers/finviz/openbb_finviz/models/equity_profile.py @@ -26,14 +26,14 @@ class FinvizEquityProfileQueryParams(EquityInfoQueryParams): class FinvizEquityProfileData(EquityInfoData): """Finviz Equity Profile Data.""" + __alias_dict__ = { + "stock_exchange": "exchange", + } + index: Optional[str] = Field( default=None, description="Included in indices - i.e., Dow, Nasdaq, or S&P.", ) - beta: Optional[float] = Field( - default=None, - description="The beta of the stock relative to the broad market.", - ) optionable: Optional[str] = Field( default=None, description="Whether options trade against the ticker.", @@ -73,6 +73,10 @@ class FinvizEquityProfileData(EquityInfoData): description="The last, or next confirmed, earnings date and announcement time, as a string." + " The format is Nov 02 AMC - for after market close.", ) + beta: Optional[float] = Field( + default=None, + description="The beta of the stock relative to the broad market.", + ) class FinvizEquityProfileFetcher( diff --git a/openbb_platform/providers/fmp/openbb_fmp/__init__.py b/openbb_platform/providers/fmp/openbb_fmp/__init__.py index f4ce652e86d..1af89b46c0a 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/__init__.py +++ b/openbb_platform/providers/fmp/openbb_fmp/__init__.py @@ -23,6 +23,7 @@ from openbb_fmp.models.economic_calendar import FMPEconomicCalendarFetcher from openbb_fmp.models.equity_historical import FMPEquityHistoricalFetcher from openbb_fmp.models.equity_ownership import FMPEquityOwnershipFetcher from openbb_fmp.models.equity_peers import FMPEquityPeersFetcher +from openbb_fmp.models.equity_profile import FMPEquityProfileFetcher from openbb_fmp.models.equity_quote import FMPEquityQuoteFetcher from openbb_fmp.models.equity_screener import FMPEquityScreenerFetcher from openbb_fmp.models.equity_valuation_multiples import ( @@ -90,6 +91,7 @@ fmp_provider = Provider( "EquityHistorical": FMPEquityHistoricalFetcher, "EquityOwnership": FMPEquityOwnershipFetcher, "EquityPeers": FMPEquityPeersFetcher, + "EquityInfo": FMPEquityProfileFetcher, "EquityQuote": FMPEquityQuoteFetcher, "EquityScreener": FMPEquityScreenerFetcher, "EquityValuationMultiples": FMPEquityValuationMultiplesFetcher, diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/equity_profile.py b/openbb_platform/providers/fmp/openbb_fmp/models/equity_profile.py new file mode 100644 index 00000000000..22cbce22f29 --- /dev/null +++ b/openbb_platform/providers/fmp/openbb_fmp/models/equity_profile.py @@ -0,0 +1,150 @@ +"""FMP Equity Profile Model.""" + +# pylint: disable=unused-argument + +from datetime import ( + date as dateType, +) +from typing import Any, Dict, List, Optional + +from openbb_core.provider.abstract.data import ForceInt +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.equity_info import ( + EquityInfoData, + EquityInfoQueryParams, +) +from openbb_core.provider.utils.helpers import amake_requests +from pydantic import Field, field_validator, model_validator + + +class FMPEquityProfileQueryParams(EquityInfoQueryParams): + """FMP Equity Profile Query. + + Source: https://site.financialmodelingprep.com/developer/docs/companies-key-stats-free-api/ + """ + + +class FMPEquityProfileData(EquityInfoData): + """FMP Equity Profile Data.""" + + __alias_dict__ = { + "name": "companyName", + "stock_exchange": "exchange", + "company_url": "website", + "hq_address1": "address", + "hq_address_city": "city", + "hq_address_postal_code": "zip", + "hq_state": "state", + "hq_country": "country", + "business_phone_no": "phone", + "industry_category": "industry", + "employees": "fullTimeEmployees", + "long_description": "description", + "first_stock_price_date": "ipoDate", + } + + is_etf: bool = Field(description="If the symbol is an ETF.") + is_actively_trading: bool = Field(description="If the company is actively trading.") + is_adr: bool = Field(description="If the stock is an ADR.") + is_fund: bool = Field(description="If the company is a fund.") + image: Optional[str] = Field(default=None, description="Image of the company.") + currency: Optional[str] = Field( + default=None, description="Currency in which the stock is traded." + ) + market_cap: Optional[ForceInt] = Field( + default=None, + description="Market capitalization of the company.", + alias="mktCap", + ) + last_price: Optional[float] = Field( + default=None, + description="The last traded price.", + alias="price", + ) + year_high: Optional[float] = Field( + default=None, description="The one-year high of the price." + ) + year_low: Optional[float] = Field( + default=None, description="The one-year low of the price." + ) + volume_avg: Optional[ForceInt] = Field( + default=None, + description="Average daily trading volume.", + alias="volAvg", + ) + annualized_dividend_amount: Optional[float] = Field( + default=None, + description="The annualized dividend payment based on the most recent regular dividend payment.", + alias="lastDiv", + ) + beta: Optional[float] = Field( + default=None, description="Beta of the stock relative to the market." + ) + + @field_validator("first_stock_price_date", mode="before", check_fields=False) + @classmethod + def validate_date(cls, v): # pylint: disable=E0213 + """Return the date as a datetime object.""" + if isinstance(v, dateType) or v is None: + return v + return dateType.fromisoformat(v) if v else None + + @model_validator(mode="before") + @classmethod + def replace_empty_strings(cls, values): + """Check for empty strings and replace with None.""" + return {k: None if v in ("", "NA") else v for k, v in values.items()} + + +class FMPEquityProfileFetcher( + Fetcher[ + FMPEquityProfileQueryParams, + List[FMPEquityProfileData], + ] +): + """FMP Equity Profile Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> FMPEquityProfileQueryParams: + """Transform the query params.""" + return FMPEquityProfileQueryParams(**params) + + @staticmethod + async def aextract_data( + query: FMPEquityProfileQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the FMP endpoint.""" + api_key = credentials.get("fmp_api_key") if credentials else "" + symbols = query.symbol.split(",") + base_url = "https://financialmodelingprep.com/api/v3" + urls = [f"{base_url}/profile/{symbol}?apikey={api_key}" for symbol in symbols] + + return await amake_requests(urls, **kwargs) + + @staticmethod + def transform_data( + query: FMPEquityProfileQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[FMPEquityProfileData]: + """Return the transformed data.""" + results: List[FMPEquityProfileData] = [] + for d in data: + d["year_low"], d["year_high"] = d.get("range", "-").split("-") + + # Clear out fields that don't belong and can be had elsewhere. + entries_to_remove = ( + "exchangeShortName", + "defaultImage", + "dcf", + "dcfDiff", + "changes", + "range", + ) + for key in entries_to_remove: + d.pop(key, None) + + results.append(FMPEquityProfileData.model_validate(d)) + return results diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_profile_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_profile_fetcher.yaml new file mode 100644 index 00000000000..cbae54bd4aa --- /dev/null +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_profile_fetcher.yaml @@ -0,0 +1,74 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/profile/AAPL?apikey=MOCK_API_KEY + response: + body: + string: !!binary | + H4sIAAAAAAAAA21WTXPbNhC951dgfI1Ek5IsS/FJlZ3WM03ijp3k0OkBAkARYxBgAVCM0ul/71t+ + ybJ7sCzt59vFWyz+fMfYP/hj7CIcy50zFx/YxWbz8PvFpJNWXgsFYbbOkut5L9ypyEmWzNa95ODM + 5rCH7Gq+Wl2tl4Nl+Ry3vIJ8tl4urrI0XV2nadorDQ/xVh+gTZP1shd6bveU8CJbZMl8Ns3W62Q5 + G+CIgtQB+mmaLIfswpUVt8fPvGw9N1VlFLu3Ihndau+VFUfSfn28HcX6mSRAlM5nabaeDwodtO1s + 0/n1aj4H8KtTrKCr1m1QDRr1o4NHys+bx9vNH+xX43bcsEdllIiv7R4L5+MAunMYAVhZh+hbwFtn + Q10qz+4oiHdWizDYNWoXdGwDFDFW4cPlZdM0CacOJGjLYCdVEF5XUTt73iEGjd7bMGElt3XORay9 + wi9uJST+WcXAAr7EqnCWFJXywVnURE2vI35NWOQ7A8MJaxT39L0PwIVQITivVWCN80Y2WqqEPRWK + 9UfGXJ4jBNMPFB5ezGirIH2Z9IZ94uKl7i2GG0Tg8qVNWZuop1XtKxfUgPCmhfUCZeFK9RYrhfXE + gT3baP/gJCy7lj19G75951EUE/aL4uhQ5Z2sRezL/g1B4ZSw+8i4CY7UB1QeOtct94qFuqpw+q29 + MK6WLCh/wKz1GB1q5BEuB+61q5HC8Jg7XyKHtsLUktBFdBIx2WN0iBkLTgmNaxhIGoECnY2OSR2E + O4BAFFi6xhrHUTCwaMGJEqHT6L2ObVNtVDZOgFEUjAe2c+6ZCALi4xioEjdhe/C2r7dyUmCUAwq2 + jEupKeakBffqmIdihlpPObqmbrzgsqUBhYdyN9J28LnpTT/qCGqE92Q88EH/VJLlneK1/acOfVNo + JOzh1IE+ObpFvZbgTkDl1Fj1AzE1rgzFGh3hYKdSlVSs51I7FmLXuCH6Z9V0UM4gW0j7Sdrzn0TM + V6Cevr1/BQl3gwHSAzjscR72dB6DD+jTEl246Q6XpQRu4RWazgQ0HXs6ywd+bA15KAx1pOLHEoEG + EBPqe6OMof+ggrIBfNOgs0ZCQ5dNjfQgL3oRj+dzSzHaSenupp4JGFoKRxVrOQ3teexQDh3IwGyi + hcK08I4lAKQ8TVs/h3tiqm1x9vdPO0fgcPR6V9NIxEJ7Oa1wPxzPWYz5aPEP4whL7+p9cT4n54W0 + AxpQbvh/VxJ67Dvd1eVse8EECtQXLbVHq1jgaDJBoOPtCj3BFEhQG+5BiYib8JnOCvyivjWFgyOc + 6UeXaewnctBBePTgxZXdcDoi4XC1dbzVFvv5+rp10YEVisu/a+RVvlNuazpBbTG2W0wJMFrNT8tR + OdoJnzwao0sXiyO7TdgWQz9YBNTnPBk9KVFYZ9z+OHq72vaL6uvjIMxrYxBL3ZWVcUfVLuyLbIld + OS7L9mon8SJdsfV6ybI0G5W4RFB66/XFqpHO6Nt3fsqsY7cfh+pGuBjONvR2M4h+dit7fZVmi3En + ivxW5znki1WyyNLZ6qSg181ilqxm1/PZPMWDZpkuF8NuxjSfbdwcY2qF5qZ0UoEe+8qrirbvZWs6 + BVnE8yW9qpLK7scVX7nbHme2XqXTDG+d8Z0jVc6xwO77VDlYqsa3yV3M38g2IuLSMMcnup8svcSi + r1+opX/j8rG2chBC9u+7v/4DmxrpEg4KAAA= + headers: + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Headers: + - X-Requested-With, content-type, auth-token, Authorization, stripe-signature, + APPS + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Max-Age: + - '3600' + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 30 Jan 2024 03:22:46 GMT + Etag: + - W/"a0e-8FPveCU8Qcu3WMIc1cX4pwjsvrQ" + Server: + - nginx/1.18.0 (Ubuntu) + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + X-Frame-Options: + - SAMEORIGIN + X-Powered-By: + - Express + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py index 407c2b5d1dc..e64f2f7c92c 100644 --- a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py +++ b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py @@ -27,6 +27,7 @@ from openbb_fmp.models.economic_calendar import FMPEconomicCalendarFetcher from openbb_fmp.models.equity_historical import FMPEquityHistoricalFetcher from openbb_fmp.models.equity_ownership import FMPEquityOwnershipFetcher from openbb_fmp.models.equity_peers import FMPEquityPeersFetcher +from openbb_fmp.models.equity_profile import FMPEquityProfileFetcher from openbb_fmp.models.equity_quote import FMPEquityQuoteFetcher from openbb_fmp.models.equity_screener import FMPEquityScreenerFetcher from openbb_fmp.models.equity_valuation_multiples import ( @@ -634,3 +635,12 @@ def test_fmp_calendar_earnings_fetcher(credentials=test_credentials): fetcher = FMPCalendarEarningsFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_fmp_equity_profile_fetcher(credentials=test_credentials): + params = {"symbol": "AAPL"} + + fetcher = FMPEquityProfileFetcher() + result = fetcher.test(params, credentials) + assert result is None |