# pylint: disable=protected-access, unused-argument, too-many-arguments import json from unittest import mock import boto3 import pytest from db_schema.schemas import slz from sqlalchemy import null from slz_ddex_housekeeping.const import SLZ_DDEX_REPORT_NAME from slz_ddex_housekeeping.services.housekeeping import HousekeepingService @pytest.mark.integration def test__delete_s3_folder(s3_client, config_test, housekeeping_service, uploaded_releases): release_title = 'A10301A0000935334X_20201116181657943' responce = s3_client.list_objects_v2(Bucket=config_test.feed_bucket, Prefix=release_title) assert responce.get('Contents') bucket = housekeeping_service._s3_resource.Bucket(config_test.feed_bucket) housekeeping_service._delete_s3_folder(bucket, release_title) responce = s3_client.list_objects_v2(Bucket=config_test.feed_bucket, Prefix=release_title) assert not responce.get('Contents') @pytest.mark.parametrize( 'completed_housekeeping_threshold, failed_housekeeping_threshold, releases_to_delete_count', [ (24, 48, 2), (0, 0, 2), (24, -1, 1), (-1, 48, 1), (-1, -1, 0), ] ) @pytest.mark.integration def test__get_releases_to_delete_by_housekeeping_thresholds( db, db_service, now, uploaded_releases, config_test, unit_of_work, clean_db, completed_housekeeping_threshold, failed_housekeeping_threshold, releases_to_delete_count ): report_id = db_service.get_report_id_by_name(report_name=SLZ_DDEX_REPORT_NAME) config_test.completed_housekeeping_threshold = completed_housekeeping_threshold config_test.failed_housekeeping_threshold = failed_housekeeping_threshold housekeeping_service = HousekeepingService( logger=mock.Mock(), config=config_test, db_service=db_service, s3_resource=boto3.resource('s3'), ) assert len(housekeeping_service._get_releases_to_delete(report_id, now)) == 0 unit_of_work.report_id = report_id db.session.flush() slz_cs_data = { 'unit_of_work_id': unit_of_work.unit_of_work_id, 'context': 'A10301A0000935334X_20201116181657943', 'content_status': 'COMPLETE', 'content_name': '', 'failure_count': 0, 'latest_job_id': 'ddex-20211027-sme-release_message-v1_26640_20210428T12.14.07', 'created_at': '2021-10-23 12:30:17', 'completed_at': '2021-10-24 12:30:17', 'last_checked_at': '2021-10-24 12:30:17', 'metadata_process_status': 'NOT_QUEUED', 'meta_data': null() } db.session.add(slz.ContentStatus(**slz_cs_data)) slz_cs_data.update({ 'context': 'A10301A00007845431_20201116181637977', 'content_status': 'FAILED', 'failure_count': 3 }) db.session.add(slz.ContentStatus(**slz_cs_data)) assert len( housekeeping_service._get_releases_to_delete(report_id, now) ) == releases_to_delete_count @pytest.mark.integration def test__get_releases_to_delete_by_meta_data_value( db, db_service, now, uploaded_releases, housekeeping_service, unit_of_work, content_status, clean_db ): report_id = db_service.get_report_id_by_name(report_name=SLZ_DDEX_REPORT_NAME) assert len(housekeeping_service._get_releases_to_delete(report_id, now)) == 0 unit_of_work.report_id = report_id db.session.flush() assert len(housekeeping_service._get_releases_to_delete(report_id, now)) == 1 content_status.meta_data = json.dumps({'meta_data': {}}) db.session.flush() assert len(housekeeping_service._get_releases_to_delete(report_id, now)) == 0