from unittest import mock import pytest from fansifter_common.adapters.stripo.exceptions import StripoClientError from app.exceptions import EmailSendError from app.handler import _build_email_send from app.models import AutomatedEmail, Domain from tests.unit.helpers import create_model @pytest.mark.db def test_uses_compressed_content_when_present( stripo_client_mock: mock.MagicMock, ows_account_client_mock: mock.MagicMock, ) -> None: domain = create_model(Domain) automated_email = create_model( AutomatedEmail, domain_id=domain.id, compressed_content="", ) ows_account_client_mock.get_vendor.return_value = mock.MagicMock( vendor_id=1, name="vendor", brand="SME" ) result = _build_email_send( automated_email_id=automated_email.id, automated_email_trigger_id="trig-1", confirmation_id=None, ) assert result.html_content == "" stripo_client_mock.compress.assert_not_called() @pytest.mark.db def test_falls_back_to_compress_when_compressed_is_null( stripo_client_mock: mock.MagicMock, ows_account_client_mock: mock.MagicMock, ) -> None: domain = create_model(Domain) automated_email = create_model( AutomatedEmail, domain_id=domain.id, compressed_content=None, html_content="", css_content="p{}", ) ows_account_client_mock.get_vendor.return_value = mock.MagicMock( vendor_id=1, name="vendor", brand="SME" ) stripo_client_mock.compress.return_value = "" result = _build_email_send( automated_email_id=automated_email.id, automated_email_trigger_id="trig-1", confirmation_id=None, ) assert result.html_content == "" stripo_client_mock.compress.assert_called_once_with(html="", css="p{}") @pytest.mark.db def test_raises_when_stripo_fallback_fails( stripo_client_mock: mock.MagicMock, ) -> None: domain = create_model(Domain) automated_email = create_model( AutomatedEmail, domain_id=domain.id, compressed_content=None ) stripo_client_mock.compress.side_effect = StripoClientError("boom") with pytest.raises(EmailSendError) as exc_info: _build_email_send( automated_email_id=automated_email.id, automated_email_trigger_id="trig-1", confirmation_id=None, ) assert isinstance(exc_info.value.__cause__, StripoClientError) assert "Failed to compress" in str(exc_info.value) @pytest.mark.db def test_raises_when_css_missing() -> None: domain = create_model(Domain) automated_email = create_model( AutomatedEmail, domain_id=domain.id, compressed_content=None, css_content=None, ) with pytest.raises(EmailSendError, match="Email content is missing."): _build_email_send( automated_email_id=automated_email.id, automated_email_trigger_id="trig-1", confirmation_id=None, )