"""Lambda test module.""" import boto3 from unittest import mock from moto import mock_s3 import os import pytest from constants import general import index import csv from urllib.parse import unquote_plus @pytest.fixture def event(): """Fixture that returns lambda event.""" return { 'Records': [ { 'eventVersion': '2.0', 'eventTime': '1970-01-01T00:00:00.000Z', 'requestParameters': { 'sourceIPAddress': '127.0.0.1' }, 's3': { 'configurationId': 'testConfigRule', 'object': { 'eTag': 'b9120b8ebaa8ad198fd0b31ea2bf99d4', 'sequencer': '0A1B2C3D4E5F678901', 'key': 'soundexchange-sales-stmt/raw_input/test.csv', 'size': 1024 }, 'bucket': { 'arn': 'arn:aws:s3:::test-s3-bucket', 'name': 'test-s3-bucket', 'ownerIdentity': { 'principalId': 'EXAMPLE' } }, 's3SchemaVersion': '1.0' }, 'responseElements': { 'x-amz-id-2': 'EXAMPLE123', 'x-amz-request-id': 'EXAMPLE123456789' }, 'awsRegion': 'us-east-1', 'eventName': 'ObjectCreated:Put', 'userIdentity': { 'principalId': 'EXAMPLE' }, 'eventSource': 'aws:s3' } ] } csv_content = [['Artist Name', 'Track Name', 'Album Name', 'LABEL_NAME'], ['artist1', 'track1', 'album1', 'label1'], ['artist2', 'track2', 'album2', 'label2'], ['artist3', 'track3', 'album3', 'label3']] expected_file1_rows = [['Artist Name', 'Track Name', 'Album Name', 'LABEL_NAME'], ['artist1', 'track1', 'album1', 'label1'], ['artist2', 'track2', 'album2', 'label2']] expected_file2_rows = [['Artist Name', 'Track Name', 'Album Name', 'LABEL_NAME'], ['artist3', 'track3', 'album3', 'label3']] def seed_s3(event, key_name='test.csv'): """Seed s3 with content for test cases.""" bucket_name = event['Records'][0]['s3']['bucket']['name'] key_contents = """Artist Name,Track Name,Album Name,LABEL_NAME artist1,track1,album1,label1 artist2,track2,album2,label2 artist3,track3,album3,label3""" s3 = boto3.resource('s3', region_name='eu-west-1') bucket = s3.create_bucket(Bucket=bucket_name) batchfile = s3.Object(bucket_name, key_name) batchfile.put(Body=key_contents) return bucket, batchfile def get_S3_csv_rows(bucket, key): """Read csv rows.""" s3 = boto3.resource('s3') obj = s3.Object(bucket, unquote_plus(key)) lines = obj.get()['Body'].read().decode().splitlines(True) reader = csv.reader(lines) csv_rows = [row for row in reader] return csv_rows @mock_s3 @mock.patch('index.get_chunk_size') def test_handler(mock_chunk_size, event): """Test Lambda entry point.""" key_name = event['Records'][0]['s3']['object']['key'] bucket_name = event['Records'][0]['s3']['bucket']['name'] seed_s3(event, key_name) mock_chunk_size.return_value = 2 index.handler(event, None) filename = os.path.basename(key_name) s3_path = general.SPLIT_SOUNDEXCHANGE_STMT_OUTPUT_PATH output_key_name1 = '{}/1_{}'.format(s3_path, filename) output_key_name2 = '{}/2_{}'.format(s3_path, filename) file1_rows = get_S3_csv_rows(bucket_name, output_key_name1) file2_rows = get_S3_csv_rows(bucket_name, output_key_name2) assert file1_rows == expected_file1_rows assert file2_rows == expected_file2_rows @mock_s3 def test_write_s3_file(event): """Test function to write S3 file into output staging file.""" key_name = event['Records'][0]['s3']['object']['key'] filename = os.path.basename(key_name) file_count = 1 output_key_name = '{}/{}_{}'.format( general.SPLIT_SOUNDEXCHANGE_STMT_OUTPUT_PATH, file_count, filename) bucket_name = event['Records'][0]['s3']['bucket']['name'] seed_s3(event, key_name) index.write_to_s3( bucket_name, key_name, file_count, csv_content[0], csv_content[1:]) allrows = get_S3_csv_rows(bucket_name, output_key_name) assert allrows == csv_content