from unittest import mock import pytest from dmp.adapters.fivetran.enums import AdsAccountsSyncMode from dmp.adapters.fivetran.models import AdsConnection from dmp.app_connections.services import AdsConnectionService from dmp.meta.models import MetaAdAccount, MetaAdReportingConnection from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel class TestAdsConnectorService: @pytest.mark.db def test_remove_fivetran_ad_account( self, service: AdsConnectionService, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, build_model: BuildModel, fake: FakerTyped, ) -> None: existed_ad_account_external_id_1 = fake.pystr() existed_ad_account_external_id_2 = fake.pystr() ad_reporting_connection = create_model(MetaAdReportingConnection) fivetran_connection = build_model( AdsConnection, config={ "sync_mode": AdsAccountsSyncMode.SPECIFIC_ACCOUNTS, "accounts": [ existed_ad_account_external_id_1, existed_ad_account_external_id_2, ], }, ) fivetran_client_mock.get_ads_connection.return_value = fivetran_connection service.remove_fivetran_ad_account( ad_reporting_connection.fivetran_connector_id, existed_ad_account_external_id_1, ) fivetran_client_mock.patch_ads_connection.assert_called_once_with( ad_reporting_connection.fivetran_connector_id, payload={"config": {"accounts": [existed_ad_account_external_id_2]}}, ) @pytest.mark.db def test_delete_fivetran_ad_account( self, service: AdsConnectionService, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, build_model: BuildModel, ) -> None: ad_account = create_model(MetaAdAccount) ad_account_to_delete = create_model(MetaAdAccount) ad_reporting_connection = create_model( MetaAdReportingConnection, ad_accounts=[ad_account], ) fivetran_connection = build_model( AdsConnection, config={ "sync_mode": AdsAccountsSyncMode.SPECIFIC_ACCOUNTS, "accounts": [ ad_account.external_id, ad_account_to_delete.external_id, ], }, ) fivetran_client_mock.get_ads_connection.return_value = fivetran_connection service.delete_fivetran_ad_account( ad_reporting_connection, ad_account_to_delete.external_id ) fivetran_client_mock.patch_ads_connection.assert_called() fivetran_client_mock.delete_connection.assert_not_called() @pytest.mark.db def test_delete_last_fivetran_ad_account( self, service: AdsConnectionService, fivetran_client_mock: mock.MagicMock, create_model: CreateModel, ) -> None: ad_account_to_delete = create_model(MetaAdAccount) ad_reporting_connection = create_model( MetaAdReportingConnection, ad_accounts=[], ) service.delete_fivetran_ad_account( ad_reporting_connection, ad_account_to_delete.external_id ) fivetran_client_mock.patch_ads_connection.assert_not_called() fivetran_client_mock.delete_connection.assert_called()