import datetime import pytest from dirty_equals import IsApprox from fansifter_common.utils import timezone from dmp.audiences.enums import AudienceExportStatus from dmp.audiences.models import AudienceShare, AudienceSnapshot from dmp.meta.exceptions import MetaAudienceNotFoundError from dmp.meta.handlers import ( GetMetaAudienceShareStatusHandler, GetMetaAudienceShareStatusRequest, GetMetaAudienceShareStatusResponse, ) from dmp.meta.models import MetaAudience from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestGetMetaAudienceShareStatusHandler: @pytest.mark.db def test_get_audience_share_status_processing( self, handler: GetMetaAudienceShareStatusHandler, create_model: CreateModel, identity_id: str, ) -> None: snapshot = create_model(AudienceSnapshot, fan_count=200) share = create_model( AudienceShare, snapshot=snapshot, processed_fans=50, status=AudienceExportStatus.PROCESSING, created_at=timezone.now() - datetime.timedelta(seconds=30), ) meta_audience = create_model(MetaAudience, share=share) response = handler.handle( GetMetaAudienceShareStatusRequest( identity_id=identity_id, meta_audience_id=meta_audience.id, ) ) assert response == GetMetaAudienceShareStatusResponse( audience_id=meta_audience.id, audience_name=meta_audience.name, ad_account_name=meta_audience.ad_account.name or "", status=share.status, fans_count=share.fans_count, processed_fans=share.processed_fans, progress=0.25, seconds_remaining=IsApprox(90, delta=5), # type: ignore url=meta_audience.url, ) @pytest.mark.db def test_get_audience_share_status_pending( self, handler: GetMetaAudienceShareStatusHandler, create_model: CreateModel, identity_id: str, ) -> None: snapshot = create_model(AudienceSnapshot, fan_count=100) share = create_model( AudienceShare, snapshot=snapshot, processed_fans=50, status=AudienceExportStatus.PENDING, ) meta_audience = create_model(MetaAudience, share=share) response = handler.handle( GetMetaAudienceShareStatusRequest( identity_id=identity_id, meta_audience_id=meta_audience.id, ) ) assert response == GetMetaAudienceShareStatusResponse( audience_id=meta_audience.id, audience_name=meta_audience.name, ad_account_name=meta_audience.ad_account.name or "", status=share.status, fans_count=share.fans_count, processed_fans=share.processed_fans, progress=0.0, seconds_remaining=None, url=meta_audience.url, ) @pytest.mark.db def test_get_audience_share_status_completed( self, handler: GetMetaAudienceShareStatusHandler, create_model: CreateModel, identity_id: str, ) -> None: snapshot = create_model(AudienceSnapshot, fan_count=100) share = create_model( AudienceShare, snapshot=snapshot, processed_fans=50, status=AudienceExportStatus.COMPLETED, ) meta_audience = create_model(MetaAudience, share=share) response = handler.handle( GetMetaAudienceShareStatusRequest( identity_id=identity_id, meta_audience_id=meta_audience.id, ) ) assert response == GetMetaAudienceShareStatusResponse( audience_id=meta_audience.id, audience_name=meta_audience.name, ad_account_name=meta_audience.ad_account.name or "", status=share.status, fans_count=share.fans_count, processed_fans=share.processed_fans, progress=1.0, seconds_remaining=0, url=meta_audience.url, ) @pytest.mark.db def test_get_audience_share_status_does_not_exist( self, handler: GetMetaAudienceShareStatusHandler, identity_id: str, fake: FakerTyped, ) -> None: with pytest.raises(MetaAudienceNotFoundError): handler.handle( GetMetaAudienceShareStatusRequest( identity_id=identity_id, meta_audience_id=fake.uuid4_string(), ) )