73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
|
|
"""Unit tests for rec/route_serializer.py."""
|
||
|
|
from models.listing import DestinationMode, Route, RouteLegStep
|
||
|
|
from rec.route_serializer import RouteSerializer
|
||
|
|
from rec.routing import TravelMode
|
||
|
|
|
||
|
|
|
||
|
|
def _make_sample_routing_info() -> dict[DestinationMode, list[Route]]:
|
||
|
|
destination_mode = DestinationMode(
|
||
|
|
destination_address="London Bridge",
|
||
|
|
travel_mode=TravelMode.TRANSIT,
|
||
|
|
)
|
||
|
|
routes = [
|
||
|
|
Route(
|
||
|
|
legs=[
|
||
|
|
RouteLegStep(
|
||
|
|
distance_meters=500,
|
||
|
|
duration_s=120,
|
||
|
|
travel_mode=TravelMode.WALK,
|
||
|
|
),
|
||
|
|
RouteLegStep(
|
||
|
|
distance_meters=4000,
|
||
|
|
duration_s=480,
|
||
|
|
travel_mode=TravelMode.TRANSIT,
|
||
|
|
),
|
||
|
|
],
|
||
|
|
distance_meters=4500,
|
||
|
|
duration_s=600,
|
||
|
|
)
|
||
|
|
]
|
||
|
|
return {destination_mode: routes}
|
||
|
|
|
||
|
|
|
||
|
|
class TestRouteSerializer:
|
||
|
|
def test_serialize_then_deserialize_roundtrip(self) -> None:
|
||
|
|
routing_info = _make_sample_routing_info()
|
||
|
|
serialized = RouteSerializer.serialize(routing_info)
|
||
|
|
deserialized = RouteSerializer.deserialize(serialized)
|
||
|
|
|
||
|
|
assert len(deserialized) == 1
|
||
|
|
dest_mode = list(deserialized.keys())[0]
|
||
|
|
assert dest_mode.destination_address == "London Bridge"
|
||
|
|
assert dest_mode.travel_mode == TravelMode.TRANSIT
|
||
|
|
|
||
|
|
routes = deserialized[dest_mode]
|
||
|
|
assert len(routes) == 1
|
||
|
|
assert routes[0].distance_meters == 4500
|
||
|
|
assert routes[0].duration_s == 600
|
||
|
|
assert len(routes[0].legs) == 2
|
||
|
|
assert routes[0].legs[0].distance_meters == 500
|
||
|
|
assert routes[0].legs[0].travel_mode == TravelMode.WALK
|
||
|
|
assert routes[0].legs[1].travel_mode == TravelMode.TRANSIT
|
||
|
|
|
||
|
|
def test_deserialize_sample_json(self) -> None:
|
||
|
|
import json
|
||
|
|
import dataclasses
|
||
|
|
|
||
|
|
routing_info = _make_sample_routing_info()
|
||
|
|
# Build the JSON manually to test deserialize independently
|
||
|
|
json_str = json.dumps(
|
||
|
|
{
|
||
|
|
json.dumps(dataclasses.asdict(dm)): [
|
||
|
|
json.dumps(dataclasses.asdict(r)) for r in routes
|
||
|
|
]
|
||
|
|
for dm, routes in routing_info.items()
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
result = RouteSerializer.deserialize(json_str)
|
||
|
|
assert len(result) == 1
|
||
|
|
dest_mode = list(result.keys())[0]
|
||
|
|
assert dest_mode.destination_address == "London Bridge"
|
||
|
|
assert result[dest_mode][0].duration_s == 600
|