import datetime import decimal import pytest from campaigns.auth.dtos import User from campaigns.connectors.db import Database from campaigns.meta.handlers import ( UpdateCampaignScheduleAndBudgetHandler, UpdateCampaignScheduleAndBudgetRequest, ) from campaigns.meta.models import Campaign from campaigns.meta.repositories import CampaignRepository from campaigns.meta.services import CampaignService from campaigns.meta.validators import CampaignValidator from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, campaign_validator: CampaignValidator, campaign_repository: CampaignRepository, campaign_service: CampaignService, ) -> UpdateCampaignScheduleAndBudgetHandler: return UpdateCampaignScheduleAndBudgetHandler( db=db, campaign_validator=campaign_validator, campaign_repository=campaign_repository, campaign_service=campaign_service, ) async def test_update_campaign( handler: UpdateCampaignScheduleAndBudgetHandler, create_model: CreateModel, user: User, fake: FakerTyped, ) -> None: start_time = fake.date_time_utc() end_time = start_time + datetime.timedelta(days=10) lifetime_budget = decimal.Decimal("10000") campaign = await create_model( Campaign, start_time=start_time, end_time=end_time, lifetime_budget=lifetime_budget, ) request = UpdateCampaignScheduleAndBudgetRequest( user=user, campaign_id=campaign.id, start_time=start_time, end_time=end_time, lifetime_budget=lifetime_budget, ) result = await handler.handle(request) assert result.start_time == request.start_time assert result.end_time == request.end_time assert result.lifetime_budget == request.lifetime_budget assert result.updated_by == request.user.id.identity_id