# pylint: disable=protected-access import os from datetime import datetime, timezone from unittest import mock import pytest import smart_open from slz_gdpr_email_downloader.entities import EmailMetadata from slz_gdpr_email_downloader.exceptions import AttachmentNotFoundError from slz_gdpr_email_downloader.services.email_service import EmailService from slz_gdpr_email_downloader.services.s3_repo import S3Repository from . import FIXTURES_PATH def create_email_file(s3_client, config_test, fixture_name): with smart_open.open(os.path.join(FIXTURES_PATH, fixture_name)) as file_: email_content = file_.read() s3_client.put_object( Body=email_content, Bucket=config_test.bucket_source, Key=f'appreciationengine/request_to_forget/{fixture_name}', ) def test_get_attachment_ok(config_test, payload_test, s3_client): s3_repo = S3Repository( logger=mock.Mock(), config=config_test, payload=payload_test, s3_client=s3_client, ) service = EmailService( logger=mock.Mock(), config=config_test, payload=payload_test, s3_repo=s3_repo, ) create_email_file(s3_client, config_test, '08fbkert') email_message = service.get_email('08fbkert') result = service.get_email_attachment(email_message) expected = b'Email_Address\r\n"test1@gmail.com"\r\n"test2@gmail.com"' assert result == expected def test_get_attachment_raise_exc(config_test, payload_test, s3_client): s3_repo = S3Repository( logger=mock.Mock(), config=config_test, payload=payload_test, s3_client=s3_client, ) service = EmailService( logger=mock.Mock(), config=config_test, payload=payload_test, s3_repo=s3_repo, ) create_email_file(s3_client, config_test, '08fbkert_no_attach') email_message = service.get_email('08fbkert_no_attach') with pytest.raises(AttachmentNotFoundError): service.get_email_attachment(email_message) @pytest.mark.parametrize('filenames', [(['08fbkert0', '08fbkert1', '08fbkert2']), ([])]) def test_scan_bucket_for_email(config_test, payload_test, s3_client, filenames): for fname in filenames: s3_client.put_object( Body='email_content', Bucket=config_test.bucket_source, Key=f'appreciationengine/request_to_forget/{fname}', ) # test file in another folder s3_client.put_object( Body='email_content', Bucket=config_test.bucket_source, Key='appreciationengine/123/bla', ) s3_repo = S3Repository( logger=mock.Mock(), config=config_test, payload=payload_test, s3_client=s3_client, ) service = EmailService( logger=mock.Mock(), config=config_test, payload=payload_test, s3_repo=s3_repo, ) result = service.scan_source_bucket_for_emails() assert result == filenames def test_get_email_metadata(config_test, payload_test, s3_client): s3_repo = S3Repository( logger=mock.Mock(), config=config_test, payload=payload_test, s3_client=s3_client, ) service = EmailService( logger=mock.Mock(), config=config_test, payload=payload_test, s3_repo=s3_repo, ) create_email_file(s3_client, config_test, '08fbkert') email_message = service.get_email('08fbkert') result = service.get_email_metadata(email_message) expected = EmailMetadata( md_message_id='495b840373fb42499a4593b38de4f71c@dataart.com', md_subject='Sony Music Fan Delete Request - AE - 1/1/2021', md_from=['test@gmail.com'], md_to=['test@mail-npe.delphiplatform.io'], md_cc=[], md_references=[], sent_at=datetime(2021, 4, 6, 13, 23, 20, tzinfo=timezone.utc) ) assert result == expected def test_get_email_metadata_several_receivers(config_test, payload_test, s3_client): s3_repo = S3Repository( logger=mock.Mock(), config=config_test, payload=payload_test, s3_client=s3_client, ) service = EmailService( logger=mock.Mock(), config=config_test, payload=payload_test, s3_repo=s3_repo, ) create_email_file(s3_client, config_test, '08fbkert_1') email_message = service.get_email('08fbkert_1') result = service.get_email_metadata(email_message) expected = EmailMetadata( md_message_id='Sips1QU6EOI00FBLj_jvHQ_6pDyfRixGFbA@sfdc.net', 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=['AM0PR0.eurprd02.prod.outlook.com', 'cced57efdf5a4ced@dataart.com'], sent_at=datetime(2021, 6, 4, 12, 0, 19, tzinfo=timezone.utc) ) assert result == expected