mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
Triaged all 20 known-red tests. 13 were stale tests asserting rotted expectations against deliberate, documented behavior changes; fixed by deriving expected values instead of hard-coding, or updating the expectation to match a documented policy change: - test_adapter_config_foundation.py / test_adapter_config_api.py: REGISTRY/API key-count and key-set guards hard-coded magic numbers (59/94/17) that rotted repeatedly. Now derive expectations from REGISTRY itself and, for the schema version, from the migrations directory, so they can't rot the same way again. - test_fire_tracker_phase4.py: two tests hardcoded a nonexistent deployment path (/opt/meshai/meshai/router.py) that matches no Dockerfile WORKDIR in this repo; resolve the module path via importlib.util.find_spec instead. - test_tombstone_broadcast.py: asserted fire severity == "immediate", which commit2f677e85deliberately downgraded to "priority" (to stop fire broadcasts bypassing the Grouper/cooldown during NATS backlog replay) without updating this test. - test_pipeline_grouper.py: test_immediate_severity_bypasses_grouper asserted an immediate-severity bypass that commit85d48ce3("fix(fire): remove immediate-severity exemption from grouper + cooldown") DELETED on purpose -- fire events carry _severity_override="immediate", and the exemption left fire with no rate control at all in normal live operation. Re-adding the bypass would re-open that fire-spam hole on a public-safety mesh, so the test moves, not the source. Renamed + inverted to assert the real contract (all severities coalesce; only a missing group_key passes through). - test_tail_followups.py: dispatcher mock was missing dispatch_scheduled_fire_broadcast (a method added alongside the generic dispatch_scheduled_broadcast; test_reminders.py already mocks both). - test_tracking_v057.py: guard required an empty tracking-family adapter list in Environment.tsx, but the frontend has long grouped the pre-existing native satpass adapter under the "Tracking" display section (its own "satpass" backend toggle, unrelated to the Phase-7 tracking family every other guard in this file confirms is still unimplemented). Narrowed the guard to allow only that known entry. - test_v052_dispatcher.py: two tests used category="wildfire_incident", which the phase3b fire migration (#33) forced onto a dedicated formatter via NATIVE_ALWAYS_DECIDE; swapped to wildfire_hotspot (same emoji/label, not in NATIVE_ALWAYS_DECIDE) to keep exercising the generic composer logic under test. Also fixes one stale COMMENT (comment-only, no logic change) in meshai/notifications/pipeline/__init__.py's start_pipeline(): it still claimed "Immediate events bypass the grouper and don't need this [periodic flush]", which has been false since85d48ce3and is precisely what makes the deleted bypass look like a missing feature. The comment now records that the removal was deliberate and must not be reverted. The remaining 6 failures are left untouched -- 2 confirmed real bugs, to be fixed deliberately in their own changes: - meshcore_transport.py defines `_resolve_contact` TWICE on MeshCoreTransport (line 171 from PR #56, line 1227 from PR #92). The second silently shadows the first, so the DM contact-resolution refetch-on-miss that #56 added is dead code in production. (3 tests) - SCHEMA_VERSION (persistence/db.py:33) is stale at 26 vs. the actual highest migration v28; v27 and v28 shipped without bumping it. (3 tests) Plus 1 environment gap, not a code defect: test_natural_language_fire_question_routes_to_llm needs the `openai` package, which is declared in requirements.txt but not installed here. Suite: 20 failed, 2240 passed, 72 skipped -> 7 failed, 2254 passed, 72 skipped. All 7 remaining failures are ones classified above; no new failures introduced elsewhere in the suite. Co-authored-by: Matt Johnson <mj@k7zvx.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8ba8700466
commit
c82cceffde
9 changed files with 247 additions and 48 deletions
|
|
@ -13,7 +13,7 @@ import pytest
|
|||
from fastapi import FastAPI
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from meshai.adapter_config import adapter_config, invalidate_cache
|
||||
from meshai.adapter_config import adapter_config, invalidate_cache, REGISTRY
|
||||
from meshai.dashboard.api.adapter_config_routes import router
|
||||
|
||||
|
||||
|
|
@ -29,25 +29,36 @@ def client():
|
|||
# ============================================================================
|
||||
|
||||
|
||||
def test_list_returns_all_59_keys(client):
|
||||
def test_list_returns_every_registry_key(client):
|
||||
"""The grouped listing must return exactly one row per REGISTRY entry.
|
||||
|
||||
Previously hard-coded an exact total (59, then 96, then 94 -- the test
|
||||
name still said 59 long after the asserted number had drifted twice)
|
||||
that rotted every time a key was legitimately added or removed from
|
||||
REGISTRY. Comparing against len(REGISTRY) directly is the actual
|
||||
invariant under test and can't rot the same way.
|
||||
"""
|
||||
r = client.get("/api/adapter-config")
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
# 14 adapters with at least one key (itd_511 has zero -- not in the
|
||||
# grouped dict because the SQL only returns rows that exist).
|
||||
total = sum(len(v) for v in body.values())
|
||||
# was 96; config-schema cleanup removed the two deprecated nws keys
|
||||
# (broadcast_severities, warning_suffix_promotes) -> 94.
|
||||
assert total == 94
|
||||
assert total == len(REGISTRY)
|
||||
|
||||
|
||||
def test_list_grouped_by_adapter(client):
|
||||
"""wfigs's key set in the API must match REGISTRY exactly.
|
||||
|
||||
Previously hard-coded a 5-key set that missed max_declare_age_seconds
|
||||
(added by the fire age-gate feature, commit 95b1a23e) -- comparing
|
||||
against REGISTRY directly means a future added/removed wfigs key can't
|
||||
silently desync this test again.
|
||||
"""
|
||||
r = client.get("/api/adapter-config")
|
||||
body = r.json()
|
||||
assert "wfigs" in body
|
||||
keys = {row["key"] for row in body["wfigs"]}
|
||||
assert keys == {"cooldown_seconds", "anchor_max_mi", "freshness_seconds",
|
||||
"broadcast_on_acres", "broadcast_on_contained"}
|
||||
expected = {key for (adapter, key) in REGISTRY if adapter == "wfigs"}
|
||||
assert keys == expected
|
||||
|
||||
|
||||
def test_list_includes_type_value_default_description(client):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue