Show inferred Bristol rail leg for Eurostar trips

This commit is contained in:
Edward Betts 2026-08-03 14:40:53 +01:00
parent ea80166229
commit 6a601f5c14
4 changed files with 299 additions and 36 deletions

View file

@ -6,7 +6,7 @@ from datetime import date, datetime, timezone
import agenda.trip
import pytest
from agenda.types import Trip
from agenda.types import StrDict, Trip
from web_view import app
@ -171,6 +171,150 @@ def test_get_trip_routes_assumes_unbooked_paris_trip_is_by_train(
]
def test_get_trip_routes_adds_bristol_feeder_for_london_eurostar(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Booked London Eurostar trips should show the assumed Bristol rail feeder."""
london_st_pancras = {
"name": "London St Pancras",
"latitude": 51.531921,
"longitude": -0.126361,
"routes": {"Paris Gare du Nord": "London_St_Pancras_to_Paris_Gare_du_Nord"},
}
paris_gare_du_nord = {
"name": "Paris Gare du Nord",
"latitude": 48.88111111111111,
"longitude": 2.355277777777778,
"routes": {"London St Pancras": "London_St_Pancras_to_Paris_Gare_du_Nord"},
}
bristol_temple_meads = {
"name": "Bristol Temple Meads",
"latitude": 51.449,
"longitude": -2.581,
"routes": {"London Paddington": "gwml"},
}
london_paddington = {
"name": "London Paddington",
"latitude": 51.516,
"longitude": -0.176,
"routes": {"Bristol Temple Meads": "gwml"},
}
trip = Trip(
start=date(2026, 7, 20),
travel=[
{
"type": "train",
"from": "London St Pancras",
"to": "Paris Gare du Nord",
"operator": "Eurostar",
"from_station": london_st_pancras,
"to_station": paris_gare_du_nord,
"legs": [
{
"from": "London St Pancras",
"to": "Paris Gare du Nord",
"operator": "Eurostar",
"from_station": london_st_pancras,
"to_station": paris_gare_du_nord,
}
],
}
],
)
stations = [
london_st_pancras,
paris_gare_du_nord,
bristol_temple_meads,
london_paddington,
]
def fake_parse_yaml(name: str, data_dir: str) -> object:
if name == "stations":
return stations
raise AssertionError(f"unexpected YAML load: {name}")
monkeypatch.setattr(agenda.trip.travel, "parse_yaml", fake_parse_yaml)
routes = agenda.trip.get_trip_routes(trip, "/tmp/personal-data")
assert routes == [
{
"type": "train",
"key": "train_Bristol Temple Meads_London Paddington",
"geojson_filename": "train_routes/gwml",
},
{
"type": "train",
"key": "train_London St Pancras_Paris Gare du Nord",
"geojson_filename": "train_routes/London_St_Pancras_to_Paris_Gare_du_Nord",
},
]
def test_add_coordinates_for_eurostar_home_feeder_adds_bristol_station(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""London Eurostar trips should get an assumed Bristol station pin."""
london_st_pancras = {
"name": "London St Pancras",
"latitude": 51.531921,
"longitude": -0.126361,
}
paris_gare_du_nord = {
"name": "Paris Gare du Nord",
"latitude": 48.88111111111111,
"longitude": 2.355277777777778,
}
bristol_temple_meads = {
"name": "Bristol Temple Meads",
"latitude": 51.449,
"longitude": -2.581,
}
trip = Trip(
start=date(2026, 7, 20),
travel=[
{
"type": "train",
"from": "London St Pancras",
"to": "Paris Gare du Nord",
"operator": "Eurostar",
"from_station": london_st_pancras,
"to_station": paris_gare_du_nord,
"legs": [
{
"from": "London St Pancras",
"to": "Paris Gare du Nord",
"operator": "Eurostar",
"from_station": london_st_pancras,
"to_station": paris_gare_du_nord,
}
],
}
],
)
def fake_parse_yaml(name: str, data_dir: str) -> object:
if name == "stations":
return [london_st_pancras, paris_gare_du_nord, bristol_temple_meads]
raise AssertionError(f"unexpected YAML load: {name}")
monkeypatch.setattr(agenda.trip.travel, "parse_yaml", fake_parse_yaml)
coordinates: list[StrDict] = []
agenda.trip.add_coordinates_for_eurostar_home_feeder(
trip, coordinates, "/tmp/personal-data"
)
assert coordinates == [
{
"name": "Bristol Temple Meads",
"type": "station",
"latitude": 51.449,
"longitude": -2.581,
}
]
def test_load_cars_infers_route_labels_and_home_marker(
tmp_path: pathlib.Path,
) -> None: