from unittest import mock import pytest from dmp.meta.exceptions import MetaAdAccountNotFoundError from dmp.meta.handlers import DeleteMetaAdAccountsHandler, DeleteMetaAdAccountsRequest from dmp.meta.models import ( MetaAdAccount, MetaAdReportingConnection, MetaUserAdAccount, MetaUserConnection, ) from dmp.meta.repositories import ( MetaAdReportingConnectionRepository, MetaUserAdAccountRepository, MetaUserConnectionRepository, ) from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestDeleteMetaAdAccountsHandler: @pytest.mark.db def test_delete_ad_accounts( self, handler: DeleteMetaAdAccountsHandler, facebook_client_mock: mock.MagicMock, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, user_connection_repository: MetaUserConnectionRepository, ad_reporting_connection_repository: MetaAdReportingConnectionRepository, user_ad_account_repository: MetaUserAdAccountRepository, ) -> None: user_1_uuid = fake.uuid4_string() user_2_uuid = fake.uuid4_string() ad_account_1 = create_model(MetaAdAccount) ad_account_2 = create_model(MetaAdAccount) vendor_id = fake.integer() subaccount_id = fake.integer() create_model( MetaUserConnection, is_valid=True, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaAdReportingConnection, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaUserConnection, is_valid=True, identity_id=user_2_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaAdReportingConnection, identity_id=user_2_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( MetaUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( MetaUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_2.id ) create_model( MetaUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_2.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) handler.handle( DeleteMetaAdAccountsRequest( 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_connection_1 = user_connection_repository.get_by_identity_id(user_1_uuid) ad_reporting_connection_1 = ( ad_reporting_connection_repository.get_by_identity_id(user_1_uuid) ) user_connection_2 = user_connection_repository.get_by_identity_id(user_2_uuid) ad_reporting_connection_2 = ( ad_reporting_connection_repository.get_by_identity_id(user_2_uuid) ) facebook_client_mock.disconnect_user.assert_not_called() fivetran_client_mock.delete_connection.assert_not_called() assert not user_ad_account assert user_connection_1 assert user_connection_1.ad_accounts == [ad_account_2] assert ad_reporting_connection_1 assert ad_reporting_connection_1.ad_accounts == [ad_account_2] assert user_connection_2 assert user_connection_2.ad_accounts == [ad_account_2] assert ad_reporting_connection_2 assert ad_reporting_connection_2.ad_accounts == [ad_account_2] @pytest.mark.db def test_delete_ad_accounts_with_last_user_ad_account( self, handler: DeleteMetaAdAccountsHandler, facebook_client_mock: mock.MagicMock, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, user_connection_repository: MetaUserConnectionRepository, ad_reporting_connection_repository: MetaAdReportingConnectionRepository, user_ad_account_repository: MetaUserAdAccountRepository, ) -> None: user_1_uuid = fake.uuid4_string() user_2_uuid = fake.uuid4_string() ad_account_1 = create_model(MetaAdAccount) ad_account_2 = create_model(MetaAdAccount) vendor_id = fake.integer() subaccount_id = fake.integer() create_model( MetaUserConnection, is_valid=True, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaAdReportingConnection, identity_id=user_1_uuid, ad_accounts=[ad_account_1, ad_account_2], ) create_model( MetaUserConnection, is_valid=True, identity_id=user_2_uuid, ad_accounts=[ad_account_1], ) create_model( MetaAdReportingConnection, identity_id=user_2_uuid, ad_accounts=[ad_account_1], ) create_model( MetaUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( MetaUserAdAccount, identity_id=user_2_uuid, ad_account_id=ad_account_1.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) create_model( MetaUserAdAccount, identity_id=user_1_uuid, ad_account_id=ad_account_2.id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) handler.handle( DeleteMetaAdAccountsRequest( 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_connection_1 = user_connection_repository.get_by_identity_id(user_1_uuid) ad_reporting_connection_1 = ( ad_reporting_connection_repository.get_by_identity_id(user_1_uuid) ) user_connection_2 = user_connection_repository.get_by_identity_id(user_2_uuid) ad_reporting_connection_2 = ( ad_reporting_connection_repository.get_by_identity_id(user_2_uuid) ) facebook_client_mock.disconnect_user.assert_called_once() fivetran_client_mock.delete_connection.assert_called_once() assert not user_ad_account assert user_connection_1 assert user_connection_1.ad_accounts == [ad_account_2] assert ad_reporting_connection_1 assert ad_reporting_connection_1.ad_accounts == [ad_account_2] assert not user_connection_2 assert not ad_reporting_connection_2 @pytest.mark.db def test_delete_ad_accounts_wrong_ad_account_id( self, handler: DeleteMetaAdAccountsHandler, identity_id: str, fake: FakerTyped, ) -> None: ad_account_id = fake.uuid4_string() with pytest.raises(MetaAdAccountNotFoundError): handler.handle( DeleteMetaAdAccountsRequest( identity_id=identity_id, ad_account_id=ad_account_id, vendor_id=fake.integer(), subaccount_id=fake.integer(), ), )