import pytest from fansifter_common.auth.exceptions import PermissionDenied from dmp.adapters.features import AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE from dmp.audiences.enums import ( AudienceExportFormat, AudienceExportJustification, AudienceExportReason, AudienceExportStatus, ) from dmp.audiences.exceptions import EmptyAudienceError from dmp.audiences.handlers import ExportAudienceHandler, ExportAudienceRequest from dmp.audiences.models import Audience, AudienceSnapshot from tests.unit.types import CreateModel, EnableFeatures class TestExportAudienceHandler: @pytest.mark.db def test_export_audience( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, enable_features: EnableFeatures, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER reason_notes = "test" audience_name = "test" audience = create_model(Audience, name=audience_name) snapshot = create_model( AudienceSnapshot, audience=audience, fan_count=100, ) with enable_features([AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE]): export = handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=snapshot.audience_id, reason=reason, reason_notes=reason_notes, justification=justification, ) ) assert export.audience.id == snapshot.audience_id assert export.snapshot.id == snapshot.id assert export.zip_key is None assert export.format == AudienceExportFormat.CSV assert export.status == AudienceExportStatus.PENDING assert export.reason == reason assert export.reason_notes == reason_notes assert export.created_by == identity_id @pytest.mark.db def test_export_audience_without_snapshot( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, enable_features: EnableFeatures, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER reason_notes = "test" audience = create_model(Audience) with pytest.raises(EmptyAudienceError): with enable_features([AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE]): handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=audience.id, reason=reason, justification=justification, reason_notes=reason_notes, ) ) @pytest.mark.db def test_export_audience_with_zero_fans( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, enable_features: EnableFeatures, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER reason_notes = "test" snapshot = create_model(AudienceSnapshot, fan_count=0) with pytest.raises(EmptyAudienceError): with enable_features([AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE]): handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=snapshot.audience_id, reason=reason, justification=justification, reason_notes=reason_notes, ) ) @pytest.mark.db def test_export_audience_with_long_name( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, enable_features: EnableFeatures, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER audience_name = "test" * 100 audience = create_model(Audience, name=audience_name) snapshot = create_model(AudienceSnapshot, audience=audience, fan_count=100) with enable_features([AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE]): export = handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=snapshot.audience_id, reason=reason, reason_notes=None, justification=justification, ) ) assert export.snapshot.id == snapshot.id assert len(export.key) <= 255 @pytest.mark.db def test_export_audience_key_includes_service_name( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, enable_features: EnableFeatures, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER snapshot = create_model(AudienceSnapshot, fan_count=100) with enable_features([AUDIENCE_ALLOW_AUDIENCE_EXPORT_TO_FILE]): export = handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=snapshot.audience_id, reason=reason, reason_notes=None, justification=justification, ) ) assert export.snapshot.id == snapshot.id assert reason.service_name in export.key @pytest.mark.db def test_export_audience_without_feature_flag_raises_error( self, handler: ExportAudienceHandler, create_model: CreateModel, identity_id: str, ) -> None: reason = AudienceExportReason.ADS_META justification = AudienceExportJustification.OTHER snapshot = create_model(AudienceSnapshot, fan_count=100) with pytest.raises(PermissionDenied): handler.handle( ExportAudienceRequest( identity_id=identity_id, audience_id=snapshot.audience_id, reason=reason, reason_notes=None, justification=justification, ) )