import json from pathlib import Path from unittest import mock import pytest from faker import Faker from pytest_mock import MockerFixture from app.connectors.ows_dmp import OwsDmpError, TikTokAdReportingConnectionNotFoundError from app.enums import ConnectorType, WebhookEventType from app.exceptions import WebhookHandleError from app.tiktok import logic from app.utils import parse_event from tests.unit.factories import WebhookEventFactory @pytest.fixture def ows_dmp_client_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.tiktok_logic.ows_dmp", autospec=True) def test_parse_connector_event(faker: Faker) -> None: event, webhook_event = parse_event( json.loads(Path("tests/events/tiktok/connector_event.json").read_text()) ) assert event assert webhook_event def test_handle_connector_event( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.SYNC_START, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.assert_called_once_with( connector_id=webhook_event.connector_id ) ows_dmp_client_mock.refresh_meta_ad_reporting_connection.assert_not_called() def test_handle_connector_event_sync_end( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.SYNC_END, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.assert_called_once_with( connector_id=webhook_event.connector_id ) ows_dmp_client_mock.refresh_meta_ad_reporting_connection.assert_not_called() def test_handle_edit_connector_event( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.EDIT_CONNECTOR, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.assert_called_once_with( connector_id=webhook_event.connector_id ) ows_dmp_client_mock.refresh_meta_ad_reporting_connection.assert_not_called() def test_handle_webhook_event_invalid_destination( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.SYNC_START, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, destination_group_id="wrong_destination", ) with pytest.raises(WebhookHandleError, match="Invalid destination"): logic.handle_webhook_event(webhook_event) def test_handle_webhook_event_ows_dmp_error( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.SYNC_START, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, ) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.side_effect = ( OwsDmpError() ) with pytest.raises(WebhookHandleError, match="Failed to refresh"): logic.handle_webhook_event(webhook_event) def test_handle_webhook_event_tiktok_association_not_found( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.SYNC_START, connector_id=faker.pystr(), connector_type=ConnectorType.TIKTOK_ADS, ) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.side_effect = ( TikTokAdReportingConnectionNotFoundError() ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_tiktok_ad_reporting_connection.assert_called_once_with( connector_id=webhook_event.connector_id ) ows_dmp_client_mock.refresh_meta_ad_reporting_connection.assert_not_called()