""" Tests pour la couche de connexion SQLAlchemy. """ from dataclasses import dataclass import pytest from sqlalchemy import inspect from pricewatch.app.db.connection import ( check_db_connection, get_engine, get_session, init_db, reset_engine, ) from pricewatch.app.db.models import Product @dataclass class FakeDbConfig: """Config DB minimale pour tests SQLite.""" url: str host: str = "sqlite" port: int = 0 database: str = ":memory:" @dataclass class FakeAppConfig: """Config App minimale pour tests.""" db: FakeDbConfig debug: bool = False @pytest.fixture(autouse=True) def reset_db_engine(): """Reset l'engine global entre les tests.""" reset_engine() yield reset_engine() @pytest.fixture def sqlite_config() -> FakeAppConfig: """Config SQLite in-memory pour tests.""" return FakeAppConfig(db=FakeDbConfig(url="sqlite:///:memory:")) def test_get_engine_sqlite(sqlite_config: FakeAppConfig): """Cree un engine SQLite fonctionnel.""" engine = get_engine(sqlite_config) assert engine.url.get_backend_name() == "sqlite" def test_init_db_creates_tables(sqlite_config: FakeAppConfig): """Init DB cree toutes les tables attendues.""" init_db(sqlite_config) engine = get_engine(sqlite_config) inspector = inspect(engine) tables = set(inspector.get_table_names()) assert "products" in tables assert "price_history" in tables assert "product_images" in tables assert "product_specs" in tables assert "scraping_logs" in tables def test_get_session_commit(sqlite_config: FakeAppConfig): """La session permet un commit simple.""" init_db(sqlite_config) with get_session(sqlite_config) as session: product = Product(source="amazon", reference="B08N5WRWNW", url="https://example.com") session.add(product) session.commit() with get_session(sqlite_config) as session: assert session.query(Product).count() == 1 def test_check_db_connection(sqlite_config: FakeAppConfig): """Le health check DB retourne True en SQLite.""" init_db(sqlite_config) assert check_db_connection(sqlite_config) is True