central/tests/test_migration_042.py
malice 71e1e94fe1 v0.14.0: multi-bbox monitoring areas (config.monitoring_areas set-union filter)
Generalize the single system monitoring bbox into a named list of areas with
set-union semantics: an event is kept by the archive (and at publish time) if
its geometry intersects ANY configured area. No-geometry events are always
kept; an empty list keeps everything (the pre-feature default).

- Migration 042: new config.monitoring_areas table (name UNIQUE, north/south/
  east/west, CHECK ordering); seeds 'default' from config.system.monitor_* so
  current bounds (N=49.0 S=41.8 E=-111.0 W=-117.5) are preserved. Old columns
  left in place for v0.14.0 (drop in v0.14.1).
- monitoring_area.py: classify_geom_areas + load_monitoring_areas; single-area
  classify_geom / load_monitoring_area kept as back-compat shims.
- archive + supervisor consumers load and apply the area list (set-union);
  _monitoring_area kept as a back-compat property over the internal list.
- GUI /monitoring-area: list+create+update+delete (server-rendered forms),
  shared Leaflet map with per-name golden-angle colored rectangles, add/edit
  via leaflet.draw corner handles, empty-state banner, auto-fit to all areas.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 12:58:08 -06:00

40 lines
1.4 KiB
Python

"""v0.14.0 migration 042: single config.system bbox -> config.monitoring_areas.
The suite has no live Postgres (it runs identically as zvx or central), so this
asserts the migration's shape statically: it creates the table, enforces the
union-filter invariants, seeds 'default' from the existing config.system bbox to
preserve current bounds, and -- deliberately for v0.14.0 -- does NOT drop the old
columns (that lands in v0.14.1).
"""
from pathlib import Path
_SQL = Path("sql/migrations/042_monitoring_area_to_multi_areas.sql").read_text()
_NORM = " ".join(_SQL.split()) # whitespace-insensitive matching
def test_creates_monitoring_areas_table():
assert "CREATE TABLE IF NOT EXISTS config.monitoring_areas" in _NORM
def test_name_is_unique():
assert "name TEXT NOT NULL UNIQUE" in _NORM
def test_check_constraints_enforce_bbox_ordering():
assert "CHECK (north > south)" in _NORM
assert "CHECK (east > west)" in _NORM
def test_seeds_default_from_config_system_preserving_bounds():
assert "INSERT INTO config.monitoring_areas" in _NORM
assert "FROM config.system" in _NORM
assert "'default'" in _NORM
# Idempotent re-run / already-seeded installs must not error or duplicate.
assert "ON CONFLICT (name) DO NOTHING" in _NORM
def test_does_not_drop_old_columns_in_v0_14_0():
upper = _NORM.upper()
assert "DROP COLUMN" not in upper
assert "DROP TABLE" not in upper