# pylint: disable=protected-access,unused-argument import json import os from unittest import mock import pytest import smart_open from botocore.exceptions import ClientError from db_schema.schemas.slz import Email from slz_storage.repository import Repository from slz_gdpr_email_sender.services.pg import PGService from slz_gdpr_email_sender.services.ses import SESService from . import FIXTURES_PATH from .stubs import content_status_stub, email_stub, unit_of_work_stub @pytest.mark.integration def test_service_success_message(test_config, s3_client, ses_client, db, clean_db): uow = unit_of_work_stub(db) content_status = content_status_stub(uow) email = email_stub(content_status) db.add_all([uow, content_status, email]) db.commit() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock()) pg_service._repository = Repository(mock.Mock(), db) with smart_open.open(os.path.join(FIXTURES_PATH, 'report.csv')) as file_: report = file_.read() s3_client.put_object( Body=report, Bucket='bucket-decompressed', Key='request_to_forget/report.csv', ) with smart_open.open(os.path.join(FIXTURES_PATH, 'event_s3.json')) as file_: event = json.loads(file_.read()) logger = mock.Mock() service = SESService(logger, ses_client, pg_service) result = service.send( event=event, sender=test_config.sender, ) assert result is True assert pg_service._repository.connection.query(Email).filter( Email.parent_md_message_id == email.md_message_id ).count() == 1 @pytest.mark.integration @pytest.mark.parametrize( 'context, expected_letters_send', [ ('vi43rcvh6e0svna3', 1), # cs the same as in error msg ('vi43rcvh6e0svna3111', 0) ] ) def test_service_failure_message( context, expected_letters_send, test_config, ses_client, db, clean_db ): uow = unit_of_work_stub(db) content_status = content_status_stub(uow) content_status.context = context email = email_stub(content_status) db.add_all([uow, content_status, email]) db.commit() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock()) pg_service._repository = Repository(mock.Mock(), db) with smart_open.open(os.path.join(FIXTURES_PATH, 'event_sns.json')) as file_: event = json.loads(file_.read()) logger = mock.Mock() service = SESService(logger, ses_client, pg_service) result = service.send(event=event, sender=test_config.sender) assert result is True assert pg_service._repository.connection.query(Email).filter( Email.parent_md_message_id == email.md_message_id ).count() == expected_letters_send @pytest.mark.integration def test_service_send_from_unverified_email_should_fail(test_config, ses_client, db, clean_db): uow = unit_of_work_stub(db) content_status = content_status_stub(uow) email = email_stub(content_status) db.add_all([uow, content_status, email]) db.commit() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock()) pg_service._repository = Repository(mock.Mock(), db) with smart_open.open(os.path.join(FIXTURES_PATH, 'event_sns.json')) as file_: event = json.loads(file_.read()) logger = mock.Mock() service = SESService(logger, ses_client, pg_service) with pytest.raises(ClientError): service.send(event=event, sender='unknown@gmail.com') def test_service_send_should_fail(test_config, ses_client): repo = mock.Mock() pg_service = PGService(logger=mock.Mock(), repository_loader=mock.Mock()) pg_service._repository = repo repo.get_unprocessed_emails.side_effect = Exception with smart_open.open(os.path.join(FIXTURES_PATH, 'event_sns.json')) as file_: event = json.loads(file_.read()) logger = mock.Mock() service = SESService(logger, ses_client, pg_service) with pytest.raises(Exception): service.send(event=event, sender='unknown@gmail.com')