from unittest import mock import pytest from dmp.adapters.tiktok.exceptions import TikTokClientError from dmp.adapters.tiktok.models import User from dmp.tiktok.dtos import TikTokUserConnectionAdAccount, TikTokUserConnectionResponse from dmp.tiktok.enums import TikTokUserConnectionStatus from dmp.tiktok.handlers import ( GetTikTokUserConnectionHandler, GetTikTokUserConnectionRequest, ) from dmp.tiktok.models import TikTokAdAccount, TikTokUserConnection from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel class TestGetTikTokUserConnectionHandler: @pytest.mark.db def test_get_user_connection( self, handler: GetTikTokUserConnectionHandler, tiktok_client_mock: mock.MagicMock, build_model: BuildModel, create_model: CreateModel, ) -> None: api_user = build_model(User) ad_account = create_model(TikTokAdAccount) user_connection = create_model( TikTokUserConnection, is_valid=True, user_id=api_user.core_user_id, user_name=api_user.display_name, ad_accounts=[ad_account], ) tiktok_client_mock.get_user.return_value = api_user user_connection_response = handler.handle( GetTikTokUserConnectionRequest( identity_id=user_connection.identity_id, user_id=user_connection.user_id, ), ) assert user_connection.is_valid assert user_connection_response.user_id == user_connection.user_id assert user_connection_response.user_name == user_connection.user_name assert user_connection_response.status == TikTokUserConnectionStatus.CONNECTED assert user_connection_response.ad_accounts == [ TikTokUserConnectionAdAccount( id=ad_account.id, external_id=ad_account.external_id, name=ad_account.name or ad_account.external_id, business_center_name=ad_account.business_center_name, ) ] def test_get_user_connection_no_connection_found( self, handler: GetTikTokUserConnectionHandler, identity_id: str, fake: FakerTyped, ) -> None: user_connection_response = handler.handle( GetTikTokUserConnectionRequest( identity_id=identity_id, user_id=fake.pystr() ) ) assert user_connection_response == TikTokUserConnectionResponse( user_id=None, user_name=None, status=TikTokUserConnectionStatus.NOT_CONNECTED, ad_accounts=[], ) @pytest.mark.db def test_get_user_connection_invalid( self, handler: GetTikTokUserConnectionHandler, create_model: CreateModel ) -> None: user_connection = create_model(TikTokUserConnection, is_valid=False) user_connection_response = handler.handle( GetTikTokUserConnectionRequest( identity_id=user_connection.identity_id, user_id=user_connection.user_id, ), ) assert user_connection_response.status == TikTokUserConnectionStatus.INVALID assert user_connection_response.ad_accounts == [] @pytest.mark.db def test_get_user_connection_token_invalid( self, handler: GetTikTokUserConnectionHandler, tiktok_client_mock: mock.MagicMock, create_model: CreateModel, ) -> None: user_connection = create_model(TikTokUserConnection, is_valid=True) tiktok_client_mock.get_user.side_effect = TikTokClientError user_connection_response = handler.handle( GetTikTokUserConnectionRequest( identity_id=user_connection.identity_id, user_id=user_connection.user_id, ), ) assert not user_connection.is_valid assert user_connection_response == TikTokUserConnectionResponse( user_id=None, user_name=None, status=TikTokUserConnectionStatus.INVALID, ad_accounts=[], )