from unittest import mock import pytest from dmp.ad_accounts.enums import AdAccountPlatform from dmp.ad_accounts.models import AdAccountDbt from dmp.adapters.fivetran.enums import ConnectionSetupState, ConnectionSyncState from dmp.adapters.fivetran.models import AdsConnection from dmp.adapters.ows_notifications import AdReportingSyncCompletedNotificationArgs from dmp.app_connections.enums import AdsConnectionPlatform, AppConnectionStatus from dmp.tiktok.handlers import NotifyTikTokAdReportingSyncCompletedHandler from dmp.tiktok.models import TikTokAdAccount, TikTokAdReportingConnection from dmp.tiktok.repositories import TikTokAdReportingConnectionRepository from tests.unit.types import BuildModel, CreateModel, CreateReportingModel class TestNotifyTikTokAdReportingSyncCompletedHandler: @pytest.mark.db def test_refresh_ad_reporting_connection_connection_pending( self, handler: NotifyTikTokAdReportingSyncCompletedHandler, ad_reporting_connection_repository: TikTokAdReportingConnectionRepository, build_model: BuildModel, create_model: CreateModel, create_reporting_model: CreateReportingModel, fivetran_client_mock: mock.MagicMock, ows_notifications_client_mock: mock.MagicMock, ) -> None: fivetran_connection = build_model( AdsConnection, status={ "setup_state": ConnectionSetupState.CONNECTED, "sync_state": ConnectionSyncState.SCHEDULED, }, ) ad_account = create_model(TikTokAdAccount) ad_account_without_name = create_model(TikTokAdAccount, name=None) active_connection = create_model( TikTokAdReportingConnection, fivetran_connector_id=fivetran_connection.id, status=AppConnectionStatus.WAITING_FOR_PROCESSING, initial_email_sent=False, ad_accounts=[ad_account, ad_account_without_name], ) create_reporting_model( AdAccountDbt, platform=AdAccountPlatform.TIKTOK, source_schema=active_connection.fivetran_schema, ) create_model( TikTokAdReportingConnection, status=AppConnectionStatus.CONNECTED, initial_email_sent=True, ) create_model( TikTokAdReportingConnection, status=AppConnectionStatus.SYNCING, initial_email_sent=False, ) fivetran_client_mock.get_ads_connection.return_value = fivetran_connection updated_ad_reporting_connections = handler.handle() assert updated_ad_reporting_connections assert len(updated_ad_reporting_connections) == 1 ad_reporting_connection = updated_ad_reporting_connections[0] assert ad_reporting_connection.id == active_connection.id assert ad_reporting_connection.initial_email_sent is True assert ad_reporting_connection.status == AppConnectionStatus.CONNECTED ows_notifications_client_mock.notify_ad_reporting_sync_completed.assert_called_once_with( AdReportingSyncCompletedNotificationArgs( identity_id=ad_reporting_connection.identity_id, ad_accounts=[ ad_account.name or ad_account.id, ad_account_without_name.id, ], ad_reporting_platform=AdsConnectionPlatform.TIKTOK, ) ) assert ad_reporting_connection_repository.find_not_notified_connections() == []