from unittest import mock import httpx import pytest from dmp.adapters.fivetran.exceptions import FivetranClientError from dmp.adapters.fivetran.models import AdsConnectionWithConnectCard from dmp.meta.exceptions import ( MetaAdReportingConnectionConflictError, MetaAdReportingConnectionSyncingError, ) from dmp.meta.handlers import ( ConnectMetaAdReportingHandler, ConnectMetaAdReportingRequest, ) from dmp.meta.models import MetaAdReportingConnection from dmp.meta.utils import generate_fivetran_schema from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateModel class TestConnectMetaAdReportingHandler: @pytest.mark.db def test_connect_meta_ad_reporting( self, handler: ConnectMetaAdReportingHandler, fake: FakerTyped, build_model: BuildModel, fivetran_client_mock: mock.MagicMock, identity_id: str, ) -> None: fivetran_connection = build_model(AdsConnectionWithConnectCard) fivetran_client_mock.create_facebook_ads_connection.return_value = ( fivetran_connection ) connection, connect_card = handler.handle( ConnectMetaAdReportingRequest( identity_id=identity_id, redirect_uri=fake.url(), ) ) assert connection.fivetran_connector_id == fivetran_connection.id assert connection.fivetran_schema == generate_fivetran_schema(identity_id) assert connection.identity_id == identity_id @pytest.mark.db def test_connect_meta_error_connection_exist_for_user( self, handler: ConnectMetaAdReportingHandler, fake: FakerTyped, create_model: CreateModel, ) -> None: identity_id = fake.uuid4_string() create_model( MetaAdReportingConnection, identity_id=identity_id, ) with pytest.raises(MetaAdReportingConnectionConflictError): handler.handle( ConnectMetaAdReportingRequest( identity_id=identity_id, redirect_uri=fake.url(), ) ) @pytest.mark.db def test_connect_meta_error_fivetran_connection_syncing( self, handler: ConnectMetaAdReportingHandler, fake: FakerTyped, fivetran_client_mock: mock.MagicMock, identity_id: str, ) -> None: response = mock.MagicMock(spec=httpx.Response) response.status_code = 409 fivetran_client_mock.create_facebook_ads_connection.side_effect = ( FivetranClientError(response=response) ) with pytest.raises(MetaAdReportingConnectionSyncingError): handler.handle( ConnectMetaAdReportingRequest( identity_id=identity_id, redirect_uri=fake.url(), ) )