# pylint: disable=redefined-outer-name import os from unittest import mock import boto3 import pytest from boto3_type_annotations.s3 import Client as S3Client from db_schema.postgres import connection from db_schema.schemas import slz from moto import mock_s3 from slz_storage.repository import Repository from dae_apollo_api_scraper.entities import ApiResponse, Config, Payload, Track from dae_apollo_api_scraper.repository import SnapshotRepository from dae_apollo_api_scraper.services import S3Service from dae_apollo_api_scraper.validator import Validator @pytest.fixture(scope='session') def db(): pg = connection.get_session( host=os.environ.get('PG_HOST', '0.0.0.0'), port=os.environ.get('PG_PORT', 5432), db=os.environ.get('PG_DB', 'slz'), user=os.environ.get('PG_USER', 'admin'), password=os.environ.get('PG_PASSWORD', 'admin'), engine_params={'echo': True} ) yield pg @pytest.fixture(scope='function') def clean_db(db): yield for model in [slz.ContentFailureLog, slz.Snapshot, slz.ContentStatus, slz.UnitOfWork]: db.query(model).delete() db.commit() db.close() @pytest.fixture def config_test(): return Config( environment='test', apollo_api_secret_key='apollo_api_secret_key', bucket='bucket', rds_secret_key='rds_secret_key', sentry_secret_key='sentry_secret_key', base_auth_url='base_auth_url', starred_tracks_endpoint='starred_tracks_endpoint', ) @pytest.fixture def payload_test(): return Payload( uow_id='apollo-20210702-sme-stream_milestones_rti-v2', dsp='apollo', report_type='stream_milestones', application='rti', version='v2', report_date='2021-07-02', config_bucket='config_bucket', job_id='test_job' ) @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='testing', ) @pytest.fixture def s3_client(payload_test, config_test): with mock_s3(): buckets = [payload_test.config_bucket, config_test.bucket] s3_client_: S3Client = boto3.client('s3') for bucket in buckets: s3_client_.create_bucket(Bucket=bucket) yield s3_client_ s3_resource = boto3.resource('s3') for bucket in buckets: bucket = s3_resource.Bucket(bucket) bucket.objects.all().delete() bucket.delete() @pytest.fixture def api_responce_test(): return ApiResponse( [ Track(isrc='USSM19902991', artistId='GRAS_4867'), Track(isrc='USSM12001261', artistId='GRAS_1689004'), Track(isrc='USSM11914988', artistId='GRAS_1192524'), ] ) @pytest.fixture def snapshot_repository(db, payload_test): return SnapshotRepository( logger=mock.Mock(), session=db, payload=payload_test, ) @pytest.fixture def slz_repository(db): return Repository( logger=mock.Mock(), connection=db, ) @pytest.fixture def validator(payload_test, s3_client, slz_repository): return Validator( logger=mock.Mock(), config_bucket='config_bucket', payload=payload_test, s3_client=s3_client, slz_pg_repository=slz_repository ) @pytest.fixture def s3_service(s3_client, payload_test, config_test): return S3Service( logger=mock.Mock(), s3_client=s3_client, payload=payload_test, bucket=config_test.bucket ) @pytest.fixture def unit_of_work(db): report = db.query(slz.Report).filter(slz.Report.report_name == 'stream_milestones_rti').one() unit_of_work = slz.UnitOfWork( **{ 'unit_of_work_code': 'apollo-20210702-sme-stream_milestones_rti-v2', 'reprocess_id': '', 'report_date': '2020-07-02', 'report_id': report.report_id, 'licensor_id': 1, 'version': 'v1', 'activity_status': 'NOT_IN_PROGRESS', 'completeness_status': 'ACTIVE', 'next_run_at': '2020-07-07 08:26:09.715337', 'created_at': '2020-07-02 01:00:58.806272', 'last_updated_at': '2020-07-07 08:20:58.481813', 'is_force_complete': False, 'priority': 5 } ) db.add(unit_of_work) db.flush() yield unit_of_work @pytest.fixture def content_status(db, unit_of_work): content_status = slz.ContentStatus( **{ 'unit_of_work_id': unit_of_work.unit_of_work_id, 'context': 'stream_milestones_rti', 'content_status': 'ACTIVE', 'content_name': '26640_1618316450.csv', 'failure_count': 0, 'latest_job_id': 'apollo-20210702-sme-stream_milestones_rti-v2_26640_20210702T20.15.14', 'created_at': '2021-07-02 12:30:17', 'last_checked_at': '2021-07-02 12:30:17', 'metadata_process_status': 'NOT_QUEUED', } ) db.add(content_status) db.flush() yield content_status @pytest.fixture def content_failure_log(db, content_status): content_failure_log = slz.ContentFailureLog( **{ 'unit_of_work_id': content_status.content_status_id, 'job_id': 'some_job_id', 'failure_code': None, 'failure_description': 'failure_description', 'created_at': '2020-07-02 14:07:13.570531' } ) db.add(content_failure_log) db.flush() yield content_failure_log @pytest.fixture def snapshot(db, content_status): snapshot = slz.Snapshot( **{ 'content_status_id': content_status.content_status_id, 'file_name': content_status.content_name, 'hash': '7c00ff0338fcbc78d6a4487fda47c608', 'created_at': '2020-07-02 12:08:04.611202' } ) db.add(snapshot) db.flush() yield snapshot