From 38f8664eccd7738855918fff0537335f7238a006 Mon Sep 17 00:00:00 2001 From: Tyler Hoang Date: Mon, 18 May 2026 23:59:37 -0700 Subject: feat: add projection_years to DcfResult schema and service output Add projection_years: int = 5 field to the DcfResult Pydantic schema and emit it from the data_service.get_valuation() function across all three dcf_out cases (unavailable, error, and successful). This enables frontend DCF sliders to know the default projection horizon. Co-Authored-By: Claude Sonnet 4.6 --- backend/tests/test_api.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'backend/tests/test_api.py') diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py index 345c0a3..230182e 100644 --- a/backend/tests/test_api.py +++ b/backend/tests/test_api.py @@ -633,6 +633,36 @@ def test_valuation_schema_structure() -> None: assert resp.ev_revenue.available is False +def test_dcf_result_projection_years_default() -> None: + from app.schemas import DcfResult + dcf = DcfResult(available=False) + assert dcf.projection_years == 5 + + +def test_get_valuation_includes_projection_years(monkeypatch) -> None: + import pandas as pd + clear_service_caches() + monkeypatch.setattr( + data_service, "get_company_info", + lambda symbol: { + "currentPrice": 150.0, + "sharesOutstanding": 1_000_000_000.0, + "totalDebt": 0.0, + "totalCash": 0.0, + }, + ) + monkeypatch.setattr(data_service, "get_shares_outstanding", lambda symbol: 1_000_000_000.0) + cf = annual_frame({ + "Operating Cash Flow": [80.0, 90.0, 100.0, 110.0], + "Capital Expenditure": [-10.0, -10.0, -10.0, -10.0], + }) + monkeypatch.setattr(data_service, "get_cash_flow", lambda symbol, quarterly=False: cf if not quarterly else pd.DataFrame()) + monkeypatch.setattr(data_service, "get_income_statement", lambda symbol, quarterly=False: pd.DataFrame()) + monkeypatch.setattr(data_service, "get_balance_sheet", lambda symbol, quarterly=False: pd.DataFrame()) + result = data_service.get_valuation("AAPL") + assert result["dcf"]["projection_years"] == 5 + + def test_build_fcf_series_happy_path() -> None: cf = annual_frame({ "Operating Cash Flow": [100.0, 90.0, 80.0, 70.0], -- cgit v1.3-2-g0d8e