from unittest import mock import pytest from dmp.adapters.fivetran.enums import ConnectionSetupState, ConnectionSyncState from dmp.adapters.fivetran.models import ShopifyConnection from dmp.adapters.ows_notifications import ShopifyStoreSyncCompletedNotificationArgs from dmp.app_connections.enums import AppConnectionStatus from dmp.shopify.handlers import NotifyStoreSyncCompletedHandler from dmp.shopify.models import ShopifyShop, ShopifyStoreAssociation from dmp.shopify.repositories import StoreAssociationRepository from tests.unit.types import BuildModel, CreateReportingModel class TestNotifyStoreSyncCompletedHandler: @pytest.mark.db def test_handle_transformation_success_store_connected( self, handler: NotifyStoreSyncCompletedHandler, build_model: BuildModel, create_reporting_model: CreateReportingModel, ows_notifications_client_mock: mock.MagicMock, store_association_repository: StoreAssociationRepository, fivetran_client_mock: mock.MagicMock, ) -> None: fivetran_connection = build_model( ShopifyConnection, status={ "setup_state": ConnectionSetupState.CONNECTED, "sync_state": ConnectionSyncState.SCHEDULED, }, ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.SYNCING ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, initial_email_sent=True, ) association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, initial_email_sent=False, ) create_reporting_model( ShopifyShop, source_schema=association.fivetran_schema, ) ows_notifications_client_mock.notify_shopify_store_sync_completed.return_value = True fivetran_client_mock.get_shopify_connection.return_value = fivetran_connection updated_associations = handler.handle() ows_notifications_client_mock.notify_shopify_store_sync_completed.assert_called_once_with( ShopifyStoreSyncCompletedNotificationArgs( identity_id=association.created_by, store_id=association.id, store_domain=association.shop_domain, is_multiartist_store=association.is_multi_artist_store, ) ) assert len(updated_associations) == 1 assert updated_associations[0].id == association.id assert updated_associations[0].initial_email_sent assert ( not store_association_repository.find_to_notify_on_initial_sync_completion() ) @pytest.mark.db def test_handle_transformation_success_store_waiting_for_processing( self, handler: NotifyStoreSyncCompletedHandler, build_model: BuildModel, create_reporting_model: CreateReportingModel, ows_notifications_client_mock: mock.MagicMock, store_association_repository: StoreAssociationRepository, fivetran_client_mock: mock.MagicMock, ) -> None: fivetran_connection = build_model( ShopifyConnection, status={ "setup_state": ConnectionSetupState.CONNECTED, "sync_state": ConnectionSyncState.SCHEDULED, }, ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.SYNCING ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, initial_email_sent=True, ) association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.WAITING_FOR_PROCESSING, initial_email_sent=False, ) create_reporting_model( ShopifyShop, source_schema=association.fivetran_schema, ) ows_notifications_client_mock.notify_shopify_store_sync_completed.return_value = True fivetran_client_mock.get_shopify_connection.return_value = fivetran_connection updated_associations = handler.handle() ows_notifications_client_mock.notify_shopify_store_sync_completed.assert_called_once_with( ShopifyStoreSyncCompletedNotificationArgs( identity_id=association.created_by, store_id=association.id, store_domain=association.shop_domain, is_multiartist_store=association.is_multi_artist_store, ) ) assert len(updated_associations) == 1 assert updated_associations[0].id == association.id assert updated_associations[0].initial_email_sent assert ( not store_association_repository.find_to_notify_on_initial_sync_completion() ) @pytest.mark.db def test_handle_transformation_success_email_not_sent( self, handler: NotifyStoreSyncCompletedHandler, ows_notifications_client_mock: mock.MagicMock, store_association_repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, initial_email_sent=False, ) create_reporting_model( ShopifyShop, source_schema=association.fivetran_schema, ) ows_notifications_client_mock.notify_shopify_store_sync_completed.return_value = False updated_associations = handler.handle() assert len(updated_associations) == 0 unnotified_associations = ( store_association_repository.find_to_notify_on_initial_sync_completion() ) assert len(unnotified_associations) == 1 assert unnotified_associations[0].id == association.id