mirror of
https://github.com/ZhuLinsen/daily_stock_analysis
synced 2026-09-20 10:53:33 +08:00
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
# -*- 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()
|