from unittest.mock import patch, MagicMock import json import pytest from tests.test_utils import FixtureLoader from models import models from tests import BaseTestCase, mock, get_file_path, mock_for_user from datetime import datetime, timedelta, timezone, date from models import Campaign from tests.campaigns.fixtures.campaigns_fixture import fixture from models.campaign import CampaignSourceType SELECT_WIDGET = {"id": 1, "name": "select"} TOGGLE_WIDGET = {"id": 4, "name": "toggle"} MULTI_SELECT = {"id": 2, "name": "multi-select"} GROUP_SELECT = {"id": 3, "name": "group-select"} DATETIME_FORMAT = "%Y-%m-%d %H-%M" user1 = mock_for_user(1, "dev-marketing-user-1@example.com", "sme-dna|5cf0091d6c91d310fe6fcdc6", labels=[1,]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) class TestCampaignDetail(BaseTestCase): url = "/projects/500/campaigns" maxDiff = None def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_campaign_details_for_empty_manual_campaign(self): response = self.execute_get(self.url + "/209a0924-5627-4b45-83cf-f0a38c4dfd24", headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) class TestCampaignList(BaseTestCase): url = "/projects/500/campaigns" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def create_campaign_with(self, start_date, end_date, lower_age: int = 5, upperAge: int = 25, project_id: int = 500, name_autogenerated: bool = False): data = { "name": "test111", "territories": [2], "startDate": datetime.strftime(start_date, "%Y-%m-%d"), "endDate": datetime.strftime(end_date, "%Y-%m-%d"), "budgetSpend": 1999, "plannedBudget": 2000, "objective": 2, "genders": [2], "provider": 2, "destinationLinks": ["https://www.facebook.com/"], "audienceLowerAge": lower_age, "audienceHigherAge": upperAge, "notes": "Some notes", "linkfireLinks": [{"linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS"}], "platforms": [26, 54], # Google, YouTube "gratis": False, } return self.execute_post(f"/projects/{project_id}/campaigns", headers=self.headers, data=json.dumps(data)) def test_get_campaigns_list(self): response = self.execute_get(self.url, headers=self.headers) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(5, len(items)) self.soft_assert(self.assertEqual, items[1]["id"], 100) self.soft_assert(self.assertEqual, items[1]["name"], "test_campaign_1") self.soft_assert(self.assertEqual, items[1]["plannedBudget"], 222.0) self.soft_assert(self.assertEqual, items[1]["budgetSpend"], 12.0) self.soft_assert(self.assertEqual, items[1]["currency"], "GBP") self.soft_assert(self.assertEqual, items[1]["projectId"], 500) self.soft_assert(self.assertEqual, items[1]["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[1]["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[1]["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[1]["editUser"]["email"], "dev-marketing-user-1@example.com") now = datetime.now(timezone.utc) edited = datetime.fromisoformat(items[1]["editDate"]) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, items[1]["startDate"], "2007-10-11") self.soft_assert(self.assertEqual, items[1]["endDate"], "2007-11-10") self.soft_assert(self.assertEqual, items[1]["objective"]["id"], 1) self.soft_assert(self.assertEqual, items[1]["objective"]["name"], "App Promotion") self.soft_assert(self.assertEqual, items[1]["status"], 3) self.assertEqual(1, len(items[1]["territories"])) self.soft_assert(self.assertEqual, items[1]["territories"][0]["id"], 1) self.soft_assert(self.assertEqual, items[1]["territories"][0]["name"], "USA") self.soft_assert(self.assertEqual, len(items[1]["genders"]), 1) self.soft_assert(self.assertEqual, items[1]["genders"][0]["id"], 1) self.soft_assert(self.assertEqual, items[1]["genders"][0]["name"], "Male") self.soft_assert(self.assertEqual, items[1]["provider"]["id"], 1) self.soft_assert(self.assertEqual, items[1]["provider"]["name"], "Sony Music") self.soft_assert(self.assertEqual, items[1]["audienceAge"]["lowerAge"], 0) self.soft_assert(self.assertEqual, items[1]["audienceAge"]["higherAge"], 60) self.soft_assert(self.assertEqual, items[1].get("purchaseOrder"), None) self.soft_assert( self.assertEqual, items[1]["metadata"]["fields"], { "budget": True, "spend": True, "startDate": True, "endDate": True, "genders": True, "audienceAge": True, "countries": True, "destinations": True, "notes": True, }, ) self.soft_assert(self.assertEqual, items[2]["id"], 200) self.soft_assert(self.assertEqual, items[2]["name"], "test_campaign_2") self.soft_assert(self.assertEqual, items[2]["plannedBudget"], 190000.0) self.soft_assert(self.assertEqual, items[2]["budgetSpend"], 90000.0) self.soft_assert(self.assertEqual, items[2]["currency"], "GBP") self.soft_assert(self.assertEqual, items[2]["projectId"], 500) self.soft_assert(self.assertEqual, items[2]["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[2]["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[2]["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[2]["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[2]["editDate"], "2019-07-22T20:14:55.355226+00:00") self.soft_assert(self.assertEqual, items[2]["startDate"], "2008-02-02") self.soft_assert(self.assertEqual, items[2]["endDate"], "2008-10-10") self.soft_assert(self.assertEqual, items[2]["objective"]["id"], 2) self.soft_assert(self.assertEqual, items[2]["objective"]["name"], "Conversions") self.soft_assert(self.assertEqual, items[2]["status"], 3) self.assertEqual(1, len(items[2]["territories"])) self.soft_assert(self.assertEqual, items[2]["territories"][0]["id"], 2) self.soft_assert(self.assertEqual, items[2]["territories"][0]["name"], "Ukraine") self.soft_assert(self.assertEqual, len(items[2]["genders"]), 2) self.soft_assert(self.assertEqual, items[2]["genders"][0]["id"], 1) self.soft_assert(self.assertEqual, items[2]["genders"][0]["name"], "Male") self.soft_assert(self.assertEqual, items[2]["genders"][1]["id"], 2) self.soft_assert(self.assertEqual, items[2]["genders"][1]["name"], "Female") self.soft_assert(self.assertEqual, items[2]["provider"]["id"], 1) self.soft_assert(self.assertEqual, items[2]["provider"]["name"], "Sony Music") self.soft_assert(self.assertEqual, items[2]["audienceAge"]["lowerAge"], 18) self.soft_assert(self.assertEqual, items[2]["audienceAge"]["higherAge"], 35) self.soft_assert(self.assertEqual, items[2].get("purchaseOrder"), None) self.soft_assert( self.assertEqual, items[2]["metadata"]["fields"], { "budget": False, "spend": True, "startDate": True, "endDate": False, "genders": True, "audienceAge": True, "countries": True, "destinations": True, "notes": True, }, ) self.assert_all() def test_get_campaign_list_with_is_digital_filter(self): params = { "isDigital": True } response = self.execute_get(self.url, query_string=params, headers=self.headers) self.assertEqual(200, response.status_code) campaigns = response.json self.assertEqual(len(campaigns), 3) self.assertEqual(campaigns[0]['isPending'], True) self.assertEqual(campaigns[0]['source'] in CampaignSourceType.all_external_sources(), True) self.assertEqual(campaigns[1]['isPending'], False) self.assertEqual(campaigns[1]['source'] in CampaignSourceType.all_external_sources(), True) @pytest.mark.skip(reason="Test skipped because Phase logic changed") @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestCrudCampaign(BaseTestCase): url = "/projects/500/campaigns" maxDiff = None def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def create_campaign_with(self, start_date, end_date, lower_age: int = 5, upperAge: int = 25, project_id: int = 500, name_autogenerated: bool = False): data = { "name": "test111", "territories": [2], "startDate": datetime.strftime(start_date, "%Y-%m-%d"), "endDate": datetime.strftime(end_date, "%Y-%m-%d"), "budgetSpend": 1999, "plannedBudget": 2000, "objective": 2, "genders": [2], "provider": 2, "destinationLinks": ["https://www.facebook.com/"], "audienceLowerAge": lower_age, "audienceHigherAge": upperAge, "notes": "Some notes", "linkfireLinks": [{"linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS"}], "platforms": [26, 54], # Google, YouTube "gratis": False, } return self.execute_post(f"/projects/{project_id}/campaigns", headers=self.headers, data=json.dumps(data)) def test_get_data_sources(self): url = "/projects/500/data-sources" response = self.execute_get(url, headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, data["items"], ["High Society"]) self.assert_all() def test_get_platforms_for_filter_in_campaign_tab(self): url = "/projects/500/platforms" response = self.execute_get(url, headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, data["items"], ['Apple TV', 'High Society']) self.assert_all() def test_get_platforms_for_filter_in_campaign_tab_with_pending_campaigns(self): url = "/projects/503/platforms" response = self.execute_get(url, headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, data["items"], ["Apple TV", "Sling TV"]) self.assert_all() def test_get_platforms_for_filter_in_campaign_tab_without_pending_campaigns(self): url = "/projects/503/platforms" response = self.execute_get(url, headers=self.headers, query_string={'withPending': False}) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, data["items"], ["Sling TV"]) self.assert_all() def test_get_campaign_details(self): response = self.execute_get(self.url + "/100", headers=self.headers) campaign = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, campaign["id"], 100) self.soft_assert(self.assertEqual, campaign["name"], "test_campaign_1") self.soft_assert(self.assertEqual, campaign["budgetSpend"], 12.0) self.soft_assert(self.assertEqual, campaign["plannedBudget"], 222.0) self.soft_assert(self.assertEqual, campaign["currency"], "GBP") self.soft_assert(self.assertEqual, campaign["projectId"], 500) self.soft_assert(self.assertEqual, campaign["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["editUser"]["email"], "dev-marketing-user-1@example.com") edited = datetime.fromisoformat(campaign["editDate"]) self.soft_assert(self.assertTrue, (datetime.now(timezone.utc) - edited).seconds < 10) self.soft_assert(self.assertEqual, campaign["startDate"], "2007-10-11") self.soft_assert(self.assertEqual, campaign["endDate"], "2007-11-10") self.soft_assert(self.assertEqual, campaign["objective"]["id"], 1) self.soft_assert(self.assertEqual, campaign["objective"]["name"], "App Promotion") self.soft_assert(self.assertEqual, campaign["status"], 3) self.assertEqual(1, len(campaign["territories"])) self.soft_assert(self.assertEqual, campaign["territories"][0]["id"], 1) self.soft_assert(self.assertEqual, campaign["territories"][0]["name"], "USA") self.soft_assert( self.assertEqual, campaign["purchaseOrder"], { "id": 474, "name": "Jesse Rutherford indie fees Q1 F20 | PO 1092858000", "poNumber": "1092858000", "status": "Paid", }, ) self.soft_assert( self.assertEqual, campaign["metadata"]["fields"], { "audienceAge": True, "budget": True, "countries": True, "destinations": True, "endDate": True, "genders": True, "notes": True, "spend": True, "startDate": True, }, ) self.soft_assert(self.assertEqual, campaign["projectOwnerEmail"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["notes"], "Lorem Ipsum") self.soft_assert(self.assertEqual, campaign["phases"], [450]) self.soft_assert(self.assertEqual, campaign["isEditable"], True) self.soft_assert(self.assertEqual, campaign["isPending"], False) self.soft_assert(self.assertEqual, len(campaign["linkfireLinks"]), 3) self.soft_assert( self.assertEqual, campaign["linkfireLinks"][0], { "id": 1, "linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS", "deletable": True, }, ) self.soft_assert( self.assertEqual, campaign["linkfireLinks"][1], { "id": 2, "linkId": "9dcb0346-6c8f-45d7-b229-93f859238721", "linkUrl": "Blink182.lnk.to/NACS", "deletable": True, }, ) self.soft_assert( self.assertEqual, campaign["linkfireLinks"][2], { "id": 3, "linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182", "deletable": True, }, ) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[200])) def test_get_campaigns_list_with_search_filter(self): response = self.execute_get(self.url, headers=self.headers, query_string={"freeText": "test_campaign_2"}) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 200) self.assert_all() def test_get_campaigns_list_with_dates_filter(self): response = self.execute_get( self.url, headers=self.headers, query_string={"earliestStartDate": "2008-02-02", "latestEndDate": "2008-10-10"}, ) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 200) self.assert_all() def test_get_campaigns_list_with_territories_filter(self): response = self.execute_get(self.url, headers=self.headers, query_string={"territories": [2]}) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 200) self.assert_all() def test_create_campaign(self): end_date = datetime.now() + timedelta(days=180) start_date = datetime.now() - timedelta(days=180) response = self.create_campaign_with(start_date, end_date, lower_age=20, upperAge=30) self.assertEqual(201, response.status_code) created_campaign = response.json self.soft_assert(self.assertEqual, created_campaign["id"], 1) self.soft_assert(self.assertEqual, created_campaign["name"], "test111") self.soft_assert(self.assertEqual, created_campaign["budgetSpend"], 1999.0) self.soft_assert(self.assertEqual, created_campaign["plannedBudget"], 2000.0) self.soft_assert(self.assertEqual, created_campaign["currency"], "GBP") self.soft_assert(self.assertEqual, created_campaign["projectId"], 500) self.soft_assert(self.assertEqual, created_campaign["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, created_campaign["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, created_campaign["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, created_campaign["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, created_campaign["startDate"], datetime.strftime(start_date, "%Y-%m-%d")) self.soft_assert(self.assertEqual, created_campaign["endDate"], datetime.strftime(end_date, "%Y-%m-%d")) self.soft_assert(self.assertEqual, created_campaign["objective"]["id"], 2) self.soft_assert(self.assertEqual, created_campaign["objective"]["name"], "Conversions") self.soft_assert(self.assertEqual, created_campaign["status"], 2) self.assertEqual(1, len(created_campaign["territories"])) self.soft_assert(self.assertEqual, created_campaign["territories"][0]["id"], 2) self.soft_assert(self.assertEqual, created_campaign["territories"][0]["name"], "Ukraine") self.soft_assert(self.assertEqual, created_campaign["notes"], "Some notes") self.soft_assert(self.assertEqual, created_campaign["phases"], [555]) self.soft_assert(self.assertEqual, len(created_campaign["genders"]), 1) self.soft_assert(self.assertEqual, created_campaign["genders"][0]["id"], 2) self.soft_assert(self.assertEqual, created_campaign["genders"][0]["name"], "Female") self.soft_assert(self.assertEqual, created_campaign["provider"]["id"], 2) self.soft_assert(self.assertEqual, created_campaign["provider"]["name"], "Gupta Media") self.soft_assert(self.assertEqual, created_campaign["audienceAge"]["lowerAge"], 20) self.soft_assert(self.assertEqual, created_campaign["audienceAge"]["higherAge"], 30) self.soft_assert(self.assertEqual, len(created_campaign["destinationLinks"]), 1) self.soft_assert(self.assertEqual, created_campaign["destinationLinks"][0], "https://www.facebook.com/") self.soft_assert( self.assertEqual, created_campaign["linkfireLinks"], [ { "id": 1, "linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS", "deletable": True, } ], ) self.assert_all() def test_create_campaign_without_name_param_autogenerate(self): """Testcase for mediaplan campaign creation""" def create_campaign_with(start_date, end_date): data = { "territories": [2], "territories": [2], "startDate": datetime.strftime(start_date, "%Y-%m-%d"), "endDate": datetime.strftime(end_date, "%Y-%m-%d"), "budgetSpend": 1999, "plannedBudget": 2000, "objective": 2, "genders": [2], "provider": 2, "destinationLinks": ["https://www.facebook.com/"], "audienceLowerAge": 20, "audienceHigherAge": 30, "notes": "Some notes", "linkfireLinks": [ {"linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS"}], "platforms": [2], "gratis": False, } return self.execute_post(f"/projects/500/campaigns", headers=self.headers, data=json.dumps(data)) start_date = date(2021, 11, 1) end_date = start_date + timedelta(days=360) response = create_campaign_with(start_date, end_date) self.assertEqual(201, response.status_code) created_campaign = response.json self.soft_assert( self.assertEqual, created_campaign["namingConvention"], "12345514_CR_Test Artist_ReleaseType_ReleaseName_Sling TV_AW_Nov_Targeting_UA_CreativeDescription_CreativeFormat_VideoLength_1" ) self.assert_all() def test_create_campaign_name_generation_UK(self): start_date = date(2021, 11, 1) end_date = start_date + timedelta(days=360) response = self.create_campaign_with(start_date, end_date, lower_age=20, upperAge=30, name_autogenerated=True) self.assertEqual(201, response.status_code) created_campaign = response.json self.soft_assert( self.assertEqual, created_campaign["namingConvention"], "12345514_CR_Test Artist_ReleaseType_ReleaseName_Google/YouTube_AW_Nov_Targeting_UA_CreativeDescription_CreativeFormat_VideoLength_1" ) self.assert_all() def test_create_campaign_name_generation_default(self): end_date = datetime.strptime("2020-10-11", "%Y-%m-%d") start_date = datetime.strptime("2020-09-11", "%Y-%m-%d") response = self.create_campaign_with( start_date, end_date, project_id=501, lower_age=20, upperAge=30, name_autogenerated=True ) self.assertEqual(201, response.status_code) created_campaign = response.json self.soft_assert(self.assertEqual, created_campaign["name"], " | Google, YouTube") self.assert_all() def test_create_campaign_for_single_age(self): response = self.create_campaign_with(datetime.now(), datetime.now(), lower_age=20, upperAge=20) created_campaign = response.json self.assertEqual(201, response.status_code) self.soft_assert(self.assertEqual, created_campaign["audienceAge"]["lowerAge"], 20) self.soft_assert(self.assertEqual, created_campaign["audienceAge"]["higherAge"], 20) def test_create_campaign_with_invalid_category_should_return_error(self): data = { "name": "fdxgchvbj", "territories": [2], "startDate": "2020-01-05", "endDate": "2020-02-05", "plannedBudget": 4000, "budgetSpend": 1999, "objective": 1, "genders": [2], "provider": 1, "audienceLowerAge": 15, "audienceHigherAge": 45, "gratis": False, } response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) self.assertEqual(422, response.status_code) self.assertEqual("{'platforms': ['Missing data for required field.']}", response.json['message']) def test_create_campaign_with_duplicated_links_should_return_error(self): data = { "name": "fdxgchvbj", "territories": [2], "startDate": "2020-01-05", "endDate": "2020-02-05", "plannedBudget": 4000, "budgetSpend": 1999, "objective": 1, "genders": [2], "provider": 1, "destinationLinks": ["facebook.com", "gogle.com", "gogle.com"], "audienceLowerAge": 15, "audienceHigherAge": 45, "platforms": [41, 50], "gratis": False, } response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) self.assertEqual(422, response.status_code) def test_create_campaign_with_more_than_20_links_should_return_error(self): data = { "name": "fdxgchvbj", "territories": [2], "startDate": "2020-01-05", "endDate": "2020-02-05", "plannedBudget": 4000, "budgetSpend": 1999, "objective": 1, "genders": [2], "provider": 1, "destinationLinks": [ "facebook.com", "gogle.com", "tiktok.com", "sony.com", "test.com", "bing.com", "facebook12.com", "facebook132.com", "facebook13212.com", "faceb12ook.com", "gog42le.com", "ti23ktok.com", "sonic.com", "test123.com", "bing12.com", "facebook12121.com", "facebook13212.com", "facebook1321212.com", "test1523.com", "bing212.com", "bing2123.com", ], "audienceLowerAge": 15, "audienceHigherAge": 45, "platforms": [41, 50], "gratis": False, } response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) self.assertEqual(422, response.status_code) def test_update_campaign_with_manual_name(self): update_campaign_data = { "name": "Campaign Updated", "territories": [2], "startDate": "2018-01-04", "endDate": "2018-08-12", "budgetSpend": 5634, "plannedBudget": 4000, "objective": 1, "genders": [1], "provider": 2, "audienceLowerAge": 18, "audienceHigherAge": 25, "destinationLinks": ["www.sony.com", "https://www.google.com/"], "statusId": 1, "kpiMetricsFieldId": 1, "audienceNotes": "audience notes", "adCreativeLinks": ["ad creative link1", "ad creative link2"], "adCreativeNotes": "ad creative notes", "notes": "I updated the notes!", "linkfireLinks": [ {"linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182"}, {"linkId": "ca98fcdd-61ae-43df-b973-765c1ed9143f", "linkUrl": "lnk.to/blink-182_BIOMY"}, {"linkId": "90708787-46a8-4d38-8f5f-4b730951e395", "linkUrl": "Blink182.lnk.to/Quarantine"}, ], "platforms": [41, 50], "gratis": False, } response = self.execute_put(self.url + "/100", data=json.dumps(update_campaign_data), headers=self.headers) campaign = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, campaign["id"], 100) self.soft_assert(self.assertEqual, campaign["statusId"], 1) self.soft_assert(self.assertEqual, campaign["kpiMetricsFieldId"], 1) self.soft_assert(self.assertEqual, campaign["audienceNotes"], "audience notes") self.soft_assert(self.assertEqual, campaign["adCreativeLinks"], ["ad creative link1", "ad creative link2"]) self.soft_assert(self.assertEqual, campaign["adCreativeNotes"], "ad creative notes") self.soft_assert(self.assertEqual, campaign["externalName"], "external name") self.soft_assert(self.assertEqual, campaign["name"], "Campaign Updated") self.soft_assert(self.assertEqual, campaign["budgetSpend"], 5634.0) self.soft_assert(self.assertEqual, campaign["plannedBudget"], 4000.0) self.soft_assert(self.assertEqual, campaign["currency"], "GBP") self.soft_assert(self.assertEqual, campaign["projectId"], 500) self.soft_assert(self.assertEqual, campaign["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["startDate"], "2018-01-04") self.soft_assert(self.assertEqual, campaign["endDate"], "2018-08-12") self.soft_assert(self.assertEqual, campaign["objective"]["id"], 1) self.soft_assert(self.assertEqual, campaign["objective"]["name"], "App Promotion") self.soft_assert(self.assertEqual, campaign["status"], 3) self.assertEqual(1, len(campaign["territories"])) self.soft_assert(self.assertEqual, campaign["territories"][0]["id"], 2) self.soft_assert(self.assertEqual, campaign["territories"][0]["name"], "Ukraine") self.soft_assert(self.assertEqual, campaign["destinationLinks"][0], "www.sony.com") self.soft_assert(self.assertEqual, campaign["destinationLinks"][1], "https://www.google.com/") self.soft_assert(self.assertEqual, campaign["projectOwnerEmail"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["notes"], "I updated the notes!") self.soft_assert(self.assertEqual, campaign["phases"], [555]) now = datetime.now(timezone.utc) edited = datetime.fromisoformat(campaign["editDate"]) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, len(campaign["linkfireLinks"]), 3) self.soft_assert( self.assertEqual, campaign["linkfireLinks"][0]["linkId"], "2b190f7c-cf68-4741-9c06-2718c473f6e5" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][0]["linkUrl"], "lnk.to/Blink_182") self.soft_assert( self.assertEqual, campaign["linkfireLinks"][1]["linkId"], "ca98fcdd-61ae-43df-b973-765c1ed9143f" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][1]["linkUrl"], "lnk.to/blink-182_BIOMY") self.soft_assert( self.assertEqual, campaign["linkfireLinks"][2]["linkId"], "90708787-46a8-4d38-8f5f-4b730951e395" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][2]["linkUrl"], "Blink182.lnk.to/Quarantine") self.assert_all() def test_update_campaign_with_manual_name(self): update_campaign_data = { "name": "Campaign Updated", "territories": [3], "startDate": "2018-01-04", "endDate": "2018-08-12", "budgetSpend": 5634, "plannedBudget": 4000, "objective": 1, "genders": [1], "provider": 2, "audienceLowerAge": 18, "audienceHigherAge": 25, "destinationLinks": ["www.sony.com", "https://www.google.com/"], "statusId": 1, "kpiMetricsFieldId": 1, "audienceNotes": "audience notes", "adCreativeLinks": ["ad creative link1", "ad creative link2"], "adCreativeNotes": "ad creative notes", "notes": "I updated the notes!", "linkfireLinks": [ {"linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182"}, {"linkId": "ca98fcdd-61ae-43df-b973-765c1ed9143f", "linkUrl": "lnk.to/blink-182_BIOMY"}, {"linkId": "90708787-46a8-4d38-8f5f-4b730951e395", "linkUrl": "Blink182.lnk.to/Quarantine"}, ], "platforms": [2], "gratis": False, } response = self.execute_put(self.url + "/100", data=json.dumps(update_campaign_data), headers=self.headers) campaign = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, campaign["id"], 100) self.soft_assert(self.assertEqual, campaign["statusId"], 1) self.soft_assert(self.assertEqual, campaign["kpiMetricsFieldId"], 1) self.soft_assert(self.assertEqual, campaign["audienceNotes"], "audience notes") self.soft_assert(self.assertEqual, campaign["adCreativeLinks"], ["ad creative link1", "ad creative link2"]) self.soft_assert(self.assertEqual, campaign["adCreativeNotes"], "ad creative notes") self.soft_assert(self.assertEqual, campaign["externalName"], "external name") self.soft_assert( self.assertEqual, campaign["namingConvention"], "12345514_CR_Test Artist_ReleaseType_ReleaseName_Sling TV_AW_Jan_Targeting_UK_CreativeDescription_CreativeFormat_VideoLength_100" ) self.soft_assert(self.assertEqual, campaign["budgetSpend"], 5634.0) self.soft_assert(self.assertEqual, campaign["plannedBudget"], 4000.0) self.soft_assert(self.assertEqual, campaign["currency"], "GBP") self.soft_assert(self.assertEqual, campaign["projectId"], 500) self.soft_assert(self.assertEqual, campaign["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["startDate"], "2018-01-04") self.soft_assert(self.assertEqual, campaign["endDate"], "2018-08-12") self.soft_assert(self.assertEqual, campaign["objective"]["id"], 1) self.soft_assert(self.assertEqual, campaign["objective"]["name"], "App Promotion") self.soft_assert(self.assertEqual, campaign["status"], 3) self.assertEqual(1, len(campaign["territories"])) self.soft_assert(self.assertEqual, campaign["territories"][0]["id"], 3) self.soft_assert(self.assertEqual, campaign["territories"][0]["name"], "United Kingdom") self.soft_assert(self.assertEqual, campaign["destinationLinks"][0], "www.sony.com") self.soft_assert(self.assertEqual, campaign["destinationLinks"][1], "https://www.google.com/") self.soft_assert(self.assertEqual, campaign["projectOwnerEmail"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["notes"], "I updated the notes!") self.soft_assert(self.assertEqual, campaign["phases"], [555]) now = datetime.now(timezone.utc) edited = datetime.fromisoformat(campaign["editDate"]) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, len(campaign["linkfireLinks"]), 3) self.soft_assert( self.assertEqual, campaign["linkfireLinks"][0]["linkId"], "2b190f7c-cf68-4741-9c06-2718c473f6e5" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][0]["linkUrl"], "lnk.to/Blink_182") self.soft_assert( self.assertEqual, campaign["linkfireLinks"][1]["linkId"], "ca98fcdd-61ae-43df-b973-765c1ed9143f" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][1]["linkUrl"], "lnk.to/blink-182_BIOMY") self.soft_assert( self.assertEqual, campaign["linkfireLinks"][2]["linkId"], "90708787-46a8-4d38-8f5f-4b730951e395" ) self.soft_assert(self.assertEqual, campaign["linkfireLinks"][2]["linkUrl"], "Blink182.lnk.to/Quarantine") self.assert_all() @pytest.mark.skip(reason="this endpoint is currently deprecated") def test_campaigns_export(self): url = "/projects/500/export" path = get_file_path("campaigns/fixtures/campaigns_export.csv") with open(path) as file: expected_csv = file.read().format(datetime.strftime(datetime.now() + timedelta(days=200), "%Y-%m-%d")) response = self.execute_get(url, headers=self.headers) self.soft_assert(self.assertEqual, 200, response.status_code) self.soft_assert(self.assertEqual, "text/csv", response.mimetype) self.soft_assert(self.assertTrue, response.headers["Content-Disposition"] is not None) self.soft_assert(self.assertEqual, response.data.decode("utf-8").replace("\r", ""), expected_csv) self.assert_all() def test_undo_delete_campaign(self): url = self.url + "/100" undo_url = url + "/undo/delete" response = self.execute_get(url, headers=self.headers) self.assertEqual(200, response.status_code) response = self.execute_delete(url, headers={"Authorization": self.headers["Authorization"]}) self.assertEqual(204, response.status_code) response = self.execute_get(url, headers=self.headers) self.assertEqual(404, response.status_code) response = self.execute_put(undo_url, headers={"Authorization": self.headers["Authorization"]}) self.assertEqual(204, response.status_code) response = self.execute_get(url, headers=self.headers) self.assertEqual(200, response.status_code) def test_update_campaign_schedule(self): url = "/projects/500/campaigns/100/update-schedule" params = {"startDate": "2018-01-10", "endDate": "2018-08-15"} response = self.execute_patch(url, data=json.dumps(params), headers=self.headers) campaign = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, campaign["id"], 100) self.soft_assert(self.assertEqual, campaign["name"], "test_campaign_1") self.soft_assert(self.assertEqual, campaign["budgetSpend"], 12.0) self.soft_assert(self.assertEqual, campaign["plannedBudget"], 222.0) self.soft_assert(self.assertEqual, campaign["currency"], "GBP") self.soft_assert(self.assertEqual, campaign["projectId"], 500) self.soft_assert(self.assertEqual, campaign["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, campaign["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["startDate"], "2018-01-10") self.soft_assert(self.assertEqual, campaign["endDate"], "2018-08-15") self.soft_assert(self.assertEqual, campaign["objective"]["id"], 1) self.soft_assert(self.assertEqual, campaign["objective"]["name"], "App Promotion") self.soft_assert(self.assertEqual, campaign["status"], 3) self.assertEqual(1, len(campaign["territories"])) self.soft_assert(self.assertEqual, campaign["territories"][0]["id"], 1) self.soft_assert(self.assertEqual, campaign["territories"][0]["name"], "USA") self.soft_assert(self.assertEqual, campaign["destinationLinks"][0], "www.sony.com") self.soft_assert(self.assertEqual, campaign["destinationLinks"][1], "www.decibel.com") self.soft_assert(self.assertEqual, campaign["projectOwnerEmail"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, campaign["notes"], "Lorem Ipsum") self.soft_assert(self.assertEqual, campaign["phases"], [555]) self.assert_all()