mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-06-10 17:04:45 +02:00
First per-adapter content formatter in the meshai-side central_normalizer library (per Central response to schema-divergence + nearest-town reports). state_511_atis (94% of Idaho 511 work-zone traffic) now produces clean wire strings like "🚧 SH-55, near McCall: both directions, emergency repairs" instead of the previous "🚧 ROADS: Work Zone, US-ID. routine -- roadwork". Implementation: nearest_town(lat, lon) calls Photon directly at 100.64.0.24:2322/reverse with osm_tag=place + client-side filter for city/town/village/hamlet (Navi passthrough route documented in Central response does not exist on current Navi instance). H3-cell-7 LRU cache. Town fallback chain: _enriched.geocoder.city -> nearest_town(coords) -> drop segment. Composer bypass via event.data["_meshai_precomposed"] flag -- renderer owns full wire string for normalized events. SB->S route normalization. distance<1mi -> "near X". Tests: 535 passed (was 511, +24 net). Synthetic probe over 25 bucket-B + 8 fixture envelopes confirmed 23/25 + 8/8 produce clean output; 2/25 fell back to None (drop segment) on Photon index gaps near Boise/Cascade. Matt eyeballed and approved. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
207 lines
8.3 KiB
Python
207 lines
8.3 KiB
Python
"""Tests for the work_zone mesh renderer."""
|
||
|
||
from datetime import datetime, timedelta
|
||
|
||
import pytest
|
||
|
||
from meshai.notifications.renderers.work_zone import format_work_zone_mesh
|
||
|
||
|
||
def _bytelen(s: str) -> int:
|
||
return len(s.encode("utf-8"))
|
||
|
||
|
||
# ---------- canonical / fully-populated case ------------------------------
|
||
|
||
|
||
def test_all_fields_present_produces_canonical_format():
|
||
n = {
|
||
"source": "state_511_atis", "road": "SH-3", "direction": "both",
|
||
"mile_start": 60, "mile_end": None, "description": "...",
|
||
"sub_type": "construction work", "impact": "partial",
|
||
"ends_at": datetime(2026, 6, 2, 17, 0),
|
||
"town": "Plummer", "distance_mi": 8, "bearing": "N",
|
||
}
|
||
out = format_work_zone_mesh(n, now=datetime(2026, 6, 1, 14, 0))
|
||
assert out.startswith("🚧 SH-3 @ mile 60")
|
||
assert "8 mi N of Plummer" in out
|
||
assert "both directions" in out
|
||
assert "construction work" in out
|
||
assert _bytelen(out) <= 80
|
||
|
||
|
||
# ---------- segment-drop progression --------------------------------------
|
||
|
||
|
||
def test_no_mile_drops_at_mile_segment():
|
||
n = {"source": "state_511_atis", "road": "W Prairie Ave", "direction": "both",
|
||
"mile_start": None, "mile_end": None, "sub_type": "paving",
|
||
"impact": "partial", "town": "Coeur d'Alene", "distance_mi": 5, "bearing": "E",
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert "@ mile" not in out
|
||
assert "W Prairie Ave" in out
|
||
assert "5 mi E of Coeur d'Alene" in out
|
||
|
||
|
||
def test_no_town_drops_distance_segment():
|
||
n = {"source": "state_511_atis", "road": "SH-55", "direction": "both",
|
||
"mile_start": 17, "mile_end": 18, "sub_type": "paving",
|
||
"impact": "partial", "town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert " mi " not in out
|
||
assert " of " not in out
|
||
assert "@ mile 17–18" in out
|
||
|
||
|
||
def test_no_ends_drops_ends_suffix():
|
||
n = {"source": "state_511_atis", "road": "I-86", "direction": "both",
|
||
"mile_start": 58, "mile_end": 59, "sub_type": "bridge maintenance",
|
||
"impact": "partial", "town": "Pocatello", "distance_mi": 15, "bearing": "W",
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert ", ends" not in out
|
||
|
||
|
||
def test_unknown_direction_drops_direction_phrase():
|
||
n = {"source": "state_511_atis", "road": "SH-36", "direction": "unknown",
|
||
"mile_start": 17, "mile_end": 18, "sub_type": "paving",
|
||
"impact": "partial", "town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert "unknown" not in out.lower().split(":")[-1] # no 'unknown' in tail
|
||
|
||
|
||
def test_full_closure_promoted():
|
||
n = {"source": "state_511_atis", "road": "I-15", "direction": "southbound",
|
||
"mile_start": None, "mile_end": None, "sub_type": "road construction",
|
||
"impact": "full_closure", "town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert "all lanes closed" in out
|
||
|
||
|
||
# ---------- byte budget ---------------------------------------------------
|
||
|
||
|
||
def test_byte_length_under_80_for_canonical():
|
||
n = {"source": "state_511_atis", "road": "SH-3", "direction": "both",
|
||
"mile_start": 60, "mile_end": None, "sub_type": "construction work",
|
||
"impact": "partial", "town": "Plummer", "distance_mi": 8, "bearing": "N",
|
||
"ends_at": datetime(2026, 6, 2, 17, 0), "description": ""}
|
||
out = format_work_zone_mesh(n, now=datetime(2026, 6, 1, 14, 0))
|
||
assert _bytelen(out) <= 80
|
||
|
||
|
||
def test_byte_length_under_80_with_long_road_name():
|
||
n = {"source": "state_511_atis",
|
||
"road": "SCIENCE CENTER DR / E ANDERSON ST / N THIRD WAY",
|
||
"direction": "both",
|
||
"mile_start": 100, "mile_end": 200, "sub_type": "construction work",
|
||
"impact": "partial", "town": "Idaho Falls", "distance_mi": 12, "bearing": "SE",
|
||
"ends_at": datetime(2026, 9, 16, 1, 0), "description": ""}
|
||
out = format_work_zone_mesh(n, now=datetime(2026, 6, 1, 14, 0))
|
||
assert _bytelen(out) <= 80, f"over budget: {len(out.encode('utf-8'))} = {out!r}"
|
||
|
||
|
||
def test_emoji_counts_as_4_bytes():
|
||
# 🚧 is U+1F6A7 → 4 bytes in UTF-8.
|
||
assert _bytelen("🚧") == 4
|
||
|
||
|
||
def test_extreme_road_name_truncated():
|
||
# Force the renderer into the truncate-road last-resort branch.
|
||
long_road = "VERY-LONG-ROAD-NAME-" * 10
|
||
n = {"source": "state_511_atis", "road": long_road, "direction": None,
|
||
"mile_start": None, "mile_end": None, "sub_type": None,
|
||
"impact": "partial", "town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert _bytelen(out) <= 80
|
||
assert out.startswith("🚧 ")
|
||
assert "…" in out or _bytelen(long_road) <= 80 # truncated with ellipsis
|
||
|
||
|
||
# ---------- ends_at relative-time formatting ------------------------------
|
||
|
||
|
||
def test_ends_today_format():
|
||
now = datetime(2026, 6, 1, 9, 0)
|
||
ends = datetime(2026, 6, 1, 18, 0)
|
||
n = {"source": "state_511_atis", "road": "X", "direction": None,
|
||
"mile_start": None, "mile_end": None, "sub_type": None, "impact": "partial",
|
||
"town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": ends, "description": ""}
|
||
out = format_work_zone_mesh(n, now=now)
|
||
assert "today" in out and "6pm" in out
|
||
|
||
|
||
def test_ends_within_week_uses_weekday():
|
||
now = datetime(2026, 6, 1, 9, 0) # Monday
|
||
ends = datetime(2026, 6, 5, 16, 30)
|
||
n = {"source": "state_511_atis", "road": "X", "direction": None,
|
||
"mile_start": None, "mile_end": None, "sub_type": None, "impact": "partial",
|
||
"town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": ends, "description": ""}
|
||
out = format_work_zone_mesh(n, now=now)
|
||
assert "Fri" in out
|
||
assert "4:30pm" in out
|
||
|
||
|
||
def test_ends_past_drops_segment():
|
||
now = datetime(2026, 6, 10, 9, 0)
|
||
ends = datetime(2026, 5, 5, 17, 0) # already past
|
||
n = {"source": "state_511_atis", "road": "X", "direction": None,
|
||
"mile_start": None, "mile_end": None, "sub_type": None, "impact": "partial",
|
||
"town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": ends, "description": ""}
|
||
out = format_work_zone_mesh(n, now=now)
|
||
assert ", ends" not in out
|
||
|
||
|
||
# ---------- v0.5.8 distance < 1 mi → "near X" -----------------------------
|
||
|
||
|
||
def test_distance_zero_drops_to_near_only():
|
||
n = {"source": "state_511_atis", "road": "SH-55", "direction": "both",
|
||
"mile_start": None, "mile_end": None, "sub_type": "emergency repairs",
|
||
"impact": "partial", "town": "McCall", "distance_mi": 0, "bearing": "S",
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert "near McCall" in out
|
||
assert "0 mi" not in out
|
||
assert "S of McCall" not in out
|
||
|
||
|
||
def test_distance_one_keeps_bearing_segment():
|
||
n = {"source": "state_511_atis", "road": "SH-41", "direction": "southbound",
|
||
"mile_start": None, "mile_end": None, "sub_type": "utility work",
|
||
"impact": "partial", "town": "Rathdrum", "distance_mi": 1, "bearing": "S",
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
assert "1 mi S of Rathdrum" in out
|
||
|
||
|
||
# ---------- v0.5.8 no-road fallback (leads with town) ---------------------
|
||
|
||
|
||
def test_no_road_leads_with_town_distance():
|
||
n = {"source": "state_511_atis", "road": None, "direction": "southbound",
|
||
"mile_start": None, "mile_end": None, "sub_type": "ramp work",
|
||
"impact": "partial", "town": "Stanley", "distance_mi": 3, "bearing": "NE",
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
# Head is the distance/town form, not a placeholder.
|
||
assert out.startswith("🚧 3 mi NE of Stanley")
|
||
assert "Road event" not in out
|
||
|
||
|
||
def test_no_road_no_town_falls_back_to_placeholder():
|
||
n = {"source": "state_511_atis", "road": None, "direction": "both",
|
||
"mile_start": None, "mile_end": None, "sub_type": None,
|
||
"impact": "partial", "town": None, "distance_mi": None, "bearing": None,
|
||
"ends_at": None, "description": ""}
|
||
out = format_work_zone_mesh(n)
|
||
# Placeholder is acceptable when we have literally nothing.
|
||
assert out.startswith("🚧 ")
|