from unittest import mock import pytest from faker import Faker from fansifter_common.auth.exceptions import PermissionDenied from fansifter_common.constants import PROD_ENVIRONMENT from email_campaigns.automated.handlers import ( GenerateAutomatedEmailPublicPreviewUrlHandler, ) from email_campaigns.automated.models import AutomatedEmail from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.handlers import GenerateEmailPublicPreviewUrlRequest from tests.unit.helpers import override_settings from tests.unit.types import CreateModel class TestGenerateAutomatedEmailPublicPreviewUrlHandler: @pytest.mark.db def test_generate_automated_email_public_preview_url_dev_environment( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, create_model: CreateModel, identity_id: str, faker: Faker, tokens_mock: mock.MagicMock, ) -> None: email = create_model(AutomatedEmail) expected_token = faker.uuid4() requested_domain = "theorchard.com" tokens_mock.encrypt_email_id.return_value = expected_token response = handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email.id, domain=requested_domain, ) ) expected_url = ( f"https://fansifter-emails.qapdesuite.com" f"/automated-emails-public-preview/{email.id}?pwd={expected_token}" ) assert response.url == expected_url @pytest.mark.db def test_generate_automated_email_public_preview_url_unauthorized( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, create_model: CreateModel, identity_id: str, auth_service_mock: mock.MagicMock, ) -> None: email = create_model(AutomatedEmail) domain = "fansifter.theorchard.com" auth_service_mock.authorize_account.side_effect = PermissionDenied() with pytest.raises(PermissionDenied): handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email.id, domain=domain, ) ) @pytest.mark.db def test_generate_automated_email_public_preview_url_email_not_found( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, identity_id: str, faker: Faker, ) -> None: email_id = faker.uuid4() domain = "fansifter.theorchard.com" with pytest.raises(EmailNotFoundError): handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email_id, domain=domain, ) ) @pytest.mark.db def test_generate_automated_email_public_preview_url_token_parameters( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, create_model: CreateModel, identity_id: str, faker: Faker, tokens_mock: mock.MagicMock, ) -> None: email = create_model(AutomatedEmail) expected_token = faker.uuid4() domain = "theorchard.com" tokens_mock.encrypt_email_id.return_value = expected_token handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email.id, domain=domain, ) ) tokens_mock.encrypt_email_id.assert_called_once_with(email.id) @pytest.mark.db def test_generate_automated_email_public_preview_url_prod_valid_domain( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, create_model: CreateModel, identity_id: str, faker: Faker, tokens_mock: mock.MagicMock, ) -> None: email = create_model(AutomatedEmail) expected_token = faker.uuid4() requested_domain = "theorchard.com" tokens_mock.encrypt_email_id.return_value = expected_token with override_settings( environment=PROD_ENVIRONMENT, email_public_preview_available_domains=["theorchard.com", "awal.com"], ): response = handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email.id, domain=requested_domain, ) ) expected_url = ( f"https://fansifter-emails.theorchard.com" f"/automated-emails-public-preview/{email.id}?pwd={expected_token}" ) assert response.url == expected_url @pytest.mark.db def test_generate_automated_email_public_preview_url_prod_invalid_domain_fallback( self, handler: GenerateAutomatedEmailPublicPreviewUrlHandler, create_model: CreateModel, identity_id: str, faker: Faker, tokens_mock: mock.MagicMock, ) -> None: email = create_model(AutomatedEmail) expected_token = faker.uuid4() invalid_domain = "invalid.com" tokens_mock.encrypt_email_id.return_value = expected_token with override_settings( environment=PROD_ENVIRONMENT, email_public_preview_available_domains=["theorchard.com", "awal.com"], ): response = handler.handle( GenerateEmailPublicPreviewUrlRequest( identity_id=identity_id, email_id=email.id, domain=invalid_domain, ) ) expected_url = ( f"https://fansifter-emails.theorchard.com" f"/automated-emails-public-preview/{email.id}?pwd={expected_token}" ) assert response.url == expected_url