from unittest import mock import pytest from campaigns.assets.repositories import AssetRepository from campaigns.assets.services import AssetService from campaigns.connectors.aws.kms import BaseKMS from campaigns.connectors.db import Database from campaigns.meta.repositories import ( AdFormatRepository, CampaignAdCreativeRepository, CampaignAdRepository, CampaignAdSetEngagementAudienceRepository, CampaignAdSetRepository, CampaignAdSetTargetingAudienceRepository, CampaignImageRepository, CampaignRepository, CampaignVideoRepository, EngagementAudienceRepository, FacebookAssociationRepository, FacebookPageLabelRepository, FacebookPageRepository, TargetingAudienceRepository, ) from campaigns.meta.services import ( AdFormatService, CampaignImageService, CampaignPostService, CampaignService, CampaignVideoService, FacebookPageService, FacebookPageTokenService, InstagramAccountService, ) from campaigns.meta.validators import CampaignValidator @pytest.fixture def asset_service( s3_client_mock: mock.MagicMock, sts_client_mock: mock.MagicMock, db: Database ) -> AssetService: return AssetService( s3_client=s3_client_mock, sts_client=sts_client_mock, asset_repository=AssetRepository(db=db), upload_policy_func=lambda key: {"key": key}, upload_bucket_name="test", upload_iam_role_arn="test", upload_region_name="test", ) @pytest.fixture def facebook_association_repository(db: Database) -> FacebookAssociationRepository: return FacebookAssociationRepository(db=db) @pytest.fixture def campaign_ad_set_repository(db: Database) -> CampaignAdSetRepository: return CampaignAdSetRepository(db=db) @pytest.fixture def campaign_ad_set_targeting_audience_repository( db: Database, ) -> CampaignAdSetTargetingAudienceRepository: return CampaignAdSetTargetingAudienceRepository(db=db) @pytest.fixture def campaign_ad_set_engagement_audience_repository( db: Database, ) -> CampaignAdSetEngagementAudienceRepository: return CampaignAdSetEngagementAudienceRepository(db=db) @pytest.fixture def campaign_ad_creative_repository(db: Database) -> CampaignAdCreativeRepository: return CampaignAdCreativeRepository(db=db) @pytest.fixture def campaign_ad_repository(db: Database) -> CampaignAdRepository: return CampaignAdRepository(db=db) @pytest.fixture def facebook_page_repository(db: Database) -> FacebookPageRepository: return FacebookPageRepository(db=db) @pytest.fixture def facebook_page_label_repository(db: Database) -> FacebookPageLabelRepository: return FacebookPageLabelRepository(db=db) @pytest.fixture def campaign_repository(db: Database) -> CampaignRepository: return CampaignRepository(db=db) @pytest.fixture def campaign_image_repository(db: Database) -> CampaignImageRepository: return CampaignImageRepository(db=db) @pytest.fixture def campaign_video_repository(db: Database) -> CampaignVideoRepository: return CampaignVideoRepository(db=db) @pytest.fixture def targeting_audience_repository(db: Database) -> TargetingAudienceRepository: return TargetingAudienceRepository(db=db) @pytest.fixture def engagement_audience_repository(db: Database) -> EngagementAudienceRepository: return EngagementAudienceRepository(db=db) @pytest.fixture def facebook_page_token_service( dummy_kms: BaseKMS, facebook_client_mock: mock.MagicMock, facebook_page_repository: FacebookPageRepository, ) -> FacebookPageTokenService: return FacebookPageTokenService( kms=dummy_kms, facebook_client=facebook_client_mock, facebook_page_repository=facebook_page_repository, ) @pytest.fixture def facebook_page_service( s3_client_mock: mock.MagicMock, facebook_page_repository: FacebookPageRepository, facebook_page_token_service: FacebookPageTokenService, ) -> FacebookPageService: return FacebookPageService( s3=s3_client_mock, facebook_page_repository=facebook_page_repository, facebook_page_token_service=facebook_page_token_service, ) @pytest.fixture def instagram_account_service( facebook_client_mock: mock.MagicMock, facebook_page_token_service: FacebookPageTokenService, ) -> InstagramAccountService: return InstagramAccountService( facebook_client=facebook_client_mock, facebook_page_token_service=facebook_page_token_service, ) @pytest.fixture def campaign_service( campaign_repository: CampaignRepository, campaign_validator: CampaignValidator ) -> CampaignService: return CampaignService( campaign_repository=campaign_repository, ) @pytest.fixture def campaign_post_service( facebook_client_mock: mock.MagicMock, facebook_page_token_service: FacebookPageTokenService, ) -> CampaignPostService: return CampaignPostService( facebook_client=facebook_client_mock, facebook_page_token_service=facebook_page_token_service, ) @pytest.fixture def campaign_image_service( facebook_client_mock: mock.MagicMock, campaign_image_repository: CampaignImageRepository, asset_service: AssetService, ) -> CampaignImageService: return CampaignImageService( facebook_client=facebook_client_mock, campaign_image_repository=campaign_image_repository, asset_service=asset_service, ) @pytest.fixture def ad_format_repository() -> AdFormatRepository: return AdFormatRepository() @pytest.fixture def ad_format_service(ad_format_repository: AdFormatRepository) -> AdFormatService: return AdFormatService(ad_format_repository=ad_format_repository) @pytest.fixture def campaign_video_service( facebook_client_mock: mock.MagicMock, campaign_video_repository: CampaignVideoRepository, asset_service: AssetService, ) -> CampaignVideoService: return CampaignVideoService( facebook_client=facebook_client_mock, campaign_video_repository=campaign_video_repository, asset_service=asset_service, ) @pytest.fixture def campaign_validator( ows_account_mock: mock.MagicMock, ows_product_mock: mock.MagicMock, facebook_page_service: FacebookPageService, campaign_post_service: CampaignPostService, ) -> CampaignValidator: return CampaignValidator( ows_account=ows_account_mock, ows_product=ows_product_mock, facebook_page_service=facebook_page_service, campaign_post_service=campaign_post_service, )