"""Test handlers.""" import codecs import json from unittest.mock import MagicMock from unittest.mock import patch from flexmock import flexmock from deliveryhistory import handlers from deliveryhistory import response from deliveryhistory.models import delivery_report from deliveryhistory.models import delivery_xml from deliveryhistory.models import masters_delivery_history from deliveryhistory.response import Response @patch('deliveryhistory.handlers.g', spec=['log']) def test_exception_handler(mock_g, app_context): """Verify exception_Handler returns 500 status code and json payload.""" message = ( 'The server encountered an internal error ' 'and was unable to complete your request.') mock_error = MagicMock() server_response = handlers.exception_handler(mock_error) mock_g.log.exception.assert_called_with(mock_error) # assert status code is 500 assert server_response.status_code == 500 # assert json payload response_message = json.loads(server_response.data.decode()) assert response_message['message'] == message assert response_message['code'] == response.ERROR_CODE_INTERNAL_ERROR def test_get_masters(fixture_client, header_fixture, body_fixture): """Verify GET /masters/ returns valid response.""" (flexmock(masters_delivery_history) .should_receive('get_delivery_history') .and_return(Response(body_fixture))) result = fixture_client.get( '/masters/123?isrcs=ISRC1,ISRC2', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert len(json_data['items']) == 1 def test_post_masters(fixture_client, header_fixture, body_fixture): """Verify POST /masters/ returns valid response.""" (flexmock(masters_delivery_history) .should_receive('save_delivery_history') .and_return(Response({'records_created': 1}))) result = fixture_client.post( '/masters', headers=header_fixture, data=json.dumps(body_fixture)) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert json_data['records_created'] == 1 def test_get_delivery_stores(fixture_client, header_fixture, stores_fixture): """Verify GET /delivered_stores_count returns valid response.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_count') .and_return(stores_fixture)) result = fixture_client.get( '/delivered_stores_count?upcs=5555', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert len(json_data['items']) == 1 assert json_data['items'][0] == stores_fixture[0] def test_get_delivery_stores_invalid_args( fixture_client, header_fixture, stores_fixture): """Verify GET /delivered_stores_count returns 400 response.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_count') .and_return(stores_fixture)) result = fixture_client.get( '/delivered_stores_count?upcs=5555s', headers=header_fixture) assert result.status_code == 400 def test_get_delivered_stores_details( fixture_client, header_fixture, delivery_history_fixture): """Verify GET /delivered_stores_details/ returns valid response.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) result = fixture_client.get( '/delivered_stores_details/5555', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert len(json_data['items']) == 1 assert json_data['items'][0] == delivery_history_fixture[0] def test_get_delivered_stores_details_with_store_id( fixture_client, header_fixture, delivery_history_fixture): """Verify GET /delivered_stores_details/?store_id= filters by store.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) result = fixture_client.get( '/delivered_stores_details/5555?store_id=3', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert len(json_data['items']) == 1 assert json_data['items'][0] == delivery_history_fixture[0] def test_get_delivered_stores_details_with_delivery_info_takedown( fixture_client, header_fixture, delivery_history_fixture): """Verify delivery_type is takedown when RightSharePercentage is 0.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) (flexmock(delivery_report) .should_receive('get_delivery_jobs') .and_return([{'store_id': 3, 'job_id': 99, 'meta_update': 'N', 'delivery_status': 'delivered'}])) (flexmock(delivery_xml) .should_receive('get_delivery_type') .with_args(99) .and_return(delivery_xml.DELIVERY_TYPE_TAKEDOWN)) result = fixture_client.get( '/delivered_stores_details/5555?delivery_info=true', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert json_data['items'][0]['delivery_type'] == delivery_xml.DELIVERY_TYPE_TAKEDOWN assert json_data['items'][0]['delivery_status'] == 'delivered' def test_get_delivered_stores_details_with_delivery_info_metadata_update( fixture_client, header_fixture, delivery_history_fixture): """Verify delivery_type is metadata_update when meta_update is true.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) (flexmock(delivery_report) .should_receive('get_delivery_jobs') .and_return([{'store_id': 3, 'job_id': 99, 'meta_update': 'Y', 'delivery_status': 'delivered'}])) (flexmock(delivery_xml) .should_receive('get_delivery_type') .with_args(99) .and_return(None)) result = fixture_client.get( '/delivered_stores_details/5555?delivery_info=true', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert json_data['items'][0]['delivery_type'] == delivery_xml.DELIVERY_TYPE_METADATA_UPDATE assert json_data['items'][0]['delivery_status'] == 'delivered' def test_get_delivered_stores_details_with_delivery_info_delivery( fixture_client, header_fixture, delivery_history_fixture): """Verify delivery_type is delivery when meta_update is false and not a takedown.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) (flexmock(delivery_report) .should_receive('get_delivery_jobs') .and_return([{'store_id': 3, 'job_id': 99, 'meta_update': 'N', 'delivery_status': 'delivered'}])) (flexmock(delivery_xml) .should_receive('get_delivery_type') .with_args(99) .and_return(None)) result = fixture_client.get( '/delivered_stores_details/5555?delivery_info=true', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert json_data['items'][0]['delivery_type'] == delivery_xml.DELIVERY_TYPE_DELIVERY assert json_data['items'][0]['delivery_status'] == 'delivered' def test_get_delivered_stores_details_with_delivery_info_no_job( fixture_client, header_fixture, delivery_history_fixture): """Verify delivery_type and delivery_status are None when no job row exists for the store.""" (flexmock(delivery_report) .should_receive('get_delivered_stores_details') .and_return(delivery_history_fixture)) (flexmock(delivery_report) .should_receive('get_delivery_jobs') .and_return([])) (flexmock(delivery_xml) .should_receive('get_delivery_type') .with_args(None) .and_return(None)) result = fixture_client.get( '/delivered_stores_details/5555?delivery_info=true', headers=header_fixture) assert result.status_code == 200 json_data = json.loads(codecs.utf_8_decode(result.data)[0]) assert json_data['items'][0]['delivery_type'] is None assert json_data['items'][0]['delivery_status'] is None