"""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()