from unittest import mock import pytest from dmp.adapters.fivetran.models import AdsConnectionWithConnectCard, ConnectCard from dmp.app_connections.enums import AppConnectionStatus from dmp.tiktok.exceptions import TikTokUserConnectionNotFoundError from dmp.tiktok.handlers.connect_ad_reporting import ( ConnectTikTokAdReportingHandler, ConnectTikTokAdReportingRequest, ) from dmp.tiktok.models import TikTokAdReportingConnection, TikTokUserConnection from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel class TestConnectTikTokAdReportingHandler: @pytest.mark.db def test_connect_tiktok_ad_reporting( self, handler: ConnectTikTokAdReportingHandler, fake: FakerTyped, build_model: BuildModel, create_model: CreateModel, fivetran_client_mock: mock.MagicMock, identity_id: str, ) -> None: user_id = fake.pystr() fivetran_connection = build_model(AdsConnectionWithConnectCard) create_model(TikTokUserConnection, identity_id=identity_id, user_id=user_id) fivetran_client_mock.create_tiktok_ads_connection.return_value = ( fivetran_connection ) connection, connect_card = handler.handle( ConnectTikTokAdReportingRequest( identity_id=identity_id, redirect_uri=fake.url(), user_id=user_id, ) ) assert connection.fivetran_connector_id == fivetran_connection.id assert connection.fivetran_schema == handler._generate_fivetran_schema( identity_id, user_id ) assert connection.identity_id == identity_id assert connection.user_id == user_id @pytest.mark.db def test_reconnect_tiktok_connection_if_exists( self, handler: ConnectTikTokAdReportingHandler, fake: FakerTyped, create_model: CreateModel, fivetran_client_mock: mock.MagicMock, ) -> None: identity_id = fake.uuid4_string() user_id = fake.pystr() redirect_uri = fake.url() connect_card = ConnectCard(token=fake.pystr(), uri=redirect_uri) create_model( TikTokUserConnection, identity_id=identity_id, user_id=user_id, ) existing_connection = create_model( TikTokAdReportingConnection, identity_id=identity_id, user_id=user_id, status=AppConnectionStatus.CONNECTED, initial_email_sent=True, ) fivetran_client_mock.get_connect_card.return_value = connect_card connection, returned_connect_card = handler.handle( ConnectTikTokAdReportingRequest( identity_id=identity_id, redirect_uri=redirect_uri, user_id=user_id, ) ) fivetran_client_mock.create_tiktok_ads_connection.assert_not_called() fivetran_client_mock.get_connect_card.assert_called_once_with( connection_id=existing_connection.fivetran_connector_id, redirect_uri=redirect_uri, ) assert connection assert connection.identity_id == existing_connection.identity_id assert connection.user_id == existing_connection.user_id assert connection.initial_email_sent is False assert returned_connect_card == connect_card @pytest.mark.db def test_connect_tiktok_ad_reporting_without_user_connection( self, handler: ConnectTikTokAdReportingHandler, fake: FakerTyped, create_model: CreateModel, fivetran_client_mock: mock.MagicMock, ) -> None: identity_id = fake.uuid4_string() user_id = fake.pystr() redirect_uri = fake.url() connect_card = ConnectCard(token=fake.pystr(), uri=redirect_uri) create_model( TikTokAdReportingConnection, identity_id=identity_id, user_id=user_id, status=AppConnectionStatus.CONNECTED, ) fivetran_client_mock.get_connect_card.return_value = connect_card with pytest.raises(TikTokUserConnectionNotFoundError): handler.handle( ConnectTikTokAdReportingRequest( identity_id=identity_id, redirect_uri=redirect_uri, user_id=user_id, ) )