import pytest from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.reporting.exceptions import EmailReportingReportNotFoundError from email_campaigns.reporting.handlers import ( UpdateEmailReportingReportHandler, UpdateEmailReportingReportRequest, ) from email_campaigns.reporting.models import EmailReportingReport from tests.unit.types import CreateModel class TestUpdateEmailReportingReportHandler: @pytest.mark.db def test_update_report( self, handler: UpdateEmailReportingReportHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model(EmailCampaign, name="Test Campaign", vendor_id=1) report = create_model( EmailReportingReport, identity_id=identity_id, name="Old Name", ) result = handler.handle( UpdateEmailReportingReportRequest( identity_id=identity_id, report_id=report.id, name="New Name", email_ids=[campaign.id], ) ) assert result.name == "New Name" assert result.email_ids == [campaign.id] @pytest.mark.db def test_update_report_not_found( self, handler: UpdateEmailReportingReportHandler, identity_id: str, ) -> None: with pytest.raises(EmailReportingReportNotFoundError): handler.handle( UpdateEmailReportingReportRequest( identity_id=identity_id, report_id="non-existent-id", name="New Name", email_ids=[], ) ) @pytest.mark.db def test_update_report_email_not_matching_filter( self, handler: UpdateEmailReportingReportHandler, create_model: CreateModel, identity_id: str, ) -> None: report = create_model( EmailReportingReport, identity_id=identity_id, name="Test Report", ) result = handler.handle( UpdateEmailReportingReportRequest( identity_id=identity_id, report_id=report.id, name="New Name", email_ids=["non-existent-email-id"], ) ) assert result.email_ids == [] @pytest.mark.db def test_update_report_filters_by_global_participant_id( self, handler: UpdateEmailReportingReportHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model( EmailCampaign, name="Matching Campaign", vendor_id=1, global_participant_id="artist-1", ) create_model( EmailCampaign, name="Other Campaign", vendor_id=1, global_participant_id="artist-2", ) report = create_model( EmailReportingReport, identity_id=identity_id, name="Test Report", ) result = handler.handle( UpdateEmailReportingReportRequest( identity_id=identity_id, report_id=report.id, name="New Name", global_participant_id="artist-1", ) ) assert result.email_ids == [campaign.id] @pytest.mark.db def test_update_report_filters_by_vendor_id( self, handler: UpdateEmailReportingReportHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model(EmailCampaign, name="Test Campaign", vendor_id=1) create_model(EmailCampaign, name="Other Vendor Campaign", vendor_id=2) report = create_model( EmailReportingReport, identity_id=identity_id, name="Test Report", ) result = handler.handle( UpdateEmailReportingReportRequest( identity_id=identity_id, report_id=report.id, name="New Name", vendor_id=1, ) ) assert result.email_ids == [campaign.id]