import pytest from audience_common.formatters import format_datetime from starlette.testclient import TestClient from campaigns.campaigns.handlers import ( GetCampaignsArtistsHandler, SearchCampaignsHandler, SearchCampaignsResponse, ) from campaigns.meta.models import Campaign from campaigns.utils.formatters import float_or_none, format_datetime_or_none from tests.unit.faker import FakerTyped from tests.unit.types import BuildModel, MockDependency pytestmark = pytest.mark.usefixtures("mock_auth") def test_get_campaigns_statuses(test_client: TestClient) -> None: response = test_client.get("/campaigns/statuses") assert response.status_code == 200 assert response.json() == [ "DRAFT", "SUBMITTED", "REJECTED", "ACTIVE", "LIVE", ] def test_get_campaigns_artists( test_client: TestClient, fake: FakerTyped, mock_dependency: MockDependency, ) -> None: global_participant_id_1 = fake.uuid4_string() global_participant_id_2 = fake.uuid4_string() handler_mock = mock_dependency(GetCampaignsArtistsHandler) handler_mock.handle.return_value = [ global_participant_id_1, global_participant_id_2, ] response = test_client.get("/campaigns/artists") assert response.status_code == 200 assert response.json() == [ {"id": global_participant_id_1}, {"id": global_participant_id_2}, ] def test_search_campaigns( test_client: TestClient, build_model: BuildModel, mock_dependency: MockDependency, ) -> None: campaign = build_model(Campaign) handler_mock = mock_dependency(SearchCampaignsHandler) handler_mock.handle.return_value = SearchCampaignsResponse( total=1, items=[campaign] ) response = test_client.get("/campaigns") assert response.status_code == 200 assert response.json() == { "items": [ { "id": campaign.id, "name": campaign.name, "vendorId": campaign.vendor_id, "subaccountId": campaign.subaccount_id, "globalParticipantId": campaign.global_participant_id, "status": campaign.status, "startTime": format_datetime_or_none(campaign.start_time), "endTime": format_datetime_or_none(campaign.end_time), "lifetimeBudget": float_or_none(campaign.lifetime_budget), "objective": campaign.objective, "platforms": campaign.platforms, "createdAt": format_datetime(campaign.created_at), "createdBy": campaign.created_by, "updatedAt": format_datetime(campaign.updated_at), "updatedBy": campaign.updated_by, } ], "total": 1, "limit": 50, "offset": 0, } def test_get_meta_campaigns( test_client: TestClient, build_model: BuildModel, mock_dependency: MockDependency, ) -> None: campaign = build_model(Campaign) handler_mock = mock_dependency(SearchCampaignsHandler) handler_mock.handle.return_value = SearchCampaignsResponse( total=1, items=[campaign] ) response = test_client.get("/meta/campaigns") assert response.status_code == 200 assert response.json() == { "items": [ { "id": campaign.id, "name": campaign.name, "vendorId": campaign.vendor_id, "subaccountId": campaign.subaccount_id, "globalParticipantId": campaign.global_participant_id, "productId": campaign.product_id, "productUpc": campaign.product_upc, "status": campaign.status, "facebookPageId": campaign.facebook_page_id, "instagramAccountId": campaign.instagram_account_external_id, "postExternalId": campaign.post_external_id, "startTime": format_datetime_or_none(campaign.start_time), "endTime": format_datetime_or_none(campaign.end_time), "lifetimeBudget": float_or_none(campaign.lifetime_budget), "objective": campaign.objective, "platforms": campaign.platforms, "contentType": campaign.content_type, "primaryText": campaign.primary_text, "headline": campaign.headline, "description": campaign.description, "linkType": campaign.link_type, "websiteUrl": campaign.website_url, "landingPagePath": campaign.landing_page_path, "landingPageProductId": campaign.landing_page_product_id, "callToAction": campaign.call_to_action, "createdAt": format_datetime(campaign.created_at), "createdBy": campaign.created_by, "updatedAt": format_datetime(campaign.updated_at), "updatedBy": campaign.updated_by, "images": [], "videos": [], } ], "total": 1, "limit": 50, "offset": 0, }