test_pl_driver_plan_service.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # backend/tests/test_pl_driver_plan_service.py
  2. from datetime import date, datetime
  3. from app.api.pl.public_transport import _history_matches_date
  4. from app.services.pl_driver_plan_service import transport_visible_to_personnel
  5. from app.services.pl_public_transport_helpers import (
  6. _accumulate_calendar_day_counts,
  7. _parse_calendar_month,
  8. _plan_hit_dates,
  9. )
  10. def test_history_date_or_logic():
  11. day = date(2026, 9, 13)
  12. assert _history_matches_date(datetime(2026, 9, 13, 9, 0), None, day) is True
  13. assert _history_matches_date(None, datetime(2026, 9, 13, 18, 0), day) is True
  14. assert (
  15. _history_matches_date(
  16. datetime(2026, 9, 12, 9, 0), datetime(2026, 9, 14, 18, 0), day
  17. )
  18. is False
  19. )
  20. def test_visible_as_driver_or_escort():
  21. class T:
  22. def __init__(self, driver_id=None, escort_id=None):
  23. self.driver_id = driver_id
  24. self.escort_id = escort_id
  25. assert transport_visible_to_personnel(T(driver_id="p1"), "p1") is True
  26. assert transport_visible_to_personnel(T(escort_id="p1"), "p1") is True
  27. assert transport_visible_to_personnel(T(driver_id="p2", escort_id="p3"), "p1") is False
  28. assert transport_visible_to_personnel(T(), "p1") is False
  29. assert transport_visible_to_personnel(T(driver_id="p1"), "") is False
  30. def test_parse_calendar_month_ok():
  31. start, end = _parse_calendar_month("2026-09")
  32. assert start == date(2026, 9, 1)
  33. assert end == date(2026, 9, 30)
  34. def test_parse_calendar_month_rejects_bad():
  35. assert _parse_calendar_month("") is None
  36. assert _parse_calendar_month("2026-9") is None
  37. assert _parse_calendar_month("2026-13") is None
  38. def test_plan_hit_dates_driver_style_excludes_plan_date():
  39. class P:
  40. plan_date = date(2026, 9, 1)
  41. pickup_time = datetime(2026, 9, 10, 8, 0)
  42. delivery_time = datetime(2026, 9, 12, 18, 0)
  43. assert _plan_hit_dates(P(), include_plan_date=False) == {
  44. date(2026, 9, 10),
  45. date(2026, 9, 12),
  46. }
  47. def test_accumulate_calendar_day_counts_within_month():
  48. class P:
  49. def __init__(self, pickup, delivery, plan_date=None):
  50. self.plan_date = plan_date
  51. self.pickup_time = pickup
  52. self.delivery_time = delivery
  53. plans = [
  54. P(datetime(2026, 9, 10, 8, 0), datetime(2026, 9, 12, 18, 0)),
  55. P(datetime(2026, 9, 10, 9, 0), None),
  56. P(datetime(2026, 8, 31, 8, 0), datetime(2026, 9, 1, 18, 0)),
  57. ]
  58. counts = _accumulate_calendar_day_counts(
  59. plans,
  60. month_start=date(2026, 9, 1),
  61. month_end=date(2026, 9, 30),
  62. include_plan_date=False,
  63. )
  64. assert counts == {"2026-09-01": 1, "2026-09-10": 2, "2026-09-12": 1}