"""验证 financial._recent_quarters 的季度滚动逻辑""" from datetime import datetime from unittest.mock import patch from src.fetchers import financial def _fake_now(year: int, month: int, day: int = 15): """生成一个固定时间,用于 patch datetime.now()""" fixed = datetime(year, month, day) class FakeDatetime(datetime): @classmethod def now(cls, tz=None): # noqa: ARG003 return fixed return FakeDatetime def test_count_matches(): with patch.object(financial, "datetime", _fake_now(2026, 5, 15)): out = financial._recent_quarters(8) assert len(out) == 8 def test_first_is_current_quarter(): # 2026-05-15 属于 Q2 with patch.object(financial, "datetime", _fake_now(2026, 5, 15)): out = financial._recent_quarters(4) assert out[0] == (2026, 2) def test_crosses_year_boundary(): # 2026 Q1 → 2025 Q4 → 2025 Q3 → 2025 Q2 with patch.object(financial, "datetime", _fake_now(2026, 2, 10)): out = financial._recent_quarters(4) assert out == [(2026, 1), (2025, 4), (2025, 3), (2025, 2)] def test_q1_january(): with patch.object(financial, "datetime", _fake_now(2026, 1, 1)): out = financial._recent_quarters(2) assert out == [(2026, 1), (2025, 4)] def test_q4_december(): with patch.object(financial, "datetime", _fake_now(2025, 12, 31)): out = financial._recent_quarters(2) assert out == [(2025, 4), (2025, 3)]