mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
Behavior-preserving relocation (byte-identical goldens), behind the staged-
cutover gate.
- formatters/nws.py + gating/nws.py: move _render + all CAP parsing (HTML-strip,
_parse_nws_description, motion/hail/wind, county scoping, short-expiry) and the
gating (3h re-alert window, Update/Cancel/Expire tombstone, first-sighting,
warning->immediate severity). Native env/nws.py stops truncating description +
carries parameters/eventCode/certainty/msgType/references/geocoder. Registers
weather_warning + weather_statement.
- formatters/incident.py + gating/incident.py: absorb the incident _render AND
the work_zone renderer, reconciling the two sub_type vocabularies; traffic_events
change-detection gating. Native env/{traffic,roads511}.py emit canonical data.
Registers work_zone/road_incident/road_closure/traffic_congestion.
- formatters/_anchor.py: shared town/distance/bearing resolver (consolidates WFIGS
_location_anchor + incident nearest_town; WFIGS fire reuses in Phase 3).
- Fixtures captured: nws x37, traffic x46.
Tier-a byte-identical goldens for all fixtures. Tests: +~150; 0 new failures
(34 baseline, 1539 passed).
Co-authored-by: Matt Johnson <mj@k7zvx.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
75 lines
3.3 KiB
Python
75 lines
3.3 KiB
Python
"""Phase-0 scaffold tests: formatter registry empty + dispatch correctness.
|
|
|
|
(a) With an empty registry, get_formatter returns None for real categories.
|
|
(b) A registered dummy formatter is called verbatim — multi-line output is
|
|
returned as-is (no Mode-B single-line cap applied).
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from meshai.notifications.formatters import FORMATTERS, get_formatter, register
|
|
from meshai.notifications.events import make_event
|
|
from meshai.notifications.renderers.composer import compose_mesh_message
|
|
|
|
|
|
# ── (a) empty registry returns None for known categories ──────────────────────
|
|
|
|
@pytest.mark.parametrize("category", [
|
|
# earthquake_event removed: Phase-1 registers formatters.quake for it.
|
|
# weather_warning/weather_statement removed: Phase-2 registers formatters.nws.
|
|
# road_closure/work_zone/road_incident/traffic_congestion removed: Phase-2 registers formatters.incident.
|
|
"wildfire_incident",
|
|
"battery_critical",
|
|
])
|
|
def test_get_formatter_returns_none_while_registry_empty(category):
|
|
"""Un-migrated categories must still return None from get_formatter."""
|
|
# Only categories not yet migrated to the formatter+gater architecture.
|
|
assert category not in FORMATTERS, (
|
|
f"Category {category!r} should not be in FORMATTERS yet (not migrated)"
|
|
)
|
|
assert get_formatter(category) is None
|
|
|
|
|
|
# ── (b) registered dummy formatter is dispatched verbatim ────────────────────
|
|
|
|
_SYNTHETIC_CATEGORY = "_test_scaffold_dummy_category_phase0"
|
|
_MULTILINE_OUTPUT = "Line one\nLine two\nLine three"
|
|
|
|
|
|
def _dummy_formatter(event, *, now: float, budget: int) -> str:
|
|
"""Returns a fixed multi-line string to prove verbatim passthrough."""
|
|
return _MULTILINE_OUTPUT
|
|
|
|
|
|
def test_registered_formatter_returns_verbatim_multiline(monkeypatch):
|
|
"""Register a dummy for a synthetic category; compose_mesh_message must
|
|
return the dummy's multi-line output verbatim — newlines preserved — not
|
|
re-processed through Mode-B's single-line budget loop.
|
|
|
|
Cutover gate: the formatter is only dispatched when the category appears in
|
|
MESHAI_CUTOVER_CATEGORIES. This test sets the var to verify the formatter
|
|
IS invoked once cut over (the complementary not-cutover case is covered by
|
|
test_cutover_gate.py).
|
|
"""
|
|
from meshai.notifications.cutover import _clear_cache as _cutover_clear
|
|
# Mark synthetic category as cut over for this test.
|
|
monkeypatch.setenv("MESHAI_CUTOVER_CATEGORIES", _SYNTHETIC_CATEGORY)
|
|
_cutover_clear()
|
|
# Register the dummy (clean up afterwards to avoid cross-test pollution).
|
|
register(_SYNTHETIC_CATEGORY, _dummy_formatter)
|
|
try:
|
|
event = make_event(
|
|
source="test",
|
|
category=_SYNTHETIC_CATEGORY,
|
|
severity="routine",
|
|
title="First line\nSecond line", # multi-line title
|
|
)
|
|
result = compose_mesh_message(event)
|
|
assert result == _MULTILINE_OUTPUT, (
|
|
f"Expected verbatim multi-line output, got: {result!r}"
|
|
)
|
|
# Verify newlines are preserved (Mode-B would strip them).
|
|
assert "\n" in result, "Newlines must survive the formatter dispatch path"
|
|
finally:
|
|
FORMATTERS.pop(_SYNTHETIC_CATEGORY, None)
|
|
_cutover_clear() # restore cache for subsequent tests
|