import logging import os from time import sleep from unittest.mock import Mock import boto3 import pytest from boto3_type_annotations.s3 import Client as S3Client from db_schema.postgres.connection import Connection from db_schema.schemas import slz from moto import mock_s3 from smelog.entities import LoggerConfig from smelog.factory import LoggerFactory from . import FIXTURES_PATH ARCHIVE_BUCKET_TEST = 'bucket-archive_test' DECOMPRESSED_BUCKET_TEST = 'bucket-decompressed_test' @pytest.fixture(scope='function', autouse=True) def aws_credentials(): 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-1' boto3.setup_default_session( aws_access_key_id='testing', aws_secret_access_key='testing', aws_session_token='testing', region_name='us-east-1', ) @pytest.fixture def s3_client(aws_credentials): boto3.setup_default_session() with mock_s3(): s3_client_: S3Client = boto3.client('s3') for bucket in [ARCHIVE_BUCKET_TEST, DECOMPRESSED_BUCKET_TEST]: s3_client_.create_bucket(Bucket=bucket) yield s3_client_ s3_resource = boto3.resource('s3') for bucket in [ARCHIVE_BUCKET_TEST, DECOMPRESSED_BUCKET_TEST]: bucket = s3_resource.Bucket(bucket) bucket.objects.all().delete() bucket.delete() @pytest.fixture def fixture_path(): return FIXTURES_PATH @pytest.fixture def db() -> Connection: def creds_loader(): return dict( active_endpoint=os.environ.get('PG_HOST', '0.0.0.0'), port=os.environ.get('PG_PORT', 5432), database=os.environ.get('PG_DB', 'slz'), username=os.environ.get('PG_USER', 'admin'), password=os.environ.get('PG_PASSWORD', 'admin'), ) conn = Connection(credentials_loader=creds_loader, name='s3_storage_test', version='v1') # Simple hack for waiting migrations to be completed while True: result = conn.session.execute( # pylint: disable=no-member 'SELECT id FROM databasechangelog ORDER BY dateexecuted DESC LIMIT 1' ) if result.first(): break sleep(1) yield conn conn.session.rollback() for model in [ slz.UnitOfWorkMigrationLog, slz.ContentStatusMigrationLog, slz.ContentFailureLog, slz.ContentStatus, slz.UnitOfWork, ]: conn.session.query(model).delete() conn.session.commit() conn.disconnect() @pytest.fixture(scope='function') def db_licensors(db): return {item.licensor_name: item for item in db.session.query(slz.Licensor).all()} @pytest.fixture(scope='function') def db_reports(db): return {item.report_name: item for item in db.session.query(slz.Report).all()} @pytest.fixture(scope='function') def db_data_sources(db): return {item.data_source_name: item for item in db.session.query(slz.DataSource).all()} @pytest.fixture(scope='function') def logger_test(): log_config = LoggerConfig( name='TEST', version='1', level=logging.DEBUG, environment='test', is_local=True, ) return LoggerFactory(log_config).get_logger('TEST')