from typing import Any from unittest import mock import pytest from dmp.adapters.fivetran.models import StandardConfig from dmp.app_connections.enums import AppConnectionStatus from dmp.shopify.handlers import ( SyncShopifyFivetranTablesStateHandler, SyncShopifyFivetranTablesStateRequest, ) from dmp.shopify.models import ShopifyStoreAssociation from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, CreateReportingModel test_schema_config: dict[str, Any] = { "enable_new_by_default": True, "schema_change_handling": "ALLOW_ALL", "schemas": { "store_7123_test_label_001": { "enabled": True, "name_in_destination": "store_7123_test_label_001_manual", "tables": { "abandoned_checkout_applied_discount": { "enabled": True, "enabled_patch_settings": { "allowed": False, "reason_code": "NOT_SELECTABLE_CHILD_TABLE", }, "name_in_destination": "abandoned_checkout_applied_discount", }, "tender_transaction": { "enabled": True, "enabled_patch_settings": {"allowed": True}, "name_in_destination": "tender_transaction", }, }, } }, } class TestSyncShopifyFivetranTablesStateHandler: @pytest.mark.db def test_sync_fivetran_tables_for_single_connection( self, handler: SyncShopifyFivetranTablesStateHandler, fivetran_client_mock: mock.MagicMock, create_reporting_model: CreateReportingModel, build_model: BuildModel, fake: FakerTyped, ) -> None: connection_id = fake.pystr() connector_schema = build_model( StandardConfig, schemas=test_schema_config.get("schemas") ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, fivetran_connector_id=connection_id, ) fivetran_client_mock.get_connection_schema_config.return_value = ( connector_schema ) response = handler.handle( SyncShopifyFivetranTablesStateRequest( fivetran_connection_id=connection_id, ) ) assert response == {connection_id} fivetran_client_mock.patch_connection_schema_config.assert_called_once() @pytest.mark.db def test_sync_fivetran_tables_for_all_connections( self, handler: SyncShopifyFivetranTablesStateHandler, fivetran_client_mock: mock.MagicMock, create_reporting_model: CreateReportingModel, build_model: BuildModel, ) -> None: connector_schema = build_model( StandardConfig, schemas=test_schema_config.get("schemas") ) store_1 = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, ) store_2 = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.ERROR, ) fivetran_client_mock.get_connection_schema_config.return_value = ( connector_schema ) response = handler.handle( SyncShopifyFivetranTablesStateRequest( fivetran_connection_id=None, ) ) assert response == { store_1.fivetran_connector_id, store_2.fivetran_connector_id, } assert fivetran_client_mock.patch_connection_schema_config.call_count == 2