# pylint: disable=redefined-outer-name,unused-argument import os from time import sleep from unittest.mock import create_autospec import boto3 import moto import pytest from dapd_db_schema.helpers.db import EngineManager from dapd_db_schema.schemas.uow_meta import AuditLog, UnitOfWork, UnitOfWorkStatusEnum from dapd_helpers.misc import utcnow from sqlalchemy.orm import scoped_session, sessionmaker from structlog.stdlib import BoundLogger from dapd_exporter_api.repositories.postgres import data_storage, meta_storage from dapd_exporter_api.services.config import ConfigService @pytest.fixture(scope='session') def config(): config_service = ConfigService() yield config_service.load_config() @pytest.fixture(scope='session') def aws_credentials(): # pylint: disable=redefined-outer-name os.environ['AWS_ACCESS_KEY_ID'] = 'testing' os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing' os.environ['AWS_SECURITY_TOKEN'] = 'testing' os.environ['AWS_SESSION_TOKEN'] = 'testing' os.environ['AWS_DEFAULT_REGION'] = 'us-east-2' @pytest.fixture(scope='session') def s3_client(aws_credentials): with moto.mock_aws(): yield boto3.client('s3') @pytest.fixture(scope='session') def engine(): if os.getenv('IS_INTEGRATION_TESTING'): with EngineManager(os.getenv('DB_URL')).engine() as engine: yield engine else: yield @pytest.fixture(scope='session') def session_manager(engine): if os.getenv('IS_INTEGRATION_TESTING'): session_factory = sessionmaker(bind=engine) session = scoped_session(session_factory) # Simple hack for waiting migrations to be completed while True: result = session.execute( # pylint: disable=no-member 'SELECT id FROM databasechangelog ORDER BY dateexecuted DESC LIMIT 1' ) if result.first(): break sleep(1) yield session session.close() else: yield @pytest.fixture(scope='session') def data_storage_repo(logger, session_manager): yield data_storage.Repository(logger, session_manager) @pytest.fixture(scope='session') def meta_storage_repo(logger, session_manager): yield meta_storage.Repository(logger, session_manager) @pytest.fixture(scope='session') def logger(): yield create_autospec(BoundLogger) @pytest.fixture(scope='function', autouse=True) def clean_db(session_manager): yield if os.getenv('IS_INTEGRATION_TESTING'): for model in [AuditLog, UnitOfWork]: session_manager.query(model).delete() session_manager.commit() @pytest.fixture def units_of_work_dapd(session_manager): result = [] uow_id = 1 for index, status in enumerate([ UnitOfWorkStatusEnum.EXPORT_IN_PROGRESS, UnitOfWorkStatusEnum.EXPORT_FAILED, UnitOfWorkStatusEnum.EXPORT_COMPLETED, ]): instance = UnitOfWork( uow_id=uow_id, project='dapd', fact='fact_artist_followers', dimensions=['dim_playlist', 'dim_track'], status=status, version='v1', first_fact_id=index * 10 + 1, last_fact_id=index * 10 + 2, created_at=utcnow(), updated_at=utcnow(), ) session_manager.add(instance) result.append(instance) uow_id += 1 session_manager.commit() yield result @pytest.fixture def units_of_work_decibel(session_manager): result = [] uow_id = 1 for _, status in enumerate([ UnitOfWorkStatusEnum.EXPORT_IN_PROGRESS, UnitOfWorkStatusEnum.EXPORT_FAILED, UnitOfWorkStatusEnum.EXPORT_COMPLETED, ]): instance = UnitOfWork( uow_id=uow_id, project='decibel', fact='', dimensions=[ 'ads_ad_set', 'ads_campaign', 'campaign_artist_links', 'campaign_project_links', 'facebook_age_gender_daily_report', 'facebook_age_gender_daily_report_actions', 'facebook_age_gender_daily_report_conversions', 'facebook_age_gender_daily_report_unique_actions', ], status=status, version='v1', first_fact_id=0, last_fact_id=0, created_at=utcnow(), updated_at=utcnow(), ) session_manager.add(instance) result.append(instance) uow_id += 1 session_manager.commit() yield result