from unittest import mock import httpx import pytest from app.connectors.database.base import ReportingDB from app.enums import AdReportingPlatform from app.handler import AdThumbnailDownloadHandler from app.models import Creative from app.processors import CreativeProcessorsType @pytest.fixture(scope="function") def handler( reporting_db: ReportingDB, ad_reporting_repository_mock: mock.MagicMock, processors: CreativeProcessorsType, ) -> AdThumbnailDownloadHandler: return AdThumbnailDownloadHandler( db=reporting_db, ad_reporting_repository=ad_reporting_repository_mock, processors=processors, chunk_size=50, threads_count=1, ) @pytest.mark.asyncio @pytest.mark.db async def test_handler_success( handler: AdThumbnailDownloadHandler, ad_reporting_repository_mock: mock.MagicMock, web_client_mock: mock.MagicMock, s3_client_mock: mock.MagicMock, ) -> None: ad_reporting_repository_mock.get_creatives.return_value = [ Creative( platform=AdReportingPlatform.META, creative_id="creative_1", source_url="https://example.com/image.jpg", fails_count=0, ) ] await handler.handle() ad_reporting_repository_mock.get_creatives.assert_called() ad_reporting_repository_mock.store_ad_reporting_creative_thumbnail_urls.assert_called() web_client_mock.get.assert_called() s3_client_mock.put_object.assert_called() @pytest.mark.asyncio @pytest.mark.db async def test_handler_403_response( handler: AdThumbnailDownloadHandler, ad_reporting_repository_mock: mock.MagicMock, web_client_mock: mock.MagicMock, s3_client_mock: mock.MagicMock, ) -> None: ad_reporting_repository_mock.get_creatives.return_value = [ Creative( platform=AdReportingPlatform.META, creative_id="creative_1", source_url="https://example.com/image.jpg", fails_count=0, ) ] web_client_mock.get.side_effect = httpx.HTTPStatusError( "Forbidden", request=httpx.Request("GET", "https://example.com/"), response=httpx.Response(status_code=403), ) await handler.handle() ad_reporting_repository_mock.get_creatives.assert_called() ad_reporting_repository_mock.store_ad_reporting_creative_thumbnail_urls.assert_called() web_client_mock.get.assert_called() s3_client_mock.put_object.assert_not_called() @pytest.mark.asyncio @pytest.mark.db async def test_handler_404_response( handler: AdThumbnailDownloadHandler, ad_reporting_repository_mock: mock.MagicMock, web_client_mock: mock.MagicMock, s3_client_mock: mock.MagicMock, ) -> None: ad_reporting_repository_mock.get_creatives.return_value = [ Creative( platform=AdReportingPlatform.META, creative_id="creative_1", source_url="https://example.com/image.jpg", fails_count=0, ) ] web_client_mock.get.side_effect = httpx.HTTPStatusError( "Forbidden", request=httpx.Request("GET", "https://example.com/"), response=httpx.Response(status_code=404), ) await handler.handle() ad_reporting_repository_mock.get_creatives.assert_called() ad_reporting_repository_mock.store_ad_reporting_creative_thumbnail_urls.assert_called() web_client_mock.get.assert_called() s3_client_mock.put_object.assert_not_called()