"""Salesforce consumer tests.""" from unittest.mock import MagicMock from unittest.mock import patch from datetime import datetime from datetime import timedelta import pytest from simple_salesforce import SalesforceError from src.salesforce_consumer import SalesforceConsumer import config @patch('src.salesforce_consumer.TopicPartition') @patch('src.salesforce_consumer.DeserializingConsumer') @patch('src.salesforce_consumer.SerializingProducer') @patch('src.salesforce_consumer.AdminClient') @patch('src.salesforce_consumer.Salesforce') @patch('src.salesforce_consumer.requests') @patch('src.salesforce_consumer.config.secrets_manager_client') def test_successfull_process( sm_mock, requests_mock, sf_mock, admin_mock, producer_mock, consumer_mock, tp_mock): """Test successful SalesForce polling and sending to Kafka.""" test_kafka_topic = 'test' test_sync_id = '2' test_contact = { 'Account': {'Name': 'testname'}, 'FirstName': 'a', 'LastName': 'b', 'OrchardSyncId__c': test_sync_id } massaged_contact = { 'FirstName': 'a', 'LastName': 'b', 'OrchardSyncId__c': test_sync_id, 'ArtistName__c': 'testname' } poll_mock = MagicMock() poll_mock.error.return_value = False poll_mock.value.return_value = {'last_id': '1'} consumer_mock_obj = MagicMock() consumer_mock_obj.get_watermark_offsets.return_value = (0, 10) consumer_mock_obj.poll.return_value = poll_mock consumer_mock.return_value = consumer_mock_obj sf_mock_object = MagicMock() sf_mock_object.query.return_value = { 'totalSize': 1, 'records': [test_contact] } sf_mock.return_value = sf_mock_object offset_producer_mock_obj = MagicMock() producer_mock_obj = MagicMock() poller = SalesforceConsumer(kafka_topic=test_kafka_topic, with_delay=True) poller._offset_producer = offset_producer_mock_obj poller._producer = producer_mock_obj poller.process_contacts() sf_mock_object.query.assert_called() consumer_mock_obj.poll.assert_called() producer_mock_obj.produce.assert_called_with( test_kafka_topic, value=massaged_contact, key=test_sync_id, on_delivery=poller._delivery_report ) @patch('src.salesforce_consumer.TopicPartition') @patch('src.salesforce_consumer.DeserializingConsumer') @patch('src.salesforce_consumer.SerializingProducer') @patch('src.salesforce_consumer.AdminClient') @patch('src.salesforce_consumer.Salesforce') @patch('src.salesforce_consumer.requests') @patch('src.salesforce_consumer.config.secrets_manager_client') def test_retry_attempt_on_sf_exception( sm_mock, requests_mock, sf_mock, admin_mock, producer_mock, consumer_mock, tp_mock): """Test SalesForce polling and sending to Kafka with retry attempts.""" test_kafka_topic = 'test' poll_mock = MagicMock() poll_mock.error.return_value = False poll_mock.value.return_value = {'last_id': '1'} consumer_mock_obj = MagicMock() consumer_mock_obj.get_watermark_offsets.return_value = (0, 10) consumer_mock_obj.poll.return_value = poll_mock consumer_mock.return_value = consumer_mock_obj sf_mock_object = MagicMock() sf_mock_object.query.side_effect = SalesforceError( 'url', 'status', 'resource_name', 'content') sf_mock.return_value = sf_mock_object offset_producer_mock_obj = MagicMock() producer_mock_obj = MagicMock() poller = SalesforceConsumer(kafka_topic=test_kafka_topic, with_delay=False) poller._offset_producer = offset_producer_mock_obj poller._producer = producer_mock_obj with pytest.raises(SalesforceError): poller.process_contacts() assert sf_mock_object.query.call_count == config.RETRY_COUNT @patch('src.salesforce_consumer.TopicPartition') @patch('src.salesforce_consumer.DeserializingConsumer') @patch('src.salesforce_consumer.SerializingProducer') @patch('src.salesforce_consumer.AdminClient') @patch('src.salesforce_consumer.Salesforce') @patch('src.salesforce_consumer.requests') @patch('src.salesforce_consumer.config.secrets_manager_client') def test_delay_logic( sm_mock, requests_mock, sf_mock, admin_mock, producer_mock, consumer_mock, tp_mock): """Test SalesforceConsumer delay handling.""" kafka_topic = 'test' poll_mock = MagicMock() poll_mock.error.return_value = False poll_mock.value.return_value = {'last_id': '1'} consumer_mock_obj = MagicMock() consumer_mock_obj.get_watermark_offsets.return_value = (0, 10) consumer_mock_obj.poll.return_value = poll_mock consumer_mock.return_value = consumer_mock_obj poller = SalesforceConsumer(kafka_topic=kafka_topic, with_delay=True) delay = datetime.strptime(poller._end_date, '%Y-%m-%dT%H:%M:%SZ') - timedelta(hours=config.IMPORT_INTERVAL_HOURS) # noqa poller_expected_query = f""" SELECT Id, FirstName, LastName, Email, Role__c, Account.Name, Account.SpotifyUrl__c,Account.Orchard_Lead_Id__c, Account.SoundcloudUrl__c, Account.TiktokUrl__c, Account.InstagramUrl__c, Account.DeezerUrl__c,Account.YouTubeUrl__c, Account.AmazonMusicUrl__c, Account.TwitterUrl__c,Account.OtherUrl__c, Account.FacebookUrl__c, Language__c, Account.LeadScore__c,Account.Currency__c, Account.SigningEntity__c, ExternalTest__c, CorrelationId__c, Account.ExistingLabelParticipants__c,VoucherCode__c, VoucherCodeOwner__c, OrchardSyncId__c, Consultant__c,MailingCountry FROM Contact WHERE RecordTypeId = '0124W0000007nnWQAQ' AND (ExternalTest__c != TRUE OR Environment__c != 'prod') AND createddate <= {poller._end_date} AND Account.LeadScore__c != 'Review' AND OrchardSyncIdNumber__c > 1 ORDER BY OrchardSyncIdNumber__c """ # noqa poller.process_contacts() assert datetime.strptime(poller._end_date, '%Y-%m-%dT%H:%M:%SZ') poller._sf.query.assert_called_with(poller_expected_query.replace('\n ', '').strip())