from unittest import mock from dapd_exporter_lambda import DTFRunner from dapd_exporter_lambda.const import STATUS_FAILURE, STATUS_OK def test_clean_event__ok_for_decibel(): lambda_event = { 'Records': [{ 'messageId': 'e51cf215-fd90-4154-842e-609e8d2175ba', 'receiptHandle': 'AQEBCaiS1dYzcljppQFlI3+2j/brV1WBKjeiyb7zolqtI14dZhL8AZMY2Z', 'body': '{"Records":[{"eventVersion":"2.1","eventSource":"aws:s3",' '"awsRegion":"us-east-1","eventTime":"2020-12-24T17:45:26.675Z",' '"eventName":"ObjectCreated:Put","userIdentity":{"principalId":' '"AWS:AROAW5KFGTC7RLTLQQ2Z3:assumed-session"},"requestParameters":{"s' 'ourceIPAddress":"10.50.14.130"},"responseElements":{"x-amz-request-' 'id":"89774D48F1147A63","x-amz-id-2":"0grPVKbIv09U+Qa9Fby2fsXWtgRD' 'dlnVIcXvMW9Mg5gcWu8AbFPVxIFuvlrI3OQm1izW+bNxCz3PixhiRNxP6eu76PmQkPg3"},' '"s3":{"s3SchemaVersion":"1.0","configurationId":"tf-s3-queue-2' '0201224125543985500000001","bucket":{"name":"dev-delphi-decibel"' ',"ownerIdentity":{"principalId":"A1XVSKD17VITYG"},"arn":"arn:a' 'ws:s3:::dev-delphi-decibel"},"object":{"key":"ADS_DATA/report_date' '%3D2020-12-21/timestamp%3D2020-12-21T16%3A55%3A15/_success","size' '":4,"eTag":"c157a79031e1c40f85931829bc5fc552","sequencer":"005F' 'E4D3C088F14B03"}}}]}', 'attributes': { 'ApproximateReceiveCount': '1', 'SentTimestamp': '1608831938674', 'SenderId': 'AIDAJHIPRHEMV73VRJEBU', 'ApproximateFirstReceiveTimestamp': '1608840873888' }, 'messageAttributes': {}, 'md5OfBody': 'a396f790b07b97e4eb2462094bed1244', 'eventSource': 'aws:sqs', 'eventSourceARN': 'arn:aws:sqs:us-east-1:475275892927:dev-delphi-public-data-e' 'xporter-s3-events', 'awsRegion': 'us-east-1' }] } expected = { 'project': 'decibel', 'file_path': 's3://dev-delphi-decibel/ADS_DATA/report_date=2020-12-21/' 'timestamp=2020-12-21T16:55:15/_success', } actual = DTFRunner._clean_event(event=lambda_event) # pylint: disable=W0212 assert actual == expected def test_clean_event__improper_file_name(): lambda_event = { 'Records': [{ 'messageId': 'e51cf215-fd90-4154-842e-609e8d2175ba', 'receiptHandle': 'AQEBCaiS1dYzcljppQFlI3+2j/brV1WBKjeiyb7zolqtI14dZhL8AZMY2Z', 'body': '{"Records":[{"eventVersion":"2.1","eventSource":"aws:s3",' '"awsRegion":"us-east-1","eventTime":"2020-12-24T17:45:26.675Z",' '"eventName":"ObjectCreated:Put","userIdentity":{"principalId":' '"AWS:AROAW5KFGTC7RLTLQQ2Z3:assumed-session"},"requestParameters":{"s' 'ourceIPAddress":"10.50.14.130"},"responseElements":{"x-amz-request-' 'id":"89774D48F1147A63","x-amz-id-2":"0grPVKbIv09U+Qa9Fby2fsXWtgRD' 'dlnVIcXvMW9Mg5gcWu8AbFPVxIFuvlrI3OQm1izW+bNxCz3PixhiRNxP6eu76PmQkPg3"},' '"s3":{"s3SchemaVersion":"1.0","configurationId":"tf-s3-queue-2' '0201224125543985500000001","bucket":{"name":"dev-delphi-decibel"' ',"ownerIdentity":{"principalId":"A1XVSKD17VITYG"},"arn":"arn:a' 'ws:s3:::dev-delphi-decibel"},"object":{"key":"ADS_DATA/report_date' '%3D2020-12-21/timestamp%3D2020-12-21T16%3A55%3A15/_foo","size' '":4,"eTag":"c157a79031e1c40f85931829bc5fc552","sequencer":"005F' 'E4D3C088F14B03"}}}]}', 'attributes': { 'ApproximateReceiveCount': '1', 'SentTimestamp': '1608831938674', 'SenderId': 'AIDAJHIPRHEMV73VRJEBU', 'ApproximateFirstReceiveTimestamp': '1608840873888' }, 'messageAttributes': {}, 'md5OfBody': 'a396f790b07b97e4eb2462094bed1244', 'eventSource': 'aws:sqs', 'eventSourceARN': 'arn:aws:sqs:us-east-1:475275892927:dev-delphi-public-data-e' 'xporter-s3-events', 'awsRegion': 'us-east-1' }] } actual = DTFRunner._clean_event(event=lambda_event) # pylint: disable=W0212 assert actual is None def test_clean_event__invalid_event_content(): lambda_event = { 'Records': [{ 'messageId': 'e51cf215-fd90-4154-842e-609e8d2175ba', 'receiptHandle': 'AQEBCaiS1dYzcljppQFlI3+2j/brV1WBKjeiyb7zolqtI14dZhL8AZMY2Z', 'body': 'foo bar', 'attributes': { 'ApproximateReceiveCount': '1', 'SentTimestamp': '1608831938674', 'SenderId': 'AIDAJHIPRHEMV73VRJEBU', 'ApproximateFirstReceiveTimestamp': '1608840873888' }, 'messageAttributes': {}, 'md5OfBody': 'a396f790b07b97e4eb2462094bed1244', 'eventSource': 'aws:sqs', 'eventSourceARN': 'arn:aws:sqs:us-east-1:475275892927:dev-delphi-public-data-e' 'xporter-s3-events', 'awsRegion': 'us-east-1' }] } actual = DTFRunner._clean_event(event=lambda_event) # pylint: disable=W0212 assert actual is None @mock.patch('dapd_exporter_lambda.handler.DTFRunner.execute') @mock.patch('dapd_exporter_lambda.entities.Config.to_dict') def test_runner_handler_success(config_to_dict, runner_execute, config): # pylint: disable=unused-argument lambda_event = {'project': 'dapd_apple'} expected = {'meta': {'status': STATUS_OK, 'created_uows': 5}} config_to_dict.return_value = {} runner = DTFRunner(env='test') runner_execute.return_value = 5 actual = runner.handler(event=lambda_event) assert actual == expected def test_runner_handler_failed(): expected = { 'meta': { 'details': '\'NoneType\' object has no attribute \'get\'', 'status': STATUS_FAILURE } } runner = DTFRunner(env='test') actual = runner.handler(event=None) assert actual == expected