# pylint: disable=protected-access,unused-argument from datetime import datetime, timezone from typing import List from unittest import mock import pytest from db_schema.schemas import slz from db_schema.schemas.slz import Email from slz_storage.repository import Repository from slz_gdpr_email_downloader.entities import EmailMetadata from slz_gdpr_email_downloader.services.pg import PGService from .stubs import content_status_stub, unit_of_work_stub @pytest.mark.integration def test_cs_filter_out_already_processed(db_connection, db, clean_db, payload_test): content_statuses_old = ['vi43rcvh_old1', 'vi43rcvh_old2'] content_statuses_to_process = [ 'vi43rcvh_old1', 'vi43rcvh_new1', 'vi43rcvh_new2', 'vi43rcvh_new_cancelled' ] uow_old = unit_of_work_stub(db) uow_current = unit_of_work_stub(db) uow_current.unit_of_work_code = payload_test.uow_id uow_current.report_date = payload_test.report_date cs_old1 = content_status_stub(uow_old) cs_old1.context = content_statuses_old[0] cs_old2 = content_status_stub(uow_old) cs_old2.context = content_statuses_old[1] cs_new1 = content_status_stub(uow_current) cs_new1.context = content_statuses_to_process[1] cs_new2 = content_status_stub(uow_current) cs_new2.context = content_statuses_to_process[2] # CS connected to current UOW but it was already processed, failure message sent cs_new3 = content_status_stub(uow_current) cs_new3.context = content_statuses_to_process[3] cs_new3.content_status = slz.ContentStatusEnum.CANCELLED db.add_all([uow_old, uow_current, cs_old1, cs_old2, cs_new1, cs_new2, cs_new3]) db.flush() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock(), payload=payload_test) pg_service._repository = Repository(mock.Mock(), db_connection) result = pg_service.cs_filter_out_already_processed(content_statuses_to_process) assert sorted(result) == ['vi43rcvh_new1', 'vi43rcvh_new2'] @pytest.mark.integration def test_cs_filter_out_already_processed_all_processed(db_connection, db, clean_db, payload_test): content_statuses_old = ['vi43rcvh_old1', 'vi43rcvh_old2'] uow_old = unit_of_work_stub(db) uow_current = unit_of_work_stub(db) uow_current.unit_of_work_code = payload_test.uow_id uow_current.report_date = payload_test.report_date cs_old1 = content_status_stub(uow_old) cs_old1.context = content_statuses_old[0] cs_old2 = content_status_stub(uow_old) cs_old2.context = content_statuses_old[1] db.add_all([uow_old, uow_current, cs_old1, cs_old2]) db.flush() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock(), payload=payload_test) pg_service._repository = Repository(mock.Mock(), db_connection) result = pg_service.cs_filter_out_already_processed(content_statuses_old) assert result == [] @pytest.mark.parametrize('cs_name,expected', [ ('test', True), ('unknown', False), ]) @pytest.mark.integration def test_cs_cs_save_cancelled(cs_name, expected, db_connection, db, clean_db, payload_test): uow_current = unit_of_work_stub(db) uow_current.unit_of_work_code = payload_test.uow_id uow_current.report_date = payload_test.report_date cs_current = content_status_stub(uow_current) cs_current.context = 'test' db.add_all([uow_current, cs_current]) db.flush() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock(), payload=payload_test) pg_service._repository = Repository(mock.Mock(), db_connection) result = pg_service.cs_save_cancelled(cs_name, 'error', 'error') assert result == expected @pytest.mark.integration @pytest.mark.parametrize( 'md_references, expected_md_references', [ ([], []), (['12', '12'], ['12', '12']), (['1', '2', '3', '4', '5', '6', '7', '8', '9'], ['1', '2', '3', '4', '5', '6', '7', '8']), ] ) def test_create_email( md_references, expected_md_references, db_connection, db, clean_db, payload_test ): uow = unit_of_work_stub(db) uow.unit_of_work_code = payload_test.uow_id uow.report_date = payload_test.report_date content_status = content_status_stub(uow) db.add_all([uow, content_status]) db.commit() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock(), payload=payload_test) pg_service._repository = Repository(mock.Mock(), db_connection) email_metadata = EmailMetadata( md_message_id='', md_subject='Sony Music Fan Delete Request - Delphi - 6/4/2021', md_from=['sfbackendcrm@sonymusic.com'], md_to=[ 'dev-delphi.incoming@mail-npe.delphiplatform.io', 'qa-delphi.incoming@mail-npe.delphiplatform.io', 'stage-delphi.incoming@mail-npe.delphiplatform.io', 'delphi.incoming@mail.delphiplatform.io', ], md_cc=['crm.support@sonymusic.com'], md_references=md_references, sent_at=datetime(2021, 6, 4, 12, 0, 19, tzinfo=timezone.utc) ) assert pg_service.repository.connection.query(Email).count() == 0 result = pg_service.create_email(content_status.context, email_metadata) assert result is True records: List[Email] = pg_service.repository.connection.query(Email).all() assert len(records) == 1 assert records[0].md_message_id == email_metadata.md_message_id assert records[0].md_subject == email_metadata.md_subject assert records[0].md_to == email_metadata.md_to assert records[0].md_references == expected_md_references result = pg_service.create_email(content_status.context, email_metadata) assert result is False assert len(records) == 1