from unittest import mock import pytest from campaigns.connectors.db import Database from campaigns.connectors.facebook.enums import AdImageStatus from campaigns.connectors.facebook.models import AdImage from campaigns.meta.errors import MetaErrors from campaigns.meta.exceptions import CampaignAdImageDoesNotExist from campaigns.meta.handlers import ( RefreshCampaignAdImageHandler, RefreshCampaignAdImageRequest, ) from campaigns.meta.models import CampaignImage from campaigns.meta.repositories import CampaignImageRepository from campaigns.meta.services import CampaignImageService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, facebook_client_mock: mock.MagicMock, campaign_image_repository: CampaignImageRepository, campaign_image_service: CampaignImageService, ) -> RefreshCampaignAdImageHandler: return RefreshCampaignAdImageHandler( db=db, facebook_client=facebook_client_mock, campaign_image_repository=campaign_image_repository, campaign_image_service=campaign_image_service, ) async def test_refresh_ad_image_without_image_hash( handler: RefreshCampaignAdImageHandler, create_model: CreateModel ) -> None: image = await create_model(CampaignImage, image_hash=None) with pytest.raises(CampaignAdImageDoesNotExist): await handler.handle(RefreshCampaignAdImageRequest(image_id=image.id)) async def test_refresh_ad_image( handler: RefreshCampaignAdImageHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: image_url = fake.image_url() image_hash = fake.pystr() image_external_id = fake.pystr() image_external_status = AdImageStatus.ACTIVE image = await create_model(CampaignImage, image_hash=image_hash) facebook_client_mock.get_ad_image.return_value = AdImage( id=image_external_id, hash=image_hash, url=image_url, status=image_external_status, ) result = await handler.handle(RefreshCampaignAdImageRequest(image_id=image.id)) assert result assert result.external_id == image_external_id assert result.external_status == image_external_status assert result.is_valid assert result.errors == [] async def test_refresh_ad_image_invalid( handler: RefreshCampaignAdImageHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: image_url = fake.image_url() image_hash = fake.pystr() image_external_id = fake.pystr() image_external_status = AdImageStatus.INTERNAL image = await create_model(CampaignImage, image_hash=image_hash) facebook_client_mock.get_ad_image.return_value = AdImage( id=image_external_id, hash=image_hash, url=image_url, status=image_external_status, ) result = await handler.handle(RefreshCampaignAdImageRequest(image_id=image.id)) assert result.external_id == image_external_id assert result.external_status == image_external_status assert not result.is_valid assert result.errors == [ { "actual": image_external_status, "expected": [AdImageStatus.ACTIVE], "code": MetaErrors.image_invalid_ad_image.code, } ]