"""S3 module unit tests.""" from unittest.mock import patch from unittest.mock import MagicMock import botocore import pytest from src import s3 @patch('src.s3.client') def test_head_object_success(boto3_client_mock): """Test head_object function success.""" test_bucket = 'bucket' test_key = 'key' result = s3.head_object(test_bucket, test_key) assert result == boto3_client_mock.head_object.return_value boto3_client_mock.head_object.assert_called_once_with( Bucket=test_bucket, Key=test_key, ExpectedBucketOwner='1234567890') @patch('src.s3.client') def test_head_object_non_client_error(boto3_client_mock): """Test head_object function non-ClientError.""" test_bucket = 'bucket' test_key = 'key' boto3_client_mock.head_object.side_effect = Exception('some error') with pytest.raises(Exception, match='some error'): s3.head_object(test_bucket, test_key) boto3_client_mock.head_object.assert_called_once_with( Bucket=test_bucket, Key=test_key, ExpectedBucketOwner='1234567890') @patch('src.s3.client') def test_head_object_client_error_non_404(boto3_client_mock): """Test head_object function ClientError non-404.""" test_bucket = 'bucket' test_key = 'key' boto3_client_mock.head_object.side_effect = botocore.exceptions.ClientError({ 'Error': { 'Code': '403', 'Message': 'some error message' } }, 'some operation') with pytest.raises(botocore.exceptions.ClientError, match='some error message'): s3.head_object(test_bucket, test_key) boto3_client_mock.head_object.assert_called_once_with( Bucket=test_bucket, Key=test_key, ExpectedBucketOwner='1234567890') @patch('src.s3.client') def test_head_object_client_error_404(boto3_client_mock): """Test head_object function ClientError 404.""" test_bucket = 'bucket' test_key = 'key' boto3_client_mock.head_object.side_effect = botocore.exceptions.ClientError({ 'Error': { 'Code': '404', } }, 'some operation') assert s3.head_object(test_bucket, test_key) is None boto3_client_mock.head_object.assert_called_once_with( Bucket=test_bucket, Key=test_key, ExpectedBucketOwner='1234567890') @patch('src.s3.client') def test_download_file_object(boto3_client_mock): """Test download_fileobj function.""" test_bucket = 'bucket' test_key = 'key' test_fileobj = MagicMock() some_kwargs = {'some': 'kwargs'} result = s3.download_file_object(test_bucket, test_key, test_fileobj, **some_kwargs) assert result == boto3_client_mock.download_fileobj.return_value boto3_client_mock.download_fileobj.assert_called_once_with( Bucket=test_bucket, Key=test_key, Fileobj=test_fileobj, ExtraArgs={'ExpectedBucketOwner': '1234567890'}, **some_kwargs )