# backend/tests/test_pl_driver_plan_service.py from datetime import date, datetime from app.api.pl.public_transport import _history_matches_date from app.services.pl_driver_plan_service import transport_visible_to_personnel from app.services.pl_public_transport_helpers import ( _accumulate_calendar_day_counts, _parse_calendar_month, _plan_hit_dates, ) def test_history_date_or_logic(): day = date(2026, 9, 13) assert _history_matches_date(datetime(2026, 9, 13, 9, 0), None, day) is True assert _history_matches_date(None, datetime(2026, 9, 13, 18, 0), day) is True assert ( _history_matches_date( datetime(2026, 9, 12, 9, 0), datetime(2026, 9, 14, 18, 0), day ) is False ) def test_visible_as_driver_or_escort(): class T: def __init__(self, driver_id=None, escort_id=None): self.driver_id = driver_id self.escort_id = escort_id assert transport_visible_to_personnel(T(driver_id="p1"), "p1") is True assert transport_visible_to_personnel(T(escort_id="p1"), "p1") is True assert transport_visible_to_personnel(T(driver_id="p2", escort_id="p3"), "p1") is False assert transport_visible_to_personnel(T(), "p1") is False assert transport_visible_to_personnel(T(driver_id="p1"), "") is False def test_parse_calendar_month_ok(): start, end = _parse_calendar_month("2026-09") assert start == date(2026, 9, 1) assert end == date(2026, 9, 30) def test_parse_calendar_month_rejects_bad(): assert _parse_calendar_month("") is None assert _parse_calendar_month("2026-9") is None assert _parse_calendar_month("2026-13") is None def test_plan_hit_dates_driver_style_excludes_plan_date(): class P: plan_date = date(2026, 9, 1) pickup_time = datetime(2026, 9, 10, 8, 0) delivery_time = datetime(2026, 9, 12, 18, 0) assert _plan_hit_dates(P(), include_plan_date=False) == { date(2026, 9, 10), date(2026, 9, 12), } def test_accumulate_calendar_day_counts_within_month(): class P: def __init__(self, pickup, delivery, plan_date=None): self.plan_date = plan_date self.pickup_time = pickup self.delivery_time = delivery plans = [ P(datetime(2026, 9, 10, 8, 0), datetime(2026, 9, 12, 18, 0)), P(datetime(2026, 9, 10, 9, 0), None), P(datetime(2026, 8, 31, 8, 0), datetime(2026, 9, 1, 18, 0)), ] counts = _accumulate_calendar_day_counts( plans, month_start=date(2026, 9, 1), month_end=date(2026, 9, 30), include_plan_date=False, ) assert counts == {"2026-09-01": 1, "2026-09-10": 2, "2026-09-12": 1}