"""Per-test database setup for the Cyclone test suite. Every test gets a fresh SQLite DB at ``tmp_path/test.db`` so the suite can run in parallel and never touches the user's ``~/.local/share/cyclone`` database. ``db.init_db()`` is idempotent — tests that already call it explicitly are unaffected (the second call short-circuits). This fixture exists because the SQLAlchemy-backed ``CycloneStore`` requires the engine to be initialized before any DB access, whereas the old in-memory store did not. Adding the init here keeps existing test modules (test_api.py, test_api_835.py, test_api_gets.py, test_api_parse_persists.py) working unchanged. """ from __future__ import annotations import pytest @pytest.fixture(autouse=True) def _auto_init_db(tmp_path, monkeypatch): """Point CYCLONE_DB_URL at a per-test SQLite file and init the schema. Also wires a fresh ``EventBus`` onto ``app.state`` because ``TestClient`` does not invoke the FastAPI lifespan handler unless used as a context manager. The bus is reset between tests so subscribers don't leak. """ monkeypatch.setenv("CYCLONE_DB_URL", f"sqlite:///{tmp_path}/test.db") from cyclone import db from cyclone.api import app from cyclone.pubsub import EventBus db._reset_for_tests() db.init_db() app.state.event_bus = EventBus() try: yield finally: app.state.event_bus = None db._reset_for_tests()