81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
# 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}
|