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, StoreNotFoundError from app.enums import ConnectorType, WebhookEventType from app.exceptions import WebhookHandleError from app.shopify 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.shopify_logic.ows_dmp", autospec=True) def test_parse_connector_event(faker: Faker) -> None: event, webhook_event = parse_event( json.loads(Path("tests/events/shopify/connector_event.json").read_text()) ) assert event assert webhook_event def test_parse_destination_event(faker: Faker) -> None: event, webhook_event = parse_event( json.loads(Path("tests/events/shopify/destination_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.SHOPIFY, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_shopify_store.assert_called_once_with( connector_id=webhook_event.connector_id ) 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.SHOPIFY, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_shopify_store.assert_called_once_with( connector_id=webhook_event.connector_id ) 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.SHOPIFY, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_shopify_store.assert_called_once_with( connector_id=webhook_event.connector_id ) def test_handle_destination_event( ows_dmp_client_mock: mock.MagicMock, faker: Faker ) -> None: webhook_event = WebhookEventFactory.build( event=WebhookEventType.TRANSFORMATION_SUCCEEDED, connector_id=None, connector_type=None, ) logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.handle_transformation_success.assert_called_once() 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.SHOPIFY, 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.SHOPIFY, ) ows_dmp_client_mock.refresh_shopify_store.side_effect = OwsDmpError() with pytest.raises(WebhookHandleError, match="Failed to refresh"): logic.handle_webhook_event(webhook_event) def test_handle_webhook_event_shopify_store_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.SHOPIFY, ) ows_dmp_client_mock.refresh_shopify_store.side_effect = StoreNotFoundError() logic.handle_webhook_event(webhook_event) ows_dmp_client_mock.refresh_shopify_store.assert_called_once_with( connector_id=webhook_event.connector_id )