# pylint: disable=redefined-outer-name import shutil import subprocess import time from pathlib import Path import pytest import redis import requests from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, clear_mappers from tenacity import retry, stop_after_delay from o2ims.adapter.orm import metadata, start_o2ims_mappers from o2ims.adapter.clients.orm_stx import start_o2ims_stx_mappers from o2ims import config @pytest.fixture def in_memory_sqlite_db(): engine = create_engine("sqlite:///:memory:") # engine = create_engine("sqlite:///:memory:", echo=True) metadata.create_all(engine) return engine @pytest.fixture def sqlite_session_factory(in_memory_sqlite_db): yield sessionmaker(bind=in_memory_sqlite_db) @pytest.fixture def mappers(): start_o2ims_mappers() start_o2ims_stx_mappers() yield clear_mappers() @pytest.fixture def fake_stx_client(): pass @retry(stop=stop_after_delay(10)) def wait_for_postgres_to_come_up(engine): return engine.connect() @retry(stop=stop_after_delay(10)) def wait_for_webapp_to_come_up(): return requests.get(config.get_api_url()) @retry(stop=stop_after_delay(10)) def wait_for_redis_to_come_up(): r = redis.Redis(**config.get_redis_host_and_port()) return r.ping() @pytest.fixture(scope="session") def postgres_db(): engine = create_engine(config.get_postgres_uri(), isolation_level="SERIALIZABLE") wait_for_postgres_to_come_up(engine) metadata.create_all(engine) return engine @pytest.fixture def postgres_session_factory(postgres_db): yield sessionmaker(bind=postgres_db) @pytest.fixture def postgres_session(postgres_session_factory): return postgres_session_factory() @pytest.fixture def restart_api(): (Path(__file__).parent / "../src/o2ims/entrypoints/flask_application.py").touch() time.sleep(0.5) wait_for_webapp_to_come_up() @pytest.fixture def restart_redis_pubsub(): wait_for_redis_to_come_up() if not shutil.which("docker-compose"): print("skipping restart, assumes running in container") return subprocess.run( ["docker-compose", "restart", "-t", "0", "redis_pubsub"], check=True, )