Files
daily_stock_analysis/tests/test_analyzer_news_prompt.py

74 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""Tests for analyzer news prompt hard constraints (Issue #697)."""
import sys
import unittest
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
try:
import litellm # noqa: F401
except ModuleNotFoundError:
sys.modules["litellm"] = MagicMock()
from src.analyzer import GeminiAnalyzer
class AnalyzerNewsPromptTestCase(unittest.TestCase):
def test_prompt_contains_time_constraints(self) -> None:
with patch.object(GeminiAnalyzer, "_init_litellm", return_value=None):
analyzer = GeminiAnalyzer()
context = {
"code": "600519",
"stock_name": "贵州茅台",
"date": "2026-03-16",
"today": {},
"fundamental_context": {
"earnings": {
"data": {
"financial_report": {"report_date": "2025-12-31", "revenue": 1000},
"dividend": {"ttm_cash_dividend_per_share": 1.2, "ttm_dividend_yield_pct": 2.4},
}
}
},
}
fake_cfg = SimpleNamespace(
news_max_age_days=30,
news_strategy_profile="medium", # 7 days
)
with patch("src.analyzer.get_config", return_value=fake_cfg):
prompt = analyzer._format_prompt(context, "贵州茅台", news_context="news")
self.assertIn("近7日的新闻搜索结果", prompt)
self.assertIn("每一条都必须带具体日期YYYY-MM-DD", prompt)
self.assertIn("超出近7日窗口的新闻一律忽略", prompt)
self.assertIn("时间未知、无法确定发布日期的新闻一律忽略", prompt)
self.assertIn("财报与分红(价值投资口径)", prompt)
self.assertIn("禁止编造", prompt)
def test_prompt_prefers_context_news_window_days(self) -> None:
with patch.object(GeminiAnalyzer, "_init_litellm", return_value=None):
analyzer = GeminiAnalyzer()
context = {
"code": "600519",
"stock_name": "贵州茅台",
"date": "2026-03-16",
"today": {},
"news_window_days": 1,
}
fake_cfg = SimpleNamespace(
news_max_age_days=30,
news_strategy_profile="long", # 30 days if fallback is used
)
with patch("src.analyzer.get_config", return_value=fake_cfg):
prompt = analyzer._format_prompt(context, "贵州茅台", news_context="news")
self.assertIn("近1日的新闻搜索结果", prompt)
self.assertIn("超出近1日窗口的新闻一律忽略", prompt)
if __name__ == "__main__":
unittest.main()