import pytest from dmp.tiktok.dtos import AssignTikTokUserAdAccountLabelData from dmp.tiktok.exceptions import ( InvalidTikTokAdAccountId, TikTokConnectionNotFoundError, ) from dmp.tiktok.handlers import ( AssignLabelsToTikTokUserAdAccountsHandler, AssignLabelsToTikTokUserAdAccountsRequest, ) from dmp.tiktok.models import ( TikTokAdAccount, TikTokAdReportingConnection, TikTokUserAdAccount, TikTokUserConnection, ) from dmp.tiktok.repositories import TikTokUserAdAccountRepository from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel class TestAssignLabelsToTikTokUserAdAccountsHandler: @pytest.mark.db def test_assign_labels_to_the_user_ad_account( self, handler: AssignLabelsToTikTokUserAdAccountsHandler, user_ad_account_repository: TikTokUserAdAccountRepository, create_model: CreateModel, identity_id: str, user_id: str, fake: FakerTyped, ) -> None: ad_account = create_model(TikTokAdAccount) ad_account2 = create_model(TikTokAdAccount) create_model(TikTokAdAccount) user_ad_account = create_model( TikTokUserAdAccount, identity_id=identity_id, ad_account_id=ad_account.id, vendor_id=fake.integer(), subaccount_id=fake.integer(), ) create_model( TikTokAdReportingConnection, identity_id=identity_id, user_id=user_id, ad_accounts=[ad_account], ) create_model( TikTokAdReportingConnection, identity_id=identity_id, ad_accounts=[ad_account], ) create_model( TikTokUserConnection, identity_id=identity_id, user_id=user_id, ad_accounts=[ad_account2, ad_account], ) new_vendor_id = fake.integer() new_subaccount_id = fake.integer() handler.handle( AssignLabelsToTikTokUserAdAccountsRequest( identity_id=identity_id, assignments=[ AssignTikTokUserAdAccountLabelData( ad_account_id=ad_account.id, vendor_id=user_ad_account.vendor_id, subaccount_id=user_ad_account.subaccount_id, ), AssignTikTokUserAdAccountLabelData( ad_account_id=ad_account2.id, vendor_id=new_vendor_id, subaccount_id=new_subaccount_id, ), ], ) ) user_ad_accounts = user_ad_account_repository.find_by_identity_id( identity_id=identity_id ) assert user_ad_accounts assert len(user_ad_accounts) == 2 assert user_ad_accounts[0].ad_account_id == ad_account.id assert user_ad_accounts[0].vendor_id == user_ad_account.vendor_id assert user_ad_accounts[0].subaccount_id == user_ad_account.subaccount_id assert user_ad_accounts[1].ad_account_id == ad_account2.id assert user_ad_accounts[1].vendor_id == new_vendor_id assert user_ad_accounts[1].subaccount_id == new_subaccount_id @pytest.mark.db def test_assign_labels_to_the_user_ad_account_with_invalid_ad_account_id( self, handler: AssignLabelsToTikTokUserAdAccountsHandler, create_model: CreateModel, identity_id: str, fake: FakerTyped, ) -> None: ad_account = create_model(TikTokAdAccount) with pytest.raises(InvalidTikTokAdAccountId): handler.handle( AssignLabelsToTikTokUserAdAccountsRequest( identity_id=identity_id, assignments=[ AssignTikTokUserAdAccountLabelData( ad_account_id=ad_account.id, vendor_id=fake.integer(), subaccount_id=fake.integer(), ), AssignTikTokUserAdAccountLabelData( ad_account_id=fake.pystr(), vendor_id=fake.integer(), subaccount_id=fake.integer(), ), ], ) ) @pytest.mark.db def test_assign_labels_to_the_user_ad_account_with_missed_connection_for_ad_account( self, handler: AssignLabelsToTikTokUserAdAccountsHandler, create_model: CreateModel, identity_id: str, user_id: str, fake: FakerTyped, ) -> None: ad_account = create_model(TikTokAdAccount) ad_account2 = create_model(TikTokAdAccount) create_model(TikTokAdAccount) user_ad_account = create_model( TikTokUserAdAccount, identity_id=identity_id, ad_account_id=ad_account.id, vendor_id=fake.integer(), subaccount_id=fake.integer(), ) create_model( TikTokAdReportingConnection, identity_id=identity_id, ad_accounts=[ad_account], ) create_model( TikTokAdReportingConnection, identity_id=identity_id, user_id=user_id, ad_accounts=[ad_account], ) new_vendor_id = fake.integer() new_subaccount_id = fake.integer() with pytest.raises(TikTokConnectionNotFoundError): handler.handle( AssignLabelsToTikTokUserAdAccountsRequest( identity_id=identity_id, assignments=[ AssignTikTokUserAdAccountLabelData( ad_account_id=ad_account.id, vendor_id=user_ad_account.vendor_id, subaccount_id=user_ad_account.subaccount_id, ), AssignTikTokUserAdAccountLabelData( ad_account_id=ad_account2.id, vendor_id=new_vendor_id, subaccount_id=new_subaccount_id, ), ], ) )