test_pl_transport_site_service.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # backend/tests/test_pl_transport_site_service.py
  2. from datetime import date, datetime
  3. from unittest.mock import MagicMock
  4. from app.services.pl_public_transport_helpers import (
  5. _accumulate_calendar_day_counts,
  6. _parse_calendar_month,
  7. _parse_history_date,
  8. _plan_hit_dates,
  9. )
  10. from app.services.pl_site_plan_service import (
  11. build_site_page_for_plan,
  12. plan_matches_history_day,
  13. resolve_transport_for_plan,
  14. )
  15. def test_parse_history_date_accepts_iso():
  16. assert _parse_history_date("2026-09-13") == date(2026, 9, 13)
  17. def test_parse_history_date_rejects_bad():
  18. assert _parse_history_date("13/09/2026") is None
  19. assert _parse_history_date("") is None
  20. def test_plan_day_match_helpers():
  21. day = date(2026, 9, 13)
  22. class P:
  23. def __init__(self, plan_date=None, pickup_time=None, delivery_time=None):
  24. self.plan_date = plan_date
  25. self.pickup_time = pickup_time
  26. self.delivery_time = delivery_time
  27. assert plan_matches_history_day(P(plan_date=day), day) is True
  28. assert plan_matches_history_day(
  29. P(pickup_time=datetime(2026, 9, 13, 8, 0, 0)), day
  30. ) is True
  31. assert plan_matches_history_day(
  32. P(delivery_time=datetime(2026, 9, 12, 18, 0, 0)), day
  33. ) is False
  34. def test_plan_hit_dates_site_style_includes_plan_date():
  35. class P:
  36. plan_date = date(2026, 9, 1)
  37. pickup_time = datetime(2026, 9, 10, 8, 0)
  38. delivery_time = datetime(2026, 9, 12, 18, 0)
  39. assert _plan_hit_dates(P(), include_plan_date=True) == {
  40. date(2026, 9, 1),
  41. date(2026, 9, 10),
  42. date(2026, 9, 12),
  43. }
  44. def test_accumulate_site_calendar_counts_include_plan_date():
  45. class P:
  46. def __init__(self, plan_date=None, pickup=None, delivery=None):
  47. self.plan_date = plan_date
  48. self.pickup_time = pickup
  49. self.delivery_time = delivery
  50. plans = [
  51. P(plan_date=date(2026, 9, 5), pickup=datetime(2026, 9, 10, 8, 0)),
  52. P(plan_date=date(2026, 9, 5)),
  53. ]
  54. counts = _accumulate_calendar_day_counts(
  55. plans,
  56. month_start=date(2026, 9, 1),
  57. month_end=date(2026, 9, 30),
  58. include_plan_date=True,
  59. )
  60. assert counts == {"2026-09-05": 2, "2026-09-10": 1}
  61. def test_resolve_transport_for_plan_missing_plan():
  62. db = MagicMock()
  63. db.query.return_value.filter.return_value.first.return_value = None
  64. plan, transport = resolve_transport_for_plan(
  65. db, tenant_no="t1", plan_id="missing"
  66. )
  67. assert plan is None
  68. assert transport is None
  69. def test_build_site_page_for_plan_missing_plan():
  70. db = MagicMock()
  71. db.query.return_value.filter.return_value.first.return_value = None
  72. page, err = build_site_page_for_plan(db, tenant_no="t1", plan_id="missing")
  73. assert page is None
  74. assert err == "计划不存在"