import pytest from dirty_equals import IsList from fansifter_common.auth.account import Account from dmp.app_connections.enums import AppConnectionStatus from dmp.shopify.models import ( ShopifyCollection, ShopifyCollectionArtist, ShopifyShop, ShopifyStoreAssociation, ) from dmp.shopify.repositories import StoreAssociationRepository from tests.unit.faker import FakerTyped from tests.unit.types import CreateReportingModel class TestStoreAssociationRepository: @pytest.mark.db def test_get_count_by_account_id_vendor_id( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: vendor_id_1 = 7123 vendor_id_2 = 7777 create_reporting_model( ShopifyStoreAssociation, vendor_id=vendor_id_1, subaccount_id=0 ) create_reporting_model( ShopifyStoreAssociation, vendor_id=vendor_id_1, subaccount_id=0 ) create_reporting_model( ShopifyStoreAssociation, vendor_id=vendor_id_2, subaccount_id=0 ) count = repository.get_count_by_account_id( vendor_id=vendor_id_1, subaccount_id=0 ) assert count == 2 @pytest.mark.db def test_get_count_by_account_id_vendor_id_subaccount_id( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: account = Account(vendor_id=7123, subaccount_id=10000) create_reporting_model(ShopifyStoreAssociation, vendor_id=account.vendor_id) create_reporting_model( ShopifyStoreAssociation, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) create_reporting_model( ShopifyStoreAssociation, vendor_id=account.vendor_id, subaccount_id=account.subaccount_id, ) count = repository.get_count_by_account_id( vendor_id=account.vendor_id, subaccount_id=account.subaccount_id ) assert count == 2 @pytest.mark.db def test_find_by_account_ids_for_vendor( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: account_1 = Account(vendor_id=100, subaccount_id=0) account_2 = Account(vendor_id=200, subaccount_id=0) create_reporting_model( ShopifyStoreAssociation, vendor_id=account_1.vendor_id, subaccount_id=account_1.subaccount_id, ) create_reporting_model( ShopifyStoreAssociation, vendor_id=account_2.vendor_id, subaccount_id=account_2.subaccount_id, ) stores = repository.find_by_account_ids( vendor_ids=[account_1.vendor_id], subaccount_ids=[] ) assert len(stores) == 1 assert stores[0].vendor_id == account_1.vendor_id assert stores[0].subaccount_id == account_1.subaccount_id @pytest.mark.db def test_find_by_account_ids_for_subaccount( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: account_1 = Account(vendor_id=100, subaccount_id=0) account_2 = Account(vendor_id=100, subaccount_id=1000) create_reporting_model( ShopifyStoreAssociation, vendor_id=account_1.vendor_id, subaccount_id=account_1.subaccount_id, ) create_reporting_model( ShopifyStoreAssociation, vendor_id=account_2.vendor_id, subaccount_id=account_2.subaccount_id, ) stores = repository.find_by_account_ids(vendor_ids=[], subaccount_ids=[1000]) assert len(stores) == 1 assert stores[0].vendor_id == account_2.vendor_id assert stores[0].subaccount_id == account_2.subaccount_id @pytest.mark.db def test_find_by_account_ids_skips_deleted_stores( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.DELETED ) stores = repository.find_by_account_ids( vendor_ids=[association.vendor_id], subaccount_ids=[association.subaccount_id], ) assert len(stores) == 0 @pytest.mark.db def test_find_by_account_ids_store_has_custom_domain( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: myshopify_domain = "exampleartist.myshopify.com" custom_domain = "exampleartist.com" association = create_reporting_model( ShopifyStoreAssociation, shop_domain=myshopify_domain, status=AppConnectionStatus.CONNECTED, ) create_reporting_model( ShopifyShop, domain=custom_domain, myshopify_domain=myshopify_domain, source_schema=association.fivetran_schema, ) stores = repository.find_by_account_ids( vendor_ids=[association.vendor_id], subaccount_ids=[association.subaccount_id], ) assert stores assert stores[0].custom_domain == custom_domain @pytest.mark.db def test_find_by_account_ids_store_has_no_custom_domain( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: myshopify_domain = "exampleartist.myshopify.com" custom_domain = "exampleartist.myshopify.com" association = create_reporting_model( ShopifyStoreAssociation, shop_domain=myshopify_domain, status=AppConnectionStatus.CONNECTED, ) create_reporting_model( ShopifyShop, domain=custom_domain, myshopify_domain=myshopify_domain, source_schema=association.fivetran_schema, ) stores = repository.find_by_account_ids( vendor_ids=[association.vendor_id], subaccount_ids=[association.subaccount_id], ) assert stores assert stores[0].custom_domain is None @pytest.mark.db def test_find_by_account_ids_single_artist_store( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, fake: FakerTyped, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, global_participant_id=fake.uuid4_string(), ) create_reporting_model( ShopifyShop, source_schema=association.fivetran_schema, ) stores = repository.find_by_account_ids( vendor_ids=[association.vendor_id], subaccount_ids=[association.subaccount_id], ) assert stores assert stores[0].artists_count == 1 @pytest.mark.db def test_find_by_account_ids_multi_artist_store( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, fake: FakerTyped, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, global_participant_id=None, ) create_reporting_model( ShopifyShop, source_schema=association.fivetran_schema, ) collection_1 = create_reporting_model(ShopifyCollection) create_reporting_model( ShopifyCollectionArtist, association_id=association.id, collection_id=collection_1.id, global_participant_id=fake.uuid4_string(), ) collection_2 = create_reporting_model(ShopifyCollection) create_reporting_model( ShopifyCollectionArtist, association_id=association.id, collection_id=collection_2.id, global_participant_id=fake.uuid4_string(), ) stores = repository.find_by_account_ids( vendor_ids=[association.vendor_id], subaccount_ids=[association.subaccount_id], ) assert stores assert stores[0].artists_count == 2 @pytest.mark.db def test_find_to_notify_on_processing_completion_store_waiting_for_processing( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: 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, ) associations = repository.find_to_notify_on_initial_sync_completion() assert len(associations) == 1 assert associations[0].id == association.id assert associations[0].status == AppConnectionStatus.WAITING_FOR_PROCESSING assert associations[0].initial_email_sent is False @pytest.mark.db def test_find_to_notify_on_processing_completion_store_connected( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.SYNCING ) create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.SYNCING, 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, ) associations = repository.find_to_notify_on_initial_sync_completion() assert len(associations) == 1 assert associations[0].id == association.id assert associations[0].status == AppConnectionStatus.CONNECTED assert associations[0].initial_email_sent is False @pytest.mark.db def test_get_fivetran_connections_ids( self, repository: StoreAssociationRepository, create_reporting_model: CreateReportingModel, ) -> None: create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.WAITING_FOR_PROCESSING, initial_email_sent=False, ) connected_association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.CONNECTED, initial_email_sent=False, ) syncing_association = create_reporting_model( ShopifyStoreAssociation, status=AppConnectionStatus.SYNCING, initial_email_sent=True, ) result = repository.get_fivetran_connections_ids() assert result assert result == IsList( connected_association.fivetran_connector_id, syncing_association.fivetran_connector_id, check_order=False, )