from unittest import mock import pytest import sqlalchemy as sa from dmp.adapters.db import ReportingDB from dmp.app_connections.enums import AppConnectionStatus from dmp.shopify.handlers import DeleteStoreHandler, DeleteStoreRequest from dmp.shopify.models import ( ShopifyCollection, ShopifyCollectionArtist, ShopifyStoreAssociation, ) from dmp.shopify.repositories import ( CollectionArtistRepository, StoreAssociationRepository, ) from tests.unit.faker import FakerTyped from tests.unit.types import CreateReportingModel class TestDeleteStoreHandler: @pytest.mark.db def test_delete_store_in_pending_status( self, handler: DeleteStoreHandler, identity_id: str, fake: FakerTyped, create_reporting_model: CreateReportingModel, fivetran_client_mock: mock.MagicMock, store_association_repository: StoreAssociationRepository, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, fivetran_connector_id=fake.pystr(), status=AppConnectionStatus.PENDING, shop=None, ) handler.handle( DeleteStoreRequest(identity_id=identity_id, association_id=association.id) ) fivetran_client_mock.delete_connection.assert_called_once_with( association.fivetran_connector_id ) updated_association = store_association_repository.first() assert updated_association assert updated_association.status == AppConnectionStatus.DELETED @pytest.mark.db def test_delete_store_in_non_pending_status( self, handler: DeleteStoreHandler, reporting_db: ReportingDB, identity_id: str, fake: FakerTyped, create_reporting_model: CreateReportingModel, fivetran_client_mock: mock.MagicMock, store_association_repository: StoreAssociationRepository, collection_artist_repository: CollectionArtistRepository, ) -> None: association = create_reporting_model( ShopifyStoreAssociation, fivetran_connector_id=fake.pystr(), status=AppConnectionStatus.CONNECTED, shop=None, ) collection = create_reporting_model( ShopifyCollection, source_schema=association.fivetran_schema ) create_reporting_model( ShopifyCollectionArtist, association_id=association.id, collection_id=collection.id, global_participant_id=fake.uuid4_string(), ) reporting_db.session.execute( sa.text(f"CREATE SCHEMA {association.fivetran_schema};") ) handler.handle( DeleteStoreRequest(identity_id=identity_id, association_id=association.id) ) fivetran_client_mock.delete_connection.assert_called_once_with( association.fivetran_connector_id ) updated_association = store_association_repository.first() assert updated_association assert updated_association.status == AppConnectionStatus.DELETED assert not collection_artist_repository.all() assert not reporting_db.session.execute( sa.text( f"SELECT * FROM pg_catalog.pg_namespace WHERE nspname = lower('{association.fivetran_schema}')" ) ).one_or_none()