from unittest import mock import pytest from pytest_mock import MockerFixture from app import main from app.enums import ConnectorType from app.exceptions import WebhookHandleError from tests.unit.factories import EventFactory, WebhookEventFactory @pytest.fixture def parse_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.parse_event", autospec=True) @pytest.fixture def shopify_logic_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.shopify_logic", autospec=True) @pytest.fixture def meta_logic_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.meta_logic", autospec=True) @pytest.fixture def tiktok_logic_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.tiktok_logic", autospec=True) @pytest.fixture def google_logic_mock(mocker: MockerFixture) -> mock.MagicMock: return mocker.patch("app.main.google_logic", autospec=True) def test_handler_meta_old_event( parse_mock: mock.MagicMock, meta_logic_mock: mock.MagicMock, ) -> None: event = EventFactory.build(path="/facebook-ads") webhook_event = WebhookEventFactory.build() parse_mock.return_value = (event, webhook_event) meta_logic_mock.ows_dmp.refresh_meta_ad_reporting_connection.return_value = None response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200 def test_handler_meta_event( parse_mock: mock.MagicMock, meta_logic_mock: mock.MagicMock, ) -> None: event = EventFactory.build(path="/ad-reporting") webhook_event = WebhookEventFactory.build(connector_type=ConnectorType.FACEBOOK_ADS) parse_mock.return_value = (event, webhook_event) meta_logic_mock.ows_dmp.refresh_meta_ad_reporting_connection.return_value = None response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200 def test_handler_tiktok_event( parse_mock: mock.MagicMock, tiktok_logic_mock: mock.MagicMock, ) -> None: event = EventFactory.build(path="/ad-reporting") webhook_event = WebhookEventFactory.build(connector_type=ConnectorType.TIKTOK_ADS) parse_mock.return_value = (event, webhook_event) tiktok_logic_mock.ows_dmp.refresh_tiktok_ad_reporting_connection.return_value = None response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200 def test_handler_google_event( parse_mock: mock.MagicMock, google_logic_mock: mock.MagicMock, ) -> None: event = EventFactory.build(path="/ad-reporting") webhook_event = WebhookEventFactory.build(connector_type=ConnectorType.GOOGLE_ADS) parse_mock.return_value = (event, webhook_event) google_logic_mock.ows_dmp.refresh_google_ad_reporting_connection.return_value = None response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200 def test_handler_shopify_event( parse_mock: mock.MagicMock, shopify_logic_mock: mock.MagicMock, ) -> None: event = EventFactory.build(path="/shopify") webhook_event = WebhookEventFactory.build() parse_mock.return_value = (event, webhook_event) shopify_logic_mock.ows_dmp.refresh_shopify_store.return_value = None response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200 def test_handler_not_allowed_method(parse_mock: mock.MagicMock) -> None: event = EventFactory.build(http_method="GET") webhook_event = WebhookEventFactory.build() parse_mock.return_value = (event, webhook_event) response = main.handler(event.model_dump(), None) assert response["statusCode"] == 405 def test_handler_handle_error( parse_mock: mock.MagicMock, shopify_logic_mock: mock.MagicMock ) -> None: event = EventFactory.build(path="/shopify") webhook_event = WebhookEventFactory.build() parse_mock.return_value = (event, webhook_event) shopify_logic_mock.handle_webhook_event.side_effect = WebhookHandleError() response = main.handler(event.model_dump(), None) assert response["statusCode"] == 400 def test_handler_unknown_error( parse_mock: mock.MagicMock, shopify_logic_mock: mock.MagicMock ) -> None: event = EventFactory.build(path="/shopify") webhook_event = WebhookEventFactory.build() parse_mock.return_value = (event, webhook_event) shopify_logic_mock.handle_webhook_event.side_effect = Exception() response = main.handler(event.model_dump(), None) assert response["statusCode"] == 500 def test_unsupported_event_type_meta( parse_mock: mock.MagicMock, meta_logic_mock: mock.MagicMock ) -> None: event = EventFactory.build(path="/facebook-ads") webhook_event = WebhookEventFactory.build(event="transformation_succeeded") parse_mock.return_value = (event, webhook_event) response = main.handler(event.model_dump(), None) assert response["statusCode"] == 200