aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--src/extract_lambda.py12
-rw-r--r--tests/dummy.txt1
-rw-r--r--tests/test_extract_lambda.py49
4 files changed, 60 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..428f94e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+venv
+.env
+__pycache__/ \ No newline at end of file
diff --git a/src/extract_lambda.py b/src/extract_lambda.py
index 11ea5d1..dc70590 100644
--- a/src/extract_lambda.py
+++ b/src/extract_lambda.py
@@ -18,6 +18,7 @@ password = os.getenv('password')
host = os.getenv('host')
port = os.getenv('port')
+
def lambda_handler(event, context):
"""This lambda function connects to the Totesys database, lists the contents of the ingestion bucket,
and converts all tables to CSV and if any of those tables do not exist in, or are different to the ones in s3, it uploads them
@@ -69,27 +70,28 @@ def connect_to_database():
raise
-
-def list_existing_s3_files():
+def list_existing_s3_files(bucket_name='extract_bucket', client=boto3.client('s3')):
"""Creates a dictionary and populates it with the
results of listing the contents of the s3 bucket, then
returns the populated dictionary
"""
- client = boto3.client('s3')
+
existing_files = {}
try:
- response = client.list_objects_v2(Bucket=ingestion_bucket)
+ response = client.list_objects_v2(Bucket='extract_bucket')
if 'Contents' in response:
for obj in response['Contents']:
s3_key = obj['Key']
try:
- file_obj = client.get_object(Bucket=ingestion_bucket, Key=s3_key)
+ file_obj = client.get_object(Bucket=bucket_name, Key=s3_key)
file_content = file_obj['Body'].read().decode('utf-8')
existing_files[s3_key] = file_content
except ClientError as e:
logger.error(f'Error retrieving S3 object {s3_key}: {e}')
+ else:
+ logger.error('The bucket is empty')
except ClientError as e:
logger.error(f'Error listing S3 objects: {e}')
diff --git a/tests/dummy.txt b/tests/dummy.txt
new file mode 100644
index 0000000..af27ff4
--- /dev/null
+++ b/tests/dummy.txt
@@ -0,0 +1 @@
+This is a test file. \ No newline at end of file
diff --git a/tests/test_extract_lambda.py b/tests/test_extract_lambda.py
new file mode 100644
index 0000000..472e93a
--- /dev/null
+++ b/tests/test_extract_lambda.py
@@ -0,0 +1,49 @@
+import pytest
+import boto3
+from moto import mock_aws
+from src.extract_lambda import list_existing_s3_files #process_and_upload_tables
+import os
+import logging
+
+
+@pytest.fixture(scope='class')
+def aws_credentials():
+ os.environ["AWS_ACCESS_KEY_ID"] = 'testing'
+ os.environ["AWS_SECRET_ACCESS_KEY"] = 'testing'
+ os.environ["AWS_SECURIT_TOKEN"] = 'testing'
+ os.environ["AWS_SESSION_TOKEN"] = 'testing'
+ os.environ["AWS_DEFAULT_REGION"]= 'eu-west-2'
+
+@pytest.fixture(scope='class')
+def s3_client(aws_credentials):
+ with mock_aws():
+ yield boto3.client('s3')
+
+class TestListExistings3Files():
+ def test_error_if_no_bucket(self, s3_client, caplog):
+
+ logger = logging.getLogger()
+ logger.info('Testing now.')
+ caplog.set_level(logging.ERROR)
+ list_existing_s3_files(client=s3_client)
+ assert 'Error listing S3 objects' in caplog.text
+
+ def test_error_if_bucket_is_empty(self, s3_client, caplog):
+
+ s3_client.create_bucket(Bucket='extract_bucket',
+ CreateBucketConfiguration={
+ 'LocationConstraint': 'eu-west-2'
+ })
+ list_existing_s3_files(client=s3_client)
+ assert 'The bucket is empty' in caplog.text
+
+ def test_error_retrieving_object(self, s3_client, caplog):
+ s3_client.upload_file('tests/dummy.txt', 'extract_bucket', 'dummy.txt')
+ list_existing_s3_files(bucket_name='test_bucket', client=s3_client)
+
+ assert 'Error retrieving S3 object ' in caplog.text
+
+ def test_retrieves_file_content(self, s3_client, caplog):
+ result = list_existing_s3_files(client=s3_client)
+
+ assert list(result.values()) == ['This is a test file.'] \ No newline at end of file
git.ajschof.me — hosted by ajschofield — powered by cgit