from unittest import mock import pytest from dmp.tiktok.exceptions import TikTokAdAccountNotFoundError from dmp.tiktok.handlers import ( DeleteTikTokAdAccountsHandler, DeleteTikTokAdAccountsRequest, ) from dmp.tiktok.models import ( TikTokAdAccount, TikTokAdReportingConnection, TikTokUserAdAccount, TikTokUserConnection, ) from dmp.tiktok.repositories import ( TikTokAdReportingConnectionRepository, TikTokUserAdAccountRepository, TikTokUserConnectionRepository, ) from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestDeleteTikTokAdAccountsHandler: @pytest.mark.db def test_delete_ad_accounts( self, handler: DeleteTikTokAdAccountsHandler, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, user_connection_repository: TikTokUserConnectionRepository, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, user_ad_account_repository: TikTokUserAdAccountRepository, ) -> None: user_1_uuid = fake.uuid4_string() user_2_uuid = fake.uuid4_string() ad_account_1 = create_model(TikTokAdAccount) ad_account_2 = create_model(TikTokAdAccount) vendor_id = fake.integer() subaccount_id = fake.integer() create_model( TikTokUserConnection, is_valid=True, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) # second user connection for the same identity create_model( TikTokUserConnection, is_valid=True, identity_id=user_1_uuid, ad_accounts=[ad_account_1], ) create_model( TikTokAdReportingConnection, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( TikTokUserConnection, is_valid=True, identity_id=user_2_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( TikTokAdReportingConnection, identity_id=user_2_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( TikTokUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( TikTokUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( TikTokUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_2.id ) create_model( TikTokUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_2.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) handler.handle( DeleteTikTokAdAccountsRequest( identity_id=fake.uuid4_string(), ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ), ) user_ad_account = user_ad_account_repository.find_by_ad_account_id_and_account( ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) user_connections_1_user = user_connection_repository.get_by_identity_id( user_1_uuid ) ad_reporting_connections_1_user = ( ad_reporting_connection_repository.get_by_identity_id(user_1_uuid) ) user_connections_2_user = user_connection_repository.get_by_identity_id( user_2_uuid ) ad_reporting_connections_2_user = ( ad_reporting_connection_repository.get_by_identity_id(user_2_uuid) ) fivetran_client_mock.delete_connection.assert_not_called() assert not user_ad_account assert user_connections_1_user assert len(user_connections_1_user) == 1 assert user_connections_1_user[0].ad_accounts == [ad_account_2] assert ad_reporting_connections_1_user assert ad_reporting_connections_1_user[0].ad_accounts == [ad_account_2] assert user_connections_2_user assert user_connections_2_user[0].ad_accounts == [ad_account_2] assert ad_reporting_connections_2_user assert ad_reporting_connections_2_user[0].ad_accounts == [ad_account_2] @pytest.mark.db def test_delete_ad_accounts_with_last_user_ad_account( self, handler: DeleteTikTokAdAccountsHandler, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, user_connection_repository: TikTokUserConnectionRepository, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, user_ad_account_repository: TikTokUserAdAccountRepository, ) -> None: user_1_uuid = fake.uuid4_string() user_2_uuid = fake.uuid4_string() ad_account_1 = create_model(TikTokAdAccount) ad_account_2 = create_model(TikTokAdAccount) vendor_id = fake.integer() subaccount_id = fake.integer() create_model( TikTokUserConnection, is_valid=True, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( TikTokAdReportingConnection, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( TikTokUserConnection, is_valid=True, identity_id=user_2_uuid, ad_accounts=[ad_account_1], ) create_model( TikTokAdReportingConnection, identity_id=user_2_uuid, ad_accounts=[ad_account_1], ) create_model( TikTokUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( TikTokUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( TikTokUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_2.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) handler.handle( DeleteTikTokAdAccountsRequest( identity_id=fake.uuid4_string(), ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ), ) user_ad_account = user_ad_account_repository.find_by_ad_account_id_and_account( ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) user_connections_1_user = user_connection_repository.get_by_identity_id( user_1_uuid ) ad_reporting_connections_1_user = ( ad_reporting_connection_repository.get_by_identity_id(user_1_uuid) ) user_connections_2_user = user_connection_repository.get_by_identity_id( user_2_uuid ) ad_reporting_connections_2_user = ( ad_reporting_connection_repository.get_by_identity_id(user_2_uuid) ) fivetran_client_mock.delete_connection.assert_called_once() assert not user_ad_account assert user_connections_1_user assert user_connections_1_user[0].ad_accounts == [ad_account_2] assert ad_reporting_connections_1_user assert ad_reporting_connections_1_user[0].ad_accounts == [ad_account_2] assert not user_connections_2_user assert not ad_reporting_connections_2_user @pytest.mark.db def test_delete_ad_accounts_wrong_ad_account_id( self, handler: DeleteTikTokAdAccountsHandler, identity_id: str, fake: FakerTyped, ) -> None: ad_account_id = fake.uuid4_string() with pytest.raises(TikTokAdAccountNotFoundError): handler.handle( DeleteTikTokAdAccountsRequest( identity_id=identity_id, ad_account_id=ad_account_id, vendor_id=fake.integer(), subaccount_id=fake.integer(), ), )