"""Tests for common proper functions.""" from unittest.mock import call, MagicMock, patch import pytest from feed_sender.flows.proper_new_releases_tracks.conf import settings from feed_sender.util import proper_common from tests.flows.proper_fixtures import sqs_messages from tests.flows.proper_fixtures import sqs_messages_duplicate @patch('feed_sender.util.proper_common.config') @patch('feed_sender.util.proper_common.settings') @patch('feed_sender.util.proper_common.mysql') def test_get_proper_queue_name(mock_mysql, mock_settings, mock_config): """Check if correct queue name is created.""" mock_settings.VECTOR_JOB_QUEUE_NAME = 'settings-{e_priority}-{d_priority}' mock_settings.STORE_ID = '555' mock_config.VECTOR_JOB_QUEUE_NAME = 'config-{e_priority}-{d_priority}' mock_config.STORE_ID = '555' mock_results = [{'priority': 555}] mock_mysql.execute_query.return_value = mock_results queue_name = proper_common.get_proper_queue_name(MagicMock()) assert mock_mysql.execute_query.called assert queue_name == 'settings-2-555' @patch('feed_sender.util.proper_common.config') @patch('feed_sender.util.proper_common.settings') @patch('feed_sender.util.proper_common.mysql') def test_get_proper_queue_name_changed(mock_mysql, mock_settings, mock_config): """Check if correct queue name is created.""" mock_settings.VECTOR_JOB_QUEUE_NAME = 'settings-{e_priority}-{d_priority}' mock_settings.STORE_ID = '555' mock_config.VECTOR_JOB_QUEUE_NAME = 'config-{e_priority}-{d_priority}' mock_config.STORE_ID = '555' mock_results = [{'priority': 555}] mock_mysql.execute_query.return_value = mock_results queue_name = proper_common.get_proper_queue_name(MagicMock(), True) assert mock_mysql.execute_query.called assert queue_name == 'config-1-555' @patch('feed_sender.util.proper_common.mysql') @patch('feed_sender.util.proper_common.sqs') def test_get_products_from_queue_for_new_releases(mock_sqs, mock_mysql): """Test get queue messages for new releases.""" mock_results = [{'priority': 555}] mock_mysql.execute_query.return_value = mock_results mock_sqs.get_messages.return_value = sqs_messages() expected = {'release_ids': [1, 2], 'job_ids': [(11111, 1), (22222, 2)]} actual = proper_common.get_products_from_queue(MagicMock()) mock_sqs.get_messages.assert_called_with( '{}-encoding23_e0000002_d0000555'.format(settings.ENV)) assert actual == expected assert mock_sqs.get_messages.return_value[0].delete.called assert mock_sqs.get_messages.return_value[1].delete.called assert not mock_sqs.get_messages.return_value[2].delete.called @patch('feed_sender.util.proper_common.mysql') @patch('feed_sender.util.proper_common.sqs') @patch('feed_sender.util.proper_common.job_status') def test_get_products_from_queue_for_new_releases_dupe( mock_job_status, mock_sqs, mock_mysql): """Test get queue messages for new releases.""" mock_results = [{'priority': 555}] mock_mysql.execute_query.return_value = mock_results mock_job_status.update.return_value = True mock_sqs.get_messages.return_value = sqs_messages_duplicate() expected = { 'release_ids': [1, 2], 'job_ids': [(22222, 2), (55555, 1)]} actual = proper_common.get_products_from_queue(MagicMock()) mock_sqs.get_messages.assert_called_with( '{}-encoding23_e0000002_d0000555'.format(settings.ENV)) assert actual == expected assert mock_sqs.get_messages.return_value[0].delete.called assert mock_sqs.get_messages.return_value[1].delete.called assert mock_sqs.get_messages.return_value[3].delete.called assert mock_sqs.get_messages.return_value[4].delete.called assert not mock_sqs.get_messages.return_value[2].delete.called calls = [ call( { 'error_log': 'Duplicate job found', 'status': 'system_cancelled', 'eqd_id': 11111 } ), call( { 'error_log': 'Duplicate job found', 'status': 'system_cancelled', 'eqd_id': 44444 } ) ] mock_job_status.update.assert_has_calls(calls, any_order=True) @patch('feed_sender.util.proper_common.mysql') @patch('feed_sender.util.proper_common.sqs') def test_get_products_from_queue_for_updated_releases(mock_sqs, mock_mysql): """Test queue messages for updated releases.""" mock_results = [{'priority': 555}] mock_mysql.execute_query.return_value = mock_results mock_sqs.get_messages.return_value = sqs_messages() expected = {'release_ids': [3], 'job_ids': [(33333, 3)]} actual = proper_common.get_products_from_queue(MagicMock(), True) mock_sqs.get_messages.assert_called_with( '{}-encoding23_e0000001_d0000555'.format(settings.ENV)) assert actual == expected assert not mock_sqs.get_messages.return_value[0].delete.called assert not mock_sqs.get_messages.return_value[1].delete.called assert mock_sqs.get_messages.return_value[2].delete.called @patch('feed_sender.util.proper_common.smart_open') def test_save_release_ids_to_s3(mock_open, mock_smart_open_obj): """Test if _release_ids are written to file in s3.""" # mock smart_open and file handles. mock_open.smart_open.return_value = mock_smart_open_obj # call function under test. proper_common.save_release_ids_to_s3('s3://abc', 'file.csv', [1, 2]) release_id_to_write = '1\n' mock_smart_open_obj.__enter__.return_value.write.assert_any_call(release_id_to_write) @patch('feed_sender.util.proper_common.smart_open') def test_save_job_ids_to_s3(mock_open, mock_smart_open_obj): """Test if _job_ids are written to file in s3.""" # mock smart_open and file handles. mock_open.smart_open.return_value = mock_smart_open_obj # call function under test. proper_common.save_job_ids_to_s3( 's3://abc', 'file.csv', [(11111, 1), (22222, 2)]) job_id_to_write = '11111,1\n' mock_smart_open_obj.__enter__.return_value.write.assert_any_call(job_id_to_write) @patch('feed_sender.util.proper_common.s3') def test_get_ids_from_s3(mock_s3): """Test get IDs from S3.""" mock_s3.read_s3_object.return_value = '1,11111\n2,22222\n3,33333\n' ids = proper_common.get_ids_from_s3(MagicMock(), MagicMock()) assert ids.get('release_ids') == [11111, 22222, 33333] assert ids.get('job_ids') == [1, 2, 3] @patch('feed_sender.util.proper_common.s3') def test_get_ids_from_s3_no_return(mock_s3): """Test get IDs from S3.""" mock_s3.read_s3_object.return_value = '' ids = proper_common.get_ids_from_s3(MagicMock(), MagicMock()) assert ids.get('release_ids') == [] assert ids.get('job_ids') == [] @patch('feed_sender.util.proper_common.functools') def test_get_ows_pricing(mock_functools): """Test get pricing from ows-pricing.""" json_content = ( '{"items": [' '{"territories": ["US", "CA"], "price_code": "16.00"},' '{"territories": ["WW"], "price_code": "XXX"}]}') mock_response = MagicMock() mock_response.status_code = 200 mock_response.content = json_content.encode('utf-8') mock_get_request = MagicMock() mock_functools.partial.return_value = mock_get_request mock_get_request.return_value = mock_response assert proper_common.get_ows_pricing(3453245) == '16.00' @patch('feed_sender.util.proper_common.functools') def test_get_ows_pricing_no_price(mock_functools): """Test get pricing from ows-pricing.""" with pytest.raises(Exception) as error_info: product_id = 3453245 json_content = ( '{"items": [' '{"territories": ["WW"], "price_code": "XXX"}]}') mock_response = MagicMock() mock_response.status_code = 200 mock_response.content = json_content.encode('utf-8') mock_get_request = MagicMock() mock_functools.partial.return_value = mock_get_request mock_get_request.return_value = mock_response proper_common.get_ows_pricing(product_id) assert error_info.value.message == ( 'Pricing not found for product ID: {product_id}'.format( product_id=product_id)) @patch('feed_sender.util.proper_common.functools') def test_get_ows_pricing_service_error(mock_functools): """Test get pricing from ows-pricing.""" with pytest.raises(Exception) as error_info: product_id = 3453245 mock_response = MagicMock() mock_response.status_code = 500 mock_response.content.message = 'fatal error' mock_get_request = MagicMock() mock_functools.partial.return_value = mock_get_request mock_get_request.return_value = mock_response proper_common.get_ows_pricing(product_id) assert error_info.value.message == ( 'Request to ows-pricing microservice failed: fatal error')