Phase 1 (Foundation): project skeleton, TOML config + Pydantic validation, MQTT bus wrapper, SQLite schema (9 tables), Click CLI, process supervisor. Phase 2 (Camera): RTSP capture via OpenCV, MOG2 motion detection with configurable sensitivity/zones, adaptive FPS recording (2fps idle/30fps motion) via FFmpeg subprocess, HLS live streaming, pre-motion ring buffer. Phase 3 (Web UI): Flask + Bootstrap 5 dark theme, 6 blueprints, Jinja2 templates (dashboard, kiosk 2x2 grid, events, sensors, recordings, settings), PWA with service worker + Web Push, full admin settings UI with config persistence. Remote Access: WireGuard tunnel configs, nginx reverse proxy with HLS caching + rate limiting, bandwidth-optimized remote HLS stream (426x240 @ 500kbps), DO droplet setup script, certbot TLS. 29 tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
22 lines
629 B
Python
22 lines
629 B
Python
"""Tests for database schema creation."""
|
|
|
|
from vigilar.storage.db import init_db
|
|
from vigilar.storage.schema import metadata
|
|
|
|
|
|
def test_tables_created(tmp_path):
|
|
db_path = tmp_path / "test.db"
|
|
engine = init_db(db_path)
|
|
assert db_path.exists()
|
|
|
|
from sqlalchemy import inspect
|
|
inspector = inspect(engine)
|
|
table_names = inspector.get_table_names()
|
|
|
|
expected = [
|
|
"cameras", "sensors", "sensor_states", "events", "recordings",
|
|
"system_events", "arm_state_log", "alert_log", "push_subscriptions",
|
|
]
|
|
for name in expected:
|
|
assert name in table_names, f"Missing table: {name}"
|