Files
Mileage-Logger/tests/test_itinerary.py

79 lines
3.1 KiB
Python

import os
import unittest
from datetime import date
from mileage_logger.ingest.semantic_reader import load_place_visits
from mileage_logger.logic.detect_itinerary import SiteConfig, detect_itinerary
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), "fixtures", "semantic")
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "..", "config", "sites.yml")
class TestItineraryDetection(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.site_config = SiteConfig.from_yaml(CONFIG_PATH)
def _load_visits(self, filename: str):
path = os.path.join(FIXTURES_DIR, filename)
return load_place_visits(path)
def test_one_day_simple(self):
visits = self._load_visits("2025-08-08.one_day_simple.json")
hops = detect_itinerary(visits, self.site_config)
canonical_pairs = [(h.origin, h.destination) for h in hops]
expected = [
("Home", "Lingwood Primary Academy"),
("Lingwood Primary Academy", "Heartsease Primary Academy"),
("Heartsease Primary Academy", "Home"),
]
self.assertEqual(canonical_pairs, expected)
def test_looping_multi_visit(self):
visits = self._load_visits("2025-08-12.looping.json")
hops = detect_itinerary(visits, self.site_config)
canonical_pairs = [(h.origin, h.destination) for h in hops]
expected = [
("Home", "Lingwood Primary Academy"),
("Lingwood Primary Academy", "Valley Primary Academy"),
("Valley Primary Academy", "Lingwood Primary Academy"),
("Lingwood Primary Academy", "Home"),
]
self.assertEqual(canonical_pairs, expected)
def test_detours_ignored(self):
visits = self._load_visits("day_with_detours.json")
hops = detect_itinerary(visits, self.site_config)
canonical_pairs = [(h.origin, h.destination) for h in hops]
expected = [
("Home", "Lingwood Primary Academy"),
("Lingwood Primary Academy", "Heartsease Primary Academy"),
("Heartsease Primary Academy", "Home"),
]
self.assertEqual(canonical_pairs, expected)
def test_no_home_start(self):
visits = self._load_visits("no_home_start.json")
hops = detect_itinerary(visits, self.site_config)
canonical_pairs = [(h.origin, h.destination) for h in hops]
expected = [
("Unity SP", "Heartsease Primary Academy"),
("Heartsease Primary Academy", "Home"),
]
self.assertEqual(canonical_pairs, expected)
def test_cross_midnight_dates(self):
visits = self._load_visits("cross_midnight.json")
hops = detect_itinerary(visits, self.site_config)
self.assertEqual(len(hops), 2)
# Ensure canonical names
self.assertEqual((hops[0].origin, hops[0].destination), ("Home", "Heartsease Primary Academy"))
self.assertEqual((hops[1].origin, hops[1].destination), ("Heartsease Primary Academy", "Home"))
# Check dates (local) across midnight
self.assertEqual(hops[0].date, date(2025, 8, 8))
self.assertEqual(hops[1].date, date(2025, 8, 9))
if __name__ == '__main__':
unittest.main()