from datetime import date from typing import Any from unittest import mock import pytest from fansifter_common.legal_info.services import LegalInfoService from jinja2 import Environment from pytest_mock import MockerFixture from app.handlers import SongwhipFanConsentHandler from app.models import Event def test_handler_success( handler: SongwhipFanConsentHandler, email_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, test_event: Any, test_message_id: str, test_message: dict[str, Any], test_email_title_templates: dict[str, str], mocker: MockerFixture, jinja_env: Environment, legal_info_service: LegalInfoService, ) -> None: event = Event.model_validate(test_event) mocker.patch( "app.handlers.SongwhipFanConsentHandler.validate_record", return_value=None ) ows_preference_center_client_mock.encrypt_fan_consent_id.return_value = { "encrypted": "test" } handler.handle(event) test_email_title_template = test_email_title_templates["en"] email_client_mock.send_email.assert_called_with( email_address=test_message["email"], email_title=test_email_title_template.format( artist_name=test_message["artistName"] ), email_content=jinja_env.get_template("email.html").render( email=test_message["email"], privacy_links=handler.prepare_privacy_links( legal_info_service.get_privacy_links(test_message["country"]) ), current_year=date.today().year, legal_name=handler.legal_info_service.get_legal_entity( test_message["country"] ).name, legal_address=handler.legal_info_service.get_legal_entity( test_message["country"] ).address, ), message_id=test_message_id, ) @pytest.mark.parametrize( "wrong_email", [ "malformed_email", "non_resolvable_email@example.com", ], ) def test_handler_fail( handler: SongwhipFanConsentHandler, email_client_mock: mock.MagicMock, test_event: Any, wrong_email: str, ) -> None: event = Event.model_validate(test_event) for _, records in event.records.items(): for record in records: record.message.email = wrong_email handler.handle(event) email_client_mock.send_email.assert_not_called() def test_handler_cache_hit( handler: SongwhipFanConsentHandler, email_client_mock: mock.MagicMock, test_event: Any, mocker: MockerFixture, ) -> None: event = Event.model_validate(test_event) mocker.patch( "app.handlers.SongwhipFanConsentHandler.validate_record", return_value=None ) handler.handle(event) handler.handle(event) email_client_mock.send_email.assert_called_once()