from unittest import mock import pytest from dmp.adapters.tiktok.models import User from dmp.audiences.enums import AudienceSharePlatform from dmp.audiences.models import Audience, AudienceShare from dmp.tiktok.exceptions import ( TikTokAudienceNotFoundError, TikTokUserConnectionNotFoundError, ) from dmp.tiktok.handlers import ( GetTikTokAudienceShareHandler, GetTikTokAudienceShareRequest, ) from dmp.tiktok.models import ( TikTokAdAccount, TikTokAudience, TikTokUserAdAccount, TikTokUserConnection, ) from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel class TestGetTikTokAudienceShareHandler: @pytest.mark.db def test_get_audience_share( self, handler: GetTikTokAudienceShareHandler, tiktok_client_mock: mock.MagicMock, build_model: BuildModel, create_model: CreateModel, ) -> None: audience = create_model(Audience) ad_account = create_model(TikTokAdAccount) user_connection = create_model( TikTokUserConnection, is_valid=True, ad_accounts=[ad_account] ) create_model( TikTokUserAdAccount, ad_account_id=ad_account.id, identity_id=user_connection.identity_id, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, ) share = create_model( AudienceShare, audience=audience, platform=AudienceSharePlatform.TIKTOK, created_by=user_connection.identity_id, ) tiktok_audience = create_model( TikTokAudience, share=share, ad_account=ad_account ) tiktok_client_mock.get_user.return_value = build_model(User) response = handler.handle( GetTikTokAudienceShareRequest(share_id=tiktok_audience.share_id), ) assert response.audience_id == tiktok_audience.id assert response.audience_name == tiktok_audience.name assert response.fans_count == tiktok_audience.fans_count assert response.ad_account_external_id == tiktok_audience.ad_account_external_id assert response.user_access_token == user_connection.token @pytest.mark.db def test_get_audience_share_not_exist( self, handler: GetTikTokAudienceShareHandler, fake: FakerTyped ) -> None: with pytest.raises(TikTokAudienceNotFoundError): handler.handle( GetTikTokAudienceShareRequest(share_id=fake.uuid4_string()), ) @pytest.mark.db def test_get_audience_share_user_connection_not_exist( self, handler: GetTikTokAudienceShareHandler, create_model: CreateModel ) -> None: tiktok_audience = create_model(TikTokAudience) with pytest.raises(TikTokUserConnectionNotFoundError): handler.handle( GetTikTokAudienceShareRequest(share_id=tiktok_audience.share_id), )