import pytest from campaigns.auth.dtos import User from campaigns.campaigns.enums import CampaignStatus from campaigns.connectors.db import Database from campaigns.core.exceptions import FieldError from campaigns.meta.dtos import CampaignValidationSummary from campaigns.meta.enums import ( CampaignCallToAction, CampaignLinkType, CampaignSummaryId, ) from campaigns.meta.handlers import ( GetCampaignOverviewHandler, GetCampaignOverviewRequest, ) from campaigns.meta.models import Campaign from campaigns.meta.services import CampaignService from campaigns.meta.validators import CampaignValidator from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, campaign_service: CampaignService, campaign_validator: CampaignValidator, ) -> GetCampaignOverviewHandler: return GetCampaignOverviewHandler( db=db, campaign_service=campaign_service, campaign_validator=campaign_validator, ) async def test_get_campaign_overview_non_draft( handler: GetCampaignOverviewHandler, create_model: CreateModel, user: User, ) -> None: campaign = await create_model(Campaign, status=CampaignStatus.SUBMITTED) response = await handler.handle( GetCampaignOverviewRequest( user=user, campaign_id=campaign.id, ), ) assert response.campaign == campaign assert response.summary == [] async def test_get_campaign_overview_draft( handler: GetCampaignOverviewHandler, create_model: CreateModel, user: User, ) -> None: campaign = await create_model( Campaign, status=CampaignStatus.DRAFT, primary_text="test", link_type=CampaignLinkType.WEBSITE, website_url="https://demo.com/", call_to_action=CampaignCallToAction.LISTEN_NOW, targeting_audience=None, ) response = await handler.handle( GetCampaignOverviewRequest(user=user, campaign_id=campaign.id, camelize=True), ) assert response.campaign == campaign assert response.summary == [ CampaignValidationSummary( id=CampaignSummaryId.AUDIENCE, errors=[FieldError.required("targetingAudience")], ), CampaignValidationSummary( id=CampaignSummaryId.CREATIVE, errors=[FieldError.required("images")] ), ]