test_festival_fixed_dates.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """确定性节日日期兜底测试。"""
  2. from __future__ import annotations
  3. import unittest
  4. from datetime import date
  5. from app.festival_demand.fixed_dates import (
  6. detect_deterministic_active_festivals,
  7. is_deterministic_event,
  8. resolve_event_date,
  9. solar_term_date,
  10. )
  11. from app.festival_demand.calendar import DEFAULT_FESTIVAL_EVENTS
  12. class FestivalFixedDatesTest(unittest.TestCase):
  13. def test_solar_term_liqiu_2026(self) -> None:
  14. self.assertEqual(solar_term_date(2026, "立秋"), date(2026, 8, 7))
  15. def test_fixed_month_day(self) -> None:
  16. self.assertEqual(resolve_event_date(2026, "建党节"), date(2026, 7, 1))
  17. self.assertEqual(resolve_event_date(2026, "918纪念日"), date(2026, 9, 18))
  18. def test_liqiu_prewarm_detected_on_2026_08_03(self) -> None:
  19. allowed_kinds = {event.name: event.kind for event in DEFAULT_FESTIVAL_EVENTS}
  20. prewarm_by_name = {event.name: event.prewarm_days for event in DEFAULT_FESTIVAL_EVENTS}
  21. event_type_by_name = {event.name: event.event_type for event in DEFAULT_FESTIVAL_EVENTS}
  22. festivals = detect_deterministic_active_festivals(
  23. date(2026, 8, 3),
  24. allowed_kinds=allowed_kinds,
  25. prewarm_by_name=prewarm_by_name,
  26. event_type_by_name=event_type_by_name,
  27. )
  28. names = {item["name"] for item in festivals}
  29. self.assertIn("立秋", names)
  30. liqiu = next(item for item in festivals if item["name"] == "立秋")
  31. self.assertEqual(liqiu["phase"], "prewarm")
  32. self.assertEqual(liqiu["days_to_festival"], 4)
  33. def test_lunar_festival_not_deterministic(self) -> None:
  34. self.assertFalse(is_deterministic_event("春节"))
  35. self.assertTrue(is_deterministic_event("立秋"))
  36. if __name__ == "__main__":
  37. unittest.main()