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.google.exceptions import GoogleAudienceNotFoundError from dmp.google.handlers import ( GetGoogleAudienceShareStatusHandler, GetGoogleAudienceShareStatusRequest, GetGoogleAudienceShareStatusResponse, ) from dmp.google.models import GoogleAdAccount, GoogleAudience from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestGetGoogleAudienceShareStatusHandler: @pytest.mark.db def test_get_audience_share_status_processing( self, handler: GetGoogleAudienceShareStatusHandler, 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), ) google_audience = create_model(GoogleAudience, share=share) response = handler.handle( GetGoogleAudienceShareStatusRequest( identity_id=identity_id, google_audience_id=google_audience.id, ) ) assert response == GetGoogleAudienceShareStatusResponse( audience_id=google_audience.id, audience_name=google_audience.name, ad_account_name=google_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=google_audience.url, ) @pytest.mark.db def test_get_audience_share_status_pending( self, handler: GetGoogleAudienceShareStatusHandler, 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, ) google_audience = create_model(GoogleAudience, share=share) response = handler.handle( GetGoogleAudienceShareStatusRequest( identity_id=identity_id, google_audience_id=google_audience.id, ) ) assert response == GetGoogleAudienceShareStatusResponse( audience_id=google_audience.id, audience_name=google_audience.name, ad_account_name=google_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=google_audience.url, ) @pytest.mark.db def test_get_audience_share_status_completed( self, handler: GetGoogleAudienceShareStatusHandler, 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, ) google_audience = create_model(GoogleAudience, share=share) response = handler.handle( GetGoogleAudienceShareStatusRequest( identity_id=identity_id, google_audience_id=google_audience.id, ) ) assert response == GetGoogleAudienceShareStatusResponse( audience_id=google_audience.id, audience_name=google_audience.name, ad_account_name=google_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=google_audience.url, ) @pytest.mark.db def test_get_audience_share_status_ad_account_empty_name( self, handler: GetGoogleAudienceShareStatusHandler, 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, ) ad_account = create_model(GoogleAdAccount, name="") google_audience = create_model( GoogleAudience, share=share, ad_account=ad_account ) response = handler.handle( GetGoogleAudienceShareStatusRequest( identity_id=identity_id, google_audience_id=google_audience.id, ) ) assert response == GetGoogleAudienceShareStatusResponse( audience_id=google_audience.id, audience_name=google_audience.name, ad_account_name=ad_account.external_id, status=share.status, fans_count=share.fans_count, processed_fans=share.processed_fans, progress=1.0, seconds_remaining=0, url=google_audience.url, ) @pytest.mark.db def test_get_audience_share_status_does_not_exist( self, handler: GetGoogleAudienceShareStatusHandler, identity_id: str, fake: FakerTyped, ) -> None: with pytest.raises(GoogleAudienceNotFoundError): handler.handle( GetGoogleAudienceShareStatusRequest( identity_id=identity_id, google_audience_id=fake.uuid4_string(), ) )