"""Lambda test module.""" from copy import deepcopy import json from unittest.mock import patch import pytest from src import app as index asset_message = { 'function': 'asset-transcoder-acknowledge', 'status': 'upload_complete', 'filename': 'ff5287e7_ba4f_4b7e_9d2a_f18bae2444d3.jpg', 'bucket': 'dev-orcd-asset-transcoder-input', 'status_time': '2020-05-12T22:33:43.644257Z' } sns_event = { 'Records': [ { 'Sns': { 'Message': json.dumps(asset_message), 'Timestamp': 'timestamp' } } ] } error_asset = deepcopy(asset_message) error_asset['status'] = 'image_validation_error' error_asset['errors'] = {'image_wrong_aspect_ratio_error': 'Image has non-square aspect ratio'} sns_event_with_errors = { 'Records': [ { 'Sns': { 'Message': json.dumps(error_asset), 'Timestamp': 'timestamp' } } ] } @patch('owsrequest.request.process') def test_handler_success(process): """Test index.handler function success.""" process.return_value.status_code = 200 result = index.handler(sns_event, None) assert result == {'message': 'general status message sent', 'status': 'OK'} process.assert_called_with( application='lambda-asset-transcoder-general-status-notification', environment='test', method='POST', service_name='ows-asset-transcoder', path='/status', json={ 'filename': 'ff5287e7_ba4f_4b7e_9d2a_f18bae2444d3.jpg', 'status': 'upload_complete', 'timestamp': '2020-05-12T22:33:43.644257Z'}) @patch('owsrequest.request.process') def test_handler_with_asset_errors(process): """Test index.handler function with an error status.""" process.return_value.status_code = 200 result = index.handler(sns_event_with_errors, None) assert result == {'message': 'general status message sent', 'status': 'OK'} process.assert_called_with( application='lambda-asset-transcoder-general-status-notification', environment='test', method='POST', service_name='ows-asset-transcoder', path='/status', json={ 'filename': 'ff5287e7_ba4f_4b7e_9d2a_f18bae2444d3.jpg', 'status': 'image_validation_error', 'timestamp': '2020-05-12T22:33:43.644257Z', 'errors': {'image_wrong_aspect_ratio_error': 'Image has non-square aspect ratio'}}) @patch('owsrequest.request.process') def test_handler_with_missing_filename(process): """Test index.handler with an invalid message.""" bad_message = deepcopy(asset_message) del bad_message['filename'] bad_sns_event = { 'Records': [ { 'Sns': { 'Message': json.dumps(bad_message), 'Timestamp': 'timestamp' } } ] } with pytest.raises(index.SnsParseError): index.handler(bad_sns_event, None) process.assert_not_called() @patch('owsrequest.request.process') def test_handler_with_missing_status(process): """Test index.handler with an invalid message.""" process.return_value.status_code = 200 bad_message = deepcopy(asset_message) del bad_message['status'] bad_sns_event = { 'Records': [ { 'Sns': { 'Message': json.dumps(bad_message), 'Timestamp': 'timestamp' } } ] } with pytest.raises(index.SnsParseError) as err: index.handler(bad_sns_event, None) process.assert_called_with( application='lambda-asset-transcoder-general-status-notification', environment='test', method='POST', service_name='ows-asset-transcoder', path='/status', json={ 'filename': 'ff5287e7_ba4f_4b7e_9d2a_f18bae2444d3.jpg', 'status': 'status_error', 'timestamp': '2020-05-12T22:33:43.644257Z', 'errors': {'sns_parse_error': err.value.error} }) @patch('owsrequest.request.process') def test_get_general_status_details_missing_message_failure(process): """Test for fail extraction of status details with missing field.""" data = deepcopy(sns_event) del data['Records'][0]['Sns']['Message'] with pytest.raises(Exception): index.sns_event_get_general_status_details(data) process.assert_not_called() @patch('owsrequest.request.process') def test_get_general_status_details_not_json_message_failure(process): """Test for fail extraction of status details with incorrect status.""" data = deepcopy(sns_event) data['Records'][0]['Sns']['Message'] = '123' with pytest.raises(Exception): index.sns_event_get_general_status_details(data) process.assert_not_called()