Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions tests/test_alpha_vantage_hardening.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import tradingagents.dataflows.alpha_vantage_common as av
import tradingagents.dataflows.alpha_vantage_fundamentals as avf
import tradingagents.dataflows.alpha_vantage_news as avn
import tradingagents.dataflows.alpha_vantage_stock as avs


Expand Down Expand Up @@ -133,3 +134,33 @@ def test_unparseable_body_is_never_served_untrimmed(monkeypatch):
def test_empty_body_still_passes_through(monkeypatch):
monkeypatch.setattr(avs, "_make_api_request", lambda *a, **k: "")
assert avs.get_stock("IBM", "2024-05-09", "2024-05-10") == ""


def _capture_global_news_params(monkeypatch, config):
captured = {}
monkeypatch.setattr(avn, "_make_api_request", lambda fn, params: captured.update(params) or "{}")
monkeypatch.setattr(avn, "get_config", lambda: config)
return captured


@pytest.mark.unit
def test_global_news_omitted_optionals_resolve_from_config(monkeypatch):
# The get_global_news tool marks look_back_days/limit optional and forwards
# None; Alpha Vantage must resolve them from config like the yfinance path
# does, instead of crashing on timedelta(days=None).
captured = _capture_global_news_params(
monkeypatch, {"global_news_lookback_days": 7, "global_news_article_limit": 10}
)
avn.get_global_news("2026-01-10", None, None)
assert captured["limit"] == "10"
assert captured["time_from"] == "20260103T0000" # 2026-01-10 minus 7 days


@pytest.mark.unit
def test_global_news_explicit_optionals_win_over_config(monkeypatch):
captured = _capture_global_news_params(
monkeypatch, {"global_news_lookback_days": 7, "global_news_article_limit": 10}
)
avn.get_global_news("2026-01-10", 3, 5)
assert captured["limit"] == "5"
assert captured["time_from"] == "20260107T0000" # 2026-01-10 minus 3 days
17 changes: 14 additions & 3 deletions tradingagents/dataflows/alpha_vantage_news.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .alpha_vantage_common import _make_api_request, format_datetime_for_api
from .config import get_config


def get_news(ticker, start_date, end_date) -> dict[str, str] | str:
Expand All @@ -23,21 +24,31 @@ def get_news(ticker, start_date, end_date) -> dict[str, str] | str:

return _make_api_request("NEWS_SENTIMENT", params)

def get_global_news(curr_date, look_back_days: int = 7, limit: int = 50) -> dict[str, str] | str:
def get_global_news(
curr_date, look_back_days: int | None = None, limit: int | None = None
) -> dict[str, str] | str:
"""Returns global market news & sentiment data without ticker-specific filtering.

Covers broad market topics like financial markets, economy, and more.

Args:
curr_date: Current date in yyyy-mm-dd format.
look_back_days: Number of days to look back (default 7).
limit: Maximum number of articles (default 50).
look_back_days: Number of days to look back. ``None`` falls back to
``global_news_lookback_days`` from the active config.
limit: Maximum number of articles. ``None`` falls back to
``global_news_article_limit`` from the active config.

Returns:
Dictionary containing global news sentiment data or JSON string.
"""
from datetime import datetime, timedelta

config = get_config()
if look_back_days is None:
look_back_days = config["global_news_lookback_days"]
if limit is None:
limit = config["global_news_article_limit"]

# Calculate start date
curr_dt = datetime.strptime(curr_date, "%Y-%m-%d")
start_dt = curr_dt - timedelta(days=look_back_days)
Expand Down