import pytest from email_campaigns.automated.exceptions import ( InvalidSourceCampaignIdError, SourceCampaignNotAttachedError, ) from email_campaigns.automated.handlers import ( DetachSourceCampaignsHandler, DetachSourceCampaignsRequest, ) from email_campaigns.automated.models import ( AutomatedEmail, AutomatedEmailTrigger, SourceCampaign, ) from tests.unit.types import CreateModel class TestDetachSourceCampaignsHandler: @pytest.mark.db def test_detach_source_campaigns( self, handler: DetachSourceCampaignsHandler, create_model: CreateModel, identity_id: str, ) -> None: source_campaign_1 = create_model(SourceCampaign) source_campaign_2 = create_model(SourceCampaign) source_campaign_3 = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign_1.id), AutomatedEmailTrigger(source_campaign_id=source_campaign_2.id), AutomatedEmailTrigger(source_campaign_id=source_campaign_3.id), ], ) handler.handle( DetachSourceCampaignsRequest( identity_id=identity_id, email_id=automated_email.id, source_campaign_ids=[source_campaign_1.id, source_campaign_2.id], ) ) assert len(automated_email.source_campaign_connections) == 1 assert ( automated_email.source_campaign_connections[0].source_campaign_id == source_campaign_3.id ) @pytest.mark.db def test_detach_not_attached_source_campaign( self, handler: DetachSourceCampaignsHandler, create_model: CreateModel, identity_id: str, ) -> None: source_campaign_attached = create_model(SourceCampaign) source_campaign_not_attached = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign_attached.id), ], ) with pytest.raises(SourceCampaignNotAttachedError): handler.handle( DetachSourceCampaignsRequest( identity_id=identity_id, email_id=automated_email.id, source_campaign_ids=[source_campaign_not_attached.id], ) ) @pytest.mark.db def test_detach_with_invalid_source_campaign_id( self, handler: DetachSourceCampaignsHandler, create_model: CreateModel, identity_id: str, faker, ) -> None: source_campaign = create_model(SourceCampaign) automated_email = create_model( AutomatedEmail, source_campaign_connections=[ AutomatedEmailTrigger(source_campaign_id=source_campaign.id), ], ) with pytest.raises(InvalidSourceCampaignIdError): handler.handle( DetachSourceCampaignsRequest( identity_id=identity_id, email_id=automated_email.id, source_campaign_ids=[faker.uuid4()], ) )