from unittest import mock import pytest from app.enums import AdReportingPlatform from app.models import ( AdReportingCreativeThumbnailUrl, Creative, ) from app.processors import ( MetaCreativeProcessor, ) @pytest.mark.asyncio @mock.patch("app.image.uuid4", return_value="test_uuid") async def test_meta_creative_processor( s3_client_mock: mock.AsyncMock, web_client_mock: mock.AsyncMock, assets_s3_bucket_name: str, assets_s3_raw_path: str, assets_s3_thumbnail_path: str, ) -> None: processor = MetaCreativeProcessor( s3_client=s3_client_mock, web_client=web_client_mock, assets_s3_bucket_name=assets_s3_bucket_name, assets_s3_raw_path=assets_s3_raw_path, assets_s3_thumbnail_path=assets_s3_thumbnail_path, ) creative = Creative( platform=AdReportingPlatform.META, creative_id="test", source_url="test", fails_count=0, ) s3_client_mock.put_object = mock.AsyncMock() result = await processor.process(creative) assert isinstance(result, AdReportingCreativeThumbnailUrl) assert result.platform == creative.platform assert result.creative_id == creative.creative_id assert result.source_url == creative.source_url assert result.img_s3_obj_key == f"{assets_s3_raw_path}/test_uuid.png" assert result.img_s3_obj_key == f"{assets_s3_thumbnail_path}/test_uuid.png" web_client_mock.get.assert_has_calls( (mock.call(creative.source_url),), ) s3_client_mock.put_object.assert_has_calls( ( mock.call( assets_s3_bucket_name, f"{assets_s3_raw_path}/test_uuid.png", mock.ANY, "image/png", ), mock.call( assets_s3_bucket_name, f"{assets_s3_thumbnail_path}/test_uuid.png", mock.ANY, "image/png", ), ), )