from unittest import mock import pytest from campaigns.assets.models import Asset from campaigns.assets.services import AssetService from campaigns.connectors.db import Database from campaigns.connectors.facebook.enums import AdVideoStatus from campaigns.connectors.facebook.models import AdVideo, AdVideoFormat, VideoStatus from campaigns.meta.errors import MetaErrors from campaigns.meta.handlers import ( RefreshCampaignAdVideoHandler, RefreshCampaignAdVideoRequest, ) from campaigns.meta.models import CampaignVideo from campaigns.meta.repositories import CampaignVideoRepository from campaigns.meta.services import CampaignVideoService from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, facebook_client_mock: mock.MagicMock, campaign_video_repository: CampaignVideoRepository, campaign_video_service: CampaignVideoService, asset_service: AssetService, ) -> RefreshCampaignAdVideoHandler: return RefreshCampaignAdVideoHandler( db=db, facebook_client=facebook_client_mock, campaign_video_repository=campaign_video_repository, campaign_video_service=campaign_video_service, asset_service=asset_service, ) async def test_refresh_ad_video_ready( handler: RefreshCampaignAdVideoHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: external_id = fake.numeric_string(length=16) external_status = AdVideoStatus.READY asset = await create_model( Asset, filetype="video", filename="video.mp4", content_type="video/mp4" ) video = await create_model(CampaignVideo, external_id=external_id, asset=asset) facebook_client_mock.get_ad_video.return_value = AdVideo( id=external_id, status=VideoStatus(video_status=external_status), format=[ AdVideoFormat( picture=fake.image_url(), filter="700x700", width=700, height=394 ), ], ) result = await handler.handle(RefreshCampaignAdVideoRequest(video_id=video.id)) assert result.external_id == external_id assert result.external_status == external_status assert result.is_valid assert result.errors == [] assert result.thumbnail_url assert result.thumbnail_url.endswith(asset.filename + ".jpg") async def test_refresh_ad_video_processing( handler: RefreshCampaignAdVideoHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: external_id = fake.numeric_string(length=16) external_status = AdVideoStatus.PROCESSING video = await create_model(CampaignVideo, external_id=external_id) facebook_client_mock.get_ad_video.return_value = AdVideo( id=external_id, status=VideoStatus(video_status=external_status) ) result = await handler.handle(RefreshCampaignAdVideoRequest(video_id=video.id)) assert result.external_id == external_id assert result.external_status == external_status assert result.is_valid is None assert result.errors == [ { "actual": external_status, "expected": [AdVideoStatus.READY], "code": MetaErrors.video_invalid_ad_video.code, } ] async def test_refresh_ad_video_error( handler: RefreshCampaignAdVideoHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, fake: FakerTyped, ) -> None: external_id = fake.numeric_string(length=16) external_status = AdVideoStatus.ERROR video = await create_model(CampaignVideo, external_id=external_id) facebook_client_mock.get_ad_video.return_value = AdVideo( id=external_id, status=VideoStatus(video_status=external_status) ) result = await handler.handle(RefreshCampaignAdVideoRequest(video_id=video.id)) assert result.external_id == external_id assert result.external_status == external_status assert not result.is_valid assert result.errors == [ { "actual": external_status, "expected": [AdVideoStatus.READY], "code": MetaErrors.video_invalid_ad_video.code, } ]