import json from datetime import datetime from unittest.mock import patch from db import db from tests import BaseTestCase, FixtureLoader, mock from tests.media_plan.fixtures.media_plan_campaign_bulk_action_fixture import fixture from models import models from models.campaign import Campaign @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestMediaPlanBulkCampaign(BaseTestCase): url = "/projects/{}/media-plans/{}/campaigns/bulk-action" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_create_campaign(self): data = { "create": [ { "phaseId": 450, "orderInPhase": 1, "columns": { "namingConventionManual": "manual_part", "startDate": "2022-01-01", "endDate": "2022-02-02", "platforms": [1, 2], "notes": "asd", "audienceNotes": "dsa", "adCreativeNotes": "my notes are so creative", "kpiMetricsFieldId": 1, "objective": 1, "ecpm": 300, "plannedBudget": 123, "genders": [1, 2], "territories": [1], "audienceLowerAge": 13, "placements": [], "adCreativeLinks": ["https://www.ad_creative.link"] } } ], } response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal( data["created"][0]["namingConvention"], "12345514_CR_Test Artist_ReleaseType_ReleaseName_Apple TV/Sling TV_AW_01_Jan_M/F_13-YY_dsa_USA_CreativeDescription_" ) campaign = db.session.query(Campaign).filter(Campaign.id == data["created"][0]["id"]).one_or_none() self.soft_assert_equal(datetime.strftime(campaign.start_date, "%Y-%m-%d"), "2022-01-01") self.soft_assert_equal(datetime.strftime(campaign.end_date, "%Y-%m-%d"), "2022-02-02") self.soft_assert_equal([platform.id for platform in campaign.platforms], [1, 2]) self.soft_assert_equal(campaign.notes, "asd") self.soft_assert_equal(campaign.audience_notes, "dsa") self.soft_assert_equal(campaign.naming_convention_manual, "manual_part") self.soft_assert_equal(campaign.ad_creative_notes, "my notes are so creative") self.soft_assert_equal(campaign.kpi_metrics_field_id, 1) self.soft_assert_equal(campaign.objective_id, 1) self.soft_assert_equal(campaign.ecpm, 300) self.soft_assert_equal(campaign.planned_budget, 123) self.soft_assert_equal(campaign.workflow_status, "Draft") self.soft_assert_equal([gender.id for gender in campaign.genders], [1, 2]) self.soft_assert_equal([territory.territory_id for territory in campaign.territories], [1]) self.soft_assert_equal(campaign.age_range.lower, 13) self.soft_assert_equal(campaign.age_range.upper, None) self.soft_assert_equal([placement.id for placement in campaign.placements], []) self.soft_assert_equal([link.url for link in campaign.ad_creative_links], ["https://www.ad_creative.link"]) campaign101 = db.session.query(Campaign).filter(Campaign.id == 101).one_or_none() self.soft_assert_equal(campaign101.order_in_phase, 2) self.assert_all() def test_delete_campaign(self): data = {"delete": ["34ed4c22-e1f9-4184-a06d-f04cbdb97455"]} response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) campaign100 = db.session.query(Campaign).filter(Campaign.id == 100).one_or_none() campaign101 = db.session.query(Campaign).filter(Campaign.id == 101).one_or_none() self.soft_assert_equal(campaign100.is_deleted, True) self.soft_assert_equal(campaign101.order_in_phase, 0) self.assert_all() def test_update_campaign(self): data = { "update": [ { "campaignUuid": "aa1490b5-832c-4852-9d28-7a96884ff399", "columns": { "name": "test description", "namingConventionManual": "noname", "startDate": "2022-01-01", "endDate": "2022-02-02", "platforms": [1, 2], "notes": "asd", "audienceNotes": "dsa", "adCreativeNotes": "my notes are so creative", "kpiMetricsFieldId": 1, "objective": 1, "ecpm": 300, "plannedBudget": 123, "workflowStatus": "Booked", "genders": [1, 2], "territories": [1], "audienceHigherAge": 13, "destinationLinks": ["https://www.destination_creative.link/1", "https://www.destination_creative.link/2"], "callToAction": "Дій", "actualSpent": 300.23, "headline": "oh nice", "creativeDescription": "super creative", "placements": [], "adCreativeLinks": ["https://www.ad_creative.link"] } } ], } response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal( data["updated"][0]["namingConvention"], "12345514_CR_Test Artist_ReleaseType_ReleaseName_Apple TV/Sling TV_AW_01_Jan_M/F_YY-13_dsa_USA_super creative_") campaign = db.session.query(Campaign).filter(Campaign.id == data["updated"][0]["id"]).one_or_none() self.soft_assert_equal( campaign.naming_convention, "12345514_CR_Test Artist_ReleaseType_ReleaseName_Apple TV/Sling TV_AW_01_Jan_M/F_YY-13_dsa_USA_super creative_" ) self.soft_assert_equal( campaign.naming_convention_manual, "noname" ) self.soft_assert_equal(datetime.strftime(campaign.start_date, "%Y-%m-%d"), "2022-01-01") self.soft_assert_equal(datetime.strftime(campaign.end_date, "%Y-%m-%d"), "2022-02-02") self.soft_assert_equal([platform.id for platform in campaign.platforms], [1, 2]) self.soft_assert_equal(campaign.notes, "asd") self.soft_assert_equal(campaign.audience_notes, "dsa") self.soft_assert_equal(campaign.ad_creative_notes, "my notes are so creative") self.soft_assert_equal(campaign.kpi_metrics_field_id, 1) self.soft_assert_equal(campaign.objective_id, 1) self.soft_assert_equal(campaign.ecpm, 300) self.soft_assert_equal(campaign.planned_budget, 123) self.soft_assert_equal(float(campaign.actual_spent), 300.23) self.soft_assert_equal(campaign.workflow_status, "Booked") self.soft_assert_equal([gender.id for gender in campaign.genders], [1, 2]) self.soft_assert_equal([territory.territory_id for territory in campaign.territories], [1]) self.soft_assert_equal(campaign.age_range.upper - 1, 13) self.soft_assert_equal(len([link for link in campaign.links]), 2) self.soft_assert_equal(campaign.headline, "oh nice") self.soft_assert_equal(campaign.call_to_action, "Дій") self.soft_assert_equal(campaign.creative_description, "super creative") self.soft_assert_equal([placement.id for placement in campaign.placements], []) self.soft_assert_equal([link.url for link in campaign.ad_creative_links], ["https://www.ad_creative.link"]) self.assert_all() def test_create_update_delete_campaign(self): data = { "delete": ["aa1490b5-832c-4852-9d28-7a96884ff399"], "create": [ { "phaseId": 450, "orderInPhase": 2, "columns": { "workflowStatus": 'Draft' } } ], "update": [ { "campaignUuid": "34ed4c22-e1f9-4184-a06d-f04cbdb97455", "columns": { "namingConventionManual": None, "startDate": None, "endDate": None, "platforms": None, "notes": None, "creativeDescription": None, "audienceNotes": None, "adCreativeNotes": None, "kpiMetricsFieldId": None, "objective": None, "ecpm": None, "plannedBudget": None, "genders": None, "territories": None, "audienceLowerAge": None, "audienceHigherAge": None, "placements": None, "adCreativeLinks": None, } } ] } response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(data["created"][0]["namingConvention"], None) self.soft_assert_equal( data["updated"][0]["namingConvention"], '12345514_CR_Test Artist_ReleaseType_ReleaseName_Platform_Objective_StartDay_StartMonth_Gender_Age_Targeting_Territory_CreativeDescription_' ) campaign_created = db.session.query(Campaign).filter(Campaign.id == data["created"][0]["id"]).one_or_none() self.soft_assert_equal(campaign_created.naming_convention, None) self.soft_assert_equal(campaign_created.start_date, None) self.soft_assert_equal(campaign_created.end_date, None) self.soft_assert_equal([platform.id for platform in campaign_created.platforms], []) self.soft_assert_equal(campaign_created.notes, None) self.soft_assert_equal(campaign_created.audience_notes, None) self.soft_assert_equal(campaign_created.ad_creative_notes, None) self.soft_assert_equal(campaign_created.kpi_metrics_field_id, None) self.soft_assert_equal(campaign_created.objective_id, None) self.soft_assert_equal(campaign_created.ecpm, None) self.soft_assert_equal(campaign_created.planned_budget, None) self.soft_assert_equal(campaign_created.workflow_status, "Draft") self.soft_assert_equal([gender.id for gender in campaign_created.genders], []) self.soft_assert_equal([territory.territory_id for territory in campaign_created.territories], []) self.soft_assert_equal(campaign_created.age_range, None) self.soft_assert_equal([placement.id for placement in campaign_created.placements], []) self.soft_assert_equal([link.url for link in campaign_created.ad_creative_links], []) campaign_updated = db.session.query(Campaign).filter(Campaign.id == data["updated"][0]["id"]).one_or_none() self.soft_assert_equal( campaign_updated.naming_convention, '12345514_CR_Test Artist_ReleaseType_ReleaseName_Platform_Objective_StartDay_StartMonth_Gender_Age_Targeting_Territory_CreativeDescription_' ) self.soft_assert_equal(campaign_updated.start_date, None) self.soft_assert_equal(campaign_updated.end_date, None) self.soft_assert_equal([platform.id for platform in campaign_updated.platforms], []) self.soft_assert_equal(campaign_updated.notes, None) self.soft_assert_equal(campaign_updated.audience_notes, None) self.soft_assert_equal(campaign_updated.ad_creative_notes, None) self.soft_assert_equal(campaign_updated.kpi_metrics_field_id, None) self.soft_assert_equal(campaign_updated.objective_id, None) self.soft_assert_equal(campaign_updated.ecpm, None) self.soft_assert_equal(campaign_updated.planned_budget, None) self.soft_assert_equal([gender.id for gender in campaign_updated.genders], []) self.soft_assert_equal([territory.territory_id for territory in campaign_updated.territories], []) self.soft_assert_equal(campaign_updated.age_range, None) self.soft_assert_equal([placement.id for placement in campaign_updated.placements], []) self.soft_assert_equal([link.url for link in campaign_updated.ad_creative_links], []) self.assert_all() def test_create_draft_campaign(self): data = { "create": [ { "phaseId": 450, "orderInPhase": 2, "campaignUuid": "796b6f6d-d1af-4d45-a481-f5ed47207d9d", "columns": { "workflowStatus": "Draft", } } ], } response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) resp = response.json created_resp = resp['created'][0] self.soft_assert_equal(created_resp['namingConvention'], None) self.soft_assert_equal(created_resp['uuid'], data['create'][0]['campaignUuid']) self.assert_all() def test_update_campaign_to_draft(self): data = {"create": [], "update": [ {"campaignUuid": "aa1490b5-832c-4852-9d28-7a96884ff399", "style": None, "columns": { "namingConventionManual": None, "startDate": None, "endDate": None, "platforms": None, "notes": None, "creativeDescription": None, "headline": None, "callToAction": None, "destinationLinks": None, "audienceNotes": None, "adCreativeNotes": None, "kpiMetricsFieldId": None, "objective": None, "ecpm": None, "name": None, "plannedBudget": None, "actualSpent": None, "workflowStatus": 'Draft', "genders": None, "territories": None, "audienceHigherAge": None, "audienceLowerAge": None, "placements": None, "adCreativeLinks": None, } } ], "delete": []} response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(data["updated"][0]["namingConvention"], None) self.assert_all() campaign_updated = db.session.query(Campaign).filter(Campaign.id == data["updated"][0]["id"]).one_or_none() self.soft_assert_equal(campaign_updated.naming_convention, None) self.soft_assert_equal(campaign_updated.start_date, None) self.soft_assert_equal(campaign_updated.end_date, None) self.soft_assert_equal([platform.id for platform in campaign_updated.platforms], []) self.soft_assert_equal(campaign_updated.notes, None) self.soft_assert_equal(campaign_updated.audience_notes, None) self.soft_assert_equal(campaign_updated.ad_creative_notes, None) self.soft_assert_equal(campaign_updated.kpi_metrics_field_id, None) self.soft_assert_equal(campaign_updated.objective_id, None) self.soft_assert_equal(campaign_updated.ecpm, None) self.soft_assert_equal(campaign_updated.planned_budget, None) self.soft_assert_equal(campaign_updated.workflow_status, "Draft") self.soft_assert_equal([gender.id for gender in campaign_updated.genders], []) self.soft_assert_equal([territory.territory_id for territory in campaign_updated.territories], []) self.soft_assert_equal(campaign_updated.age_range, None) self.soft_assert_equal([placement.id for placement in campaign_updated.placements], []) self.soft_assert_equal([link.url for link in campaign_updated.ad_creative_links], []) self.assert_all() def test_update_field_in_UK_campaign(self): data = {"create": [], "update": [ {"campaignUuid": "aa1490b5-832c-4852-9d28-7a96884ff399", "columns": { "name": "Description", "workflowStatus": 'Draft', "platforms": [1], "kpiMetricsFieldId": None, "objective": None, "adCreativeNotes": None, "notes": None, "genders": None, "territories": None, "startDate": None, "endDate": None, "audienceHigherAge": None, "audienceLowerAge": None, "adCreativeLinks": None, "audienceNotes": None, "ecpm": None, "plannedBudget": None, "placements": None } } ], "delete": []} response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal( data["updated"][0]["namingConvention"], '12345514_CR_Test Artist_ReleaseType_ReleaseName_Apple TV_Objective_StartDay_StartMonth_Gender_Age_Targeting_Territory_CreativeDescription_' ) campaign_updated = db.session.query(Campaign).filter(Campaign.id == data["updated"][0]["id"]).one_or_none() self.soft_assert_equal( campaign_updated.naming_convention, '12345514_CR_Test Artist_ReleaseType_ReleaseName_Apple TV_Objective_StartDay_StartMonth_Gender_Age_Targeting_Territory_CreativeDescription_' ) self.soft_assert_equal(campaign_updated.name, 'Description') self.assert_all() def test_delete_last_campaign_in_phase(self): data = {"delete": ["c40fe4e8-58ce-4ba6-ab10-4932e685a389"]} response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(400, response.status_code) def test_delete_all_campaigns_in_phase(self): data = {"delete": ["34ed4c22-e1f9-4184-a06d-f04cbdb97455", "aa1490b5-832c-4852-9d28-7a96884ff399"]} response = self.execute_post(self.url.format(500, 42), data=json.dumps(data), headers=self.headers) self.assertEqual(400, response.status_code) campaign100 = db.session.query(Campaign).filter(Campaign.id == 100).one_or_none() campaign101 = db.session.query(Campaign).filter(Campaign.id == 101).one_or_none() self.soft_assert_equal(campaign100.is_deleted, False) self.soft_assert_equal(campaign101.is_deleted, False) self.soft_assert_equal(campaign100.order_in_phase, 0) self.soft_assert_equal(campaign101.order_in_phase, 1) self.assert_all()