aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorT-Aji <tolujbd2@gmail.com>2024-08-14 12:25:57 +0100
committerT-Aji <tolujbd2@gmail.com>2024-08-14 12:26:29 +0100
commit4f0d6f287ae83d7cdc0df6988ab7b9de10912f16 (patch)
treee998ca0a0c4adc8e23b8e573a8a91ff0624a3693
parentcdb4577b5ad7ae1f708797de6bbf17e289bfac14 (diff)
downloadde-project-bentley-4f0d6f287ae83d7cdc0df6988ab7b9de10912f16.tar.gz
de-project-bentley-4f0d6f287ae83d7cdc0df6988ab7b9de10912f16.zip
feat/passing tests to helper function list_existing_s3_files
-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