"""Pytest fixtures for Vigilar tests.""" import os import tempfile from pathlib import Path import pytest from sqlalchemy import create_engine, event from vigilar.config import VigilarConfig, load_config from vigilar.storage.schema import metadata @pytest.fixture(autouse=True, scope="session") def _isolate_vigilar_config(tmp_path_factory): """Prevent tests from writing to the real config/vigilar.toml. Web endpoint handlers that call `_save_and_reload()` read the target path from the VIGILAR_CONFIG env var, falling back to the relative `"config/vigilar.toml"`. Without this fixture, any test that exercises such an endpoint rewrites the repo's committed config file via a Pydantic round-trip, stripping comments and non-default fields. """ tmp_config = tmp_path_factory.mktemp("vigilar-config") / "vigilar.toml" prev = os.environ.get("VIGILAR_CONFIG") os.environ["VIGILAR_CONFIG"] = str(tmp_config) try: yield finally: if prev is None: os.environ.pop("VIGILAR_CONFIG", None) else: os.environ["VIGILAR_CONFIG"] = prev def _create_test_engine(db_path: Path): """Create a fresh engine for testing (bypasses the global singleton).""" db_path.parent.mkdir(parents=True, exist_ok=True) engine = create_engine(f"sqlite:///{db_path}", echo=False) metadata.create_all(engine) return engine @pytest.fixture def tmp_data_dir(tmp_path): """Temporary data directory for tests.""" data_dir = tmp_path / "data" data_dir.mkdir(exist_ok=True) return data_dir @pytest.fixture def test_db(tmp_path): """Create an isolated test database (no shared state between tests).""" db_path = tmp_path / "data" / "test.db" return _create_test_engine(db_path) @pytest.fixture def sample_config(): """Return a minimal VigilarConfig for testing.""" return VigilarConfig( cameras=[], sensors=[], rules=[], )