fix: address final-review items (status endpoint, docs, tests)
Follow-up to the holistic review of the PIN-unification branch: - /system/status now reads the real arm state from the arm_state_log table via get_current_arm_state, instead of returning a hardcoded 'DISARMED' stub. Without this, polling after the new async 202 arm/disarm flow was a UX dead-end — clients never saw the state change they just requested. DB read failures degrade gracefully. - Operator guide: correct the claim that 'vigilar config set-pin' populates recovery_passphrase_hash. It doesn't. recovery_passphrase _hash has no CLI helper today; it must be set manually. - Tests: add a fail-closed regression for verify_pin on malformed stored hashes, and a companion test confirming the deprecation warning stays silent on a fully migrated config. All address specific review comments on the branch; no scope creep. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit was merged in pull request #7.
This commit is contained in:
@@ -102,3 +102,36 @@ def test_recordings_page_loads():
|
||||
with app.test_client() as client:
|
||||
resp = client.get("/recordings/")
|
||||
assert resp.status_code == 200
|
||||
|
||||
|
||||
def test_system_status_reflects_fsm_arm_state(tmp_path, monkeypatch):
|
||||
"""system_status must read the current arm state from the DB,
|
||||
not return a hardcoded stub. Regression guard for the web-to-FSM
|
||||
async flow introduced in issue #2."""
|
||||
from vigilar.config import SystemConfig, VigilarConfig
|
||||
import vigilar.storage.db as db_module
|
||||
from vigilar.storage.db import get_db_path
|
||||
from vigilar.storage.schema import metadata
|
||||
from vigilar.storage.queries import insert_arm_state
|
||||
from vigilar.web.app import create_app
|
||||
from sqlalchemy import create_engine
|
||||
|
||||
data_dir = tmp_path / "data"
|
||||
data_dir.mkdir()
|
||||
cfg = VigilarConfig(system=SystemConfig(data_dir=str(data_dir)))
|
||||
|
||||
# Build an isolated engine (bypass the module-level singleton)
|
||||
db_path = get_db_path(str(data_dir))
|
||||
isolated_engine = create_engine(f"sqlite:///{db_path}", echo=False)
|
||||
metadata.create_all(isolated_engine)
|
||||
|
||||
insert_arm_state(isolated_engine, "ARMED_AWAY", "test", None)
|
||||
|
||||
# Patch the singleton so the blueprint's get_engine() returns our engine
|
||||
monkeypatch.setattr(db_module, "_engine", isolated_engine)
|
||||
|
||||
app = create_app(cfg)
|
||||
with app.test_client() as c:
|
||||
resp = c.get("/system/status")
|
||||
assert resp.status_code == 200
|
||||
assert resp.get_json()["arm_state"] == "ARMED_AWAY"
|
||||
|
||||
Reference in New Issue
Block a user