# pylint: disable=redefined-outer-name import os from datetime import datetime, timezone from time import sleep from unittest 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 sqlalchemy import null from slz_ddex_housekeeping.entities import LambdaConfig from slz_ddex_housekeeping.services.db import DBService from slz_ddex_housekeeping.services.housekeeping import HousekeepingService @pytest.fixture(scope='session') 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='housekeeping_test', version='v1') 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 @pytest.fixture(scope='function') def clean_db(db): yield for model in [slz.ContentStatus, slz.UnitOfWork]: db.session.query(model).delete() db.session.commit() db.session.close() @pytest.fixture def config_test(): return LambdaConfig( environment='test', rds_secrets_key='rds_secrets_key', feed_bucket='feed_bucket', completed_housekeeping_threshold=24, failed_housekeeping_threshold=48, sentry_secret_key='sentry_secret_key', ) @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(config_test): with mock_s3(): s3_client_: S3Client = boto3.client('s3') s3_client_.create_bucket(Bucket=config_test.feed_bucket) yield s3_client_ s3_resource = boto3.resource('s3') bucket = s3_resource.Bucket(config_test.feed_bucket) bucket.objects.all().delete() bucket.delete() @pytest.fixture def uploaded_releases(s3_client, config_test): keys = [ 'A10301A0000935334X_20201116181657943/A10301A0000935334X.xml', 'A10301A0001138785R_20201116181529203/A10301A0001138785R.xml', 'A10301A0001267574Q_20201116181542913/A10301A0001267574Q.xml', 'acknowledgements/ACK_A10301A0002749316D_20211007143423501.xml', 'acknowledgements_test/ACK_A10301A0003542592J_20211006141053795.xml' ] content = 'xml_content' for key in keys: s3_client.put_object(Bucket=config_test.feed_bucket, Key=key, Body=content) @pytest.fixture(scope='function') def now(): return datetime(2021, 10, 30, 4, 14, 14, tzinfo=timezone.utc) @pytest.fixture def db_service(db): return DBService(logger=mock.Mock(), db_conn=db) @pytest.fixture def housekeeping_service(config_test, db_service): return HousekeepingService( logger=mock.Mock(), config=config_test, db_service=db_service, s3_resource=boto3.resource('s3'), ) @pytest.fixture def unit_of_work(db): unit_of_work = slz.UnitOfWork( **{ 'unit_of_work_code': 'ddex-20211027-sme-release_message-v1', 'reprocess_id': '', 'report_date': datetime(2021, 10, 27), 'report_id': 1, 'licensor_id': 1, 'version': 'v1', 'activity_status': 'NOT_IN_PROGRESS', 'completeness_status': 'ACTIVE', 'next_run_at': '2020-10-27 01:06:09.715337', 'created_at': '2020-10-027 01:00:58.806272', 'last_updated_at': '2020-10-27 08:20:58.481813', 'is_force_complete': False, 'priority': 5 } ) db.session.add(unit_of_work) db.session.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': 'A10301A0000935334X_20201116181657943', 'content_status': 'COMPLETE', 'content_name': 'ACK_A10301A00042689714_20210514115608363.xml', 'failure_count': 0, 'latest_job_id': 'ddex-20211027-sme-release_message-v1_26640_20210428T12.14.07', 'created_at': '2021-10-25 12:30:17', 'completed_at': '2021-10-24 12:30:17', 'last_checked_at': '2021-10-27 12:30:17', 'metadata_process_status': 'NOT_QUEUED', 'meta_data': null() } ) db.session.add(content_status) db.session.flush() yield content_status