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.tiktok.exceptions import TikTokAudienceNotFoundError from dmp.tiktok.handlers import ( GetTikTokAudienceShareStatusHandler, GetTikTokAudienceShareStatusRequest, GetTikTokAudienceShareStatusResponse, ) from dmp.tiktok.models import TikTokAudience from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestGetTikTokAudienceShareStatusHandler: @pytest.mark.db def test_get_audience_share_status_processing( self, handler: GetTikTokAudienceShareStatusHandler, 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), ) tiktok_audience = create_model(TikTokAudience, share=share) response = handler.handle( GetTikTokAudienceShareStatusRequest( identity_id=identity_id, tiktok_audience_id=tiktok_audience.id, ) ) assert response == GetTikTokAudienceShareStatusResponse( audience_id=tiktok_audience.id, audience_name=tiktok_audience.name, ad_account_name=tiktok_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=tiktok_audience.url, ) @pytest.mark.db def test_get_audience_share_status_pending( self, handler: GetTikTokAudienceShareStatusHandler, 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, ) tiktok_audience = create_model(TikTokAudience, share=share) response = handler.handle( GetTikTokAudienceShareStatusRequest( identity_id=identity_id, tiktok_audience_id=tiktok_audience.id, ) ) assert response == GetTikTokAudienceShareStatusResponse( audience_id=tiktok_audience.id, audience_name=tiktok_audience.name, ad_account_name=tiktok_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=tiktok_audience.url, ) @pytest.mark.db def test_get_audience_share_status_completed( self, handler: GetTikTokAudienceShareStatusHandler, 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, ) tiktok_audience = create_model(TikTokAudience, share=share) response = handler.handle( GetTikTokAudienceShareStatusRequest( identity_id=identity_id, tiktok_audience_id=tiktok_audience.id, ) ) assert response == GetTikTokAudienceShareStatusResponse( audience_id=tiktok_audience.id, audience_name=tiktok_audience.name, ad_account_name=tiktok_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=tiktok_audience.url, ) @pytest.mark.db def test_get_audience_share_status_does_not_exist( self, handler: GetTikTokAudienceShareStatusHandler, identity_id: str, fake: FakerTyped, ) -> None: with pytest.raises(TikTokAudienceNotFoundError): handler.handle( GetTikTokAudienceShareStatusRequest( identity_id=identity_id, tiktok_audience_id=fake.uuid4_string(), ) )