"""Unit tests for s3 logic.""" import json from unittest.mock import Mock from unittest.mock import patch import pytest from src.logic import s3 @patch('src.logic.s3.config.AWS_REGION', 'us-east-1') @patch('src.logic.s3.boto3.client') def test_get_client_returns_s3_client(mock_boto_client): """Test that get_client returns an S3 client.""" mock_client = Mock() mock_boto_client.return_value = mock_client s3.get_client.cache_clear() result = s3.get_client() assert result == mock_client mock_boto_client.assert_called_once_with('s3', 'us-east-1') @patch('src.logic.s3.get_client') def test_fetch_product_metadata_success(mock_get_client): """Test successful product metadata fetch from S3.""" product_metadata = { 'id': '12345', 'label': {'service_tier': {'name': 'tier-2'}}, 'tracks': [] } mock_s3_client = Mock() mock_s3_client.get_object.return_value = { 'Body': Mock(read=Mock(return_value=json.dumps(product_metadata).encode())) } mock_get_client.return_value = mock_s3_client result = s3.fetch_product_metadata( 's3://test-bucket/snapshots/product-12345-review-queue-67890.json' ) assert result == product_metadata mock_s3_client.get_object.assert_called_once_with( Bucket='test-bucket', Key='snapshots/product-12345-review-queue-67890.json' ) @patch('src.logic.s3.get_client') def test_fetch_product_metadata_raises_on_s3_error(mock_get_client): """Test that fetch_product_metadata propagates S3 errors.""" mock_s3_client = Mock() mock_s3_client.get_object.side_effect = Exception('S3 error') mock_get_client.return_value = mock_s3_client with pytest.raises(Exception, match='S3 error'): s3.fetch_product_metadata('s3://test-bucket/snapshots/product-123.json')