diff --git a/.ds.baseline b/.ds.baseline index 544afe311..9f68f06d9 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -209,7 +209,7 @@ "filename": "tests/app/aws/test_s3.py", "hashed_secret": "67a74306b06d0c01624fe0d0249a570f4d093747", "is_verified": false, - "line_number": 30, + "line_number": 32, "is_secret": false } ], @@ -384,5 +384,5 @@ } ] }, - "generated_at": "2024-10-22T21:33:13Z" + "generated_at": "2024-10-23T14:54:35Z" } diff --git a/tests/app/aws/test_s3.py b/tests/app/aws/test_s3.py index 8411ae5bb..57f3b0853 100644 --- a/tests/app/aws/test_s3.py +++ b/tests/app/aws/test_s3.py @@ -1,6 +1,7 @@ import os from datetime import timedelta from os import getenv +from unittest.mock import ANY, MagicMock, call import pytest from botocore.exceptions import ClientError @@ -14,6 +15,7 @@ from app.aws.s3 import ( get_phone_number_from_s3, get_s3_file, list_s3_objects, + read_s3_file, remove_csv_object, remove_s3_object, ) @@ -60,6 +62,39 @@ def test_cleanup_old_s3_objects(mocker): mock_remove_csv_object.assert_called_once_with("A") +def test_read_s3_file_success(mocker): + mock_s3res = MagicMock() + mock_extract_personalisation = mocker.patch("app.aws.s3.extract_personalisation") + mock_extract_phones = mocker.patch("app.aws.s3.extract_phones") + mock_set_job_cache = mocker.patch("app.aws.s3.set_job_cache") + mock_get_job_id = mocker.patch("app.aws.s3.get_job_id_from_s3_object_key") + bucket_name = "test_bucket" + object_key = "test_object_key" + job_id = "12345" + file_content = "some file content" + mock_get_job_id.return_value = job_id + mock_s3_object = MagicMock() + mock_s3_object.get.return_value = { + "Body": MagicMock(read=MagicMock(return_value=file_content.encode("utf-8"))) + } + mock_s3res.Object.return_value = mock_s3_object + mock_extract_phones.return_value = ["1234567890"] + mock_extract_personalisation.return_value = {"name": "John Doe"} + + global job_cache + job_cache = {} + + read_s3_file(bucket_name, object_key, mock_s3res) + mock_get_job_id.assert_called_once_with(object_key) + mock_s3res.Object.assert_called_once_with(bucket_name, object_key) + expected_calls = [ + call(ANY, job_id, file_content), + call(ANY, f"{job_id}_phones", ["1234567890"]), + call(ANY, f"{job_id}_personalisation", {"name": "John Doe"}), + ] + mock_set_job_cache.assert_has_calls(expected_calls, any_order=True) + + def test_list_s3_objects(mocker): mocker.patch("app.aws.s3._get_bucket_name", return_value="Foo") mock_s3_client = mocker.Mock()