from unittest import mock import httpx import pytest from app.enums import AdReportingPlatform from app.models import ( AdReportingCreativeThumbnailUrl, Creative, ) from app.processors import ( TiktokCreativeProcessor, ) @pytest.mark.asyncio @mock.patch("app.image.uuid4", return_value="test_uuid") async def test_tiktok_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, web_response_mock: httpx.Response, ) -> None: processor = TiktokCreativeProcessor( 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() tiktok_api_response_mock = mock.MagicMock() tiktok_api_response_mock.json.return_value = {"thumbnail_url": "test_url"} web_client_mock.get.side_effect = (tiktok_api_response_mock, web_response_mock) 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( TiktokCreativeProcessor.TIKTOK_EMBEDDED_URL, params={"url": creative.source_url}, ), mock.call("test_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", ), ), )