import json import uuid from unittest.mock import patch from tests.test_utils import FixtureLoader from models import models from tests import BaseTestCase, mock_for_user from tests.project_history.fixtures.project_history_fixture import fixture from models.projects_history import HistoryActionType user1 = mock_for_user(1, "dev-marketing-user-1@example.com", "sme-dna|5cf0091d6c91d310fe6fcdc6") user2 = mock_for_user(2, "dev-marketing-user-2@example.com", "sme-dna|3po0091d6c91ty670fe6ftryf") user3 = mock_for_user(3, "dev-marketing-user-3@example.com", "sme-dna|3po0091d6c91ty670fe6feeee") def mocked_email_send(*args, **kwargs): return [{"dev-marketing-user-2@example.com": uuid.uuid4()}] class TestProjectsHistory(BaseTestCase): url = "/projects/{}/history" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) self.campaign_under_test = { "name": "test_history_campaign_1", "territories": [1], "startDate": "2018-03-12", "endDate": "2018-04-13", "plannedBudget": 1000, "objective": 2, "genders": [1], "audienceLowerAge": 18, "audienceHigherAge": 25, "platforms": [1] } self.project_under_test = { "targets": {"items": [{"id": "GRAS_12423", "name": "Pavlo Zibrov", "isSony": True}], "type": "Artist"}, "name": "History_project_3", "endDate": "2020-10-11", "startDate": "2007-09-12", } def update_campaign( self, updates_dict: dict, project: int = 500, media_plan_id: int = 42, campaign_uuid: str = "34ed4c22-e1f9-4184-a06d-f04cbdb97455" ): self.campaign_under_test.update(updates_dict) self.execute_patch( "/projects/{0}/media-plans/{1}/campaigns/{2}".format(project, media_plan_id, campaign_uuid), data=json.dumps(self.campaign_under_test), headers=self.headers, ) def update_project(self, updates_dict: dict, project: int = 500): self.project_under_test.update(updates_dict) self.execute_put("/projects/{}".format(project), data=json.dumps(self.project_under_test), headers=self.headers) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_history_return_valid_response(self): response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 3) items = response.json["items"] self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 3) self.soft_assert(self.assertEqual, items[0]["id"], 6) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_2") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["projectId"], 500) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 200) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-02T23:59:59+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": 2000}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.soft_assert(self.assertEqual, items[1]["id"], 5) self.soft_assert(self.assertEqual, items[1]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[1]["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, items[1]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["projectId"], 500) self.soft_assert(self.assertEqual, items[1]["campaign"]["id"], 100) self.soft_assert(self.assertEqual, items[1]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[1]["date"], "2019-01-02T12:34:00+0000") self.soft_assert(self.assertEqual, items[1]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[1]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[1]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[1]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[1]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[1]["new_value"], {"value": 1000}) self.soft_assert(self.assertEqual, items[1]["old_value"], None) self.soft_assert(self.assertEqual, items[2]["id"], 1) self.soft_assert(self.assertEqual, items[2]["action"], {"id": 14, "type": "add_project"}) self.soft_assert(self.assertEqual, items[2]["campaign"], None) self.soft_assert(self.assertEqual, items[2]["date"], "2019-01-01T00:00:00+0000") self.soft_assert(self.assertEqual, items[2]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[2]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[2]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[2]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[2]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[2]["new_value"], {"value": "fresh_project_500"}) self.soft_assert(self.assertEqual, items[2]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_history_by_search_value(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "fresh_project_500"} ) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) == 1) self.assertEqual(response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 1) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 14, "type": "add_project"}) self.soft_assert(self.assertEqual, items[0]["campaign"], None) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-01T00:00:00+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": "fresh_project_500"}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_history_by_creator_name(self): response = self.execute_get(self.url.format(500), headers=self.headers, query_string={"query": "dev"}) self.assertEqual(200, response.status_code) items = response.json["items"] self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 3) self.soft_assert(self.assertEqual, items[0]["id"], 6) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_2") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 200) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-02T23:59:59+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": 2000}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.soft_assert(self.assertEqual, items[1]["id"], 5) self.soft_assert(self.assertEqual, items[1]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[1]["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, items[1]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[1]["campaign"]["id"], 100) self.soft_assert(self.assertEqual, items[1]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[1]["date"], "2019-01-02T12:34:00+0000") self.soft_assert(self.assertEqual, items[1]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[1]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[1]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[1]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[1]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[1]["new_value"], {"value": 1000}) self.soft_assert(self.assertEqual, items[1]["old_value"], None) self.soft_assert(self.assertEqual, items[2]["id"], 1) self.soft_assert(self.assertEqual, items[2]["action"], {"id": 14, "type": "add_project"}) self.soft_assert(self.assertEqual, items[2]["campaign"], None) self.soft_assert(self.assertEqual, items[2]["date"], "2019-01-01T00:00:00+0000") self.soft_assert(self.assertEqual, items[2]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[2]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[2]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[2]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[2]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[2]["new_value"], {"value": "fresh_project_500"}) self.soft_assert(self.assertEqual, items[2]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_search_by_campaign_name(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "test_history_campaign_2"} ) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 6) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_2") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 200) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-02T23:59:59+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": 2000}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_search_by_campaign_name_and_invalid_creator_name(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "invalid creator name test_history_campaign_2"}, ) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 0) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_search_with_colon_should_not_raise_error(self): response = self.execute_get(self.url.format(500), headers=self.headers, query_string={"query": ":some test"}) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 0) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_search_by_campaign_name_and_valid_creator_name(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "dev marketing user test_history_campaign_2"}, ) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 6) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_2") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 200) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-02T23:59:59+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": 2000}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_search_by_campaign_name_and_valid_creator_name_and_history_name(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "dev-marketing-user test_history_campaign_1 1000"}, ) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 5) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 100) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["date"], "2019-01-02T12:34:00+0000") self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], {"value": 1000}) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_search_by_campaign_name_and_valid_creator_name_and_invalid_history_name(self): response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "dev-marketing-user test_history_campaign_1 2000"}, ) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, response.json["offset"], 0) self.soft_assert(self.assertEqual, response.json["limit"], 20) self.soft_assert(self.assertEqual, response.json["total"], 0) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_delete_campaign_creates_change_territories_and_remove_campaign_events(self): self.execute_delete("/projects/500/campaigns/34ed4c22-e1f9-4184-a06d-f04cbdb97455", headers={"Authorization": self.headers["Authorization"]}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 5) items = response.json["items"] self.soft_assert(self.assertEqual, items[1]["id"], 12) self.soft_assert(self.assertEqual, items[1]["action"], {"id": 5, "type": "change_territories"}) self.soft_assert(self.assertEqual, items[1]["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, items[1]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[1]["campaign"]["id"], 100) self.soft_assert(self.assertEqual, items[1]["campaign"]["isDeleted"], True) self.soft_assert(self.assertEqual, items[1]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[1]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[1]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[1]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[1]["new_value"], None) self.soft_assert(self.assertEqual, items[1]["old_value"], [{"id": 1, "name": "Ukraine"}]) self.soft_assert(self.assertEqual, items[0]["id"], 13) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 2, "type": "remove_campaign"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, items[0]["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 100) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], True) self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["new_value"], None) self.soft_assert(self.assertEqual, items[0]["old_value"], {"value": 1000}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_on_add_campaign_creates_change_territories_and_add_campaign_events(self): data = { "create": [ { "campaignUuid": "34ed4c22-e1f9-4184-a06d-f04cbdb97222", "phaseId": 450, "orderInPhase": 1, "columns": { "name": "New Campaign", "territories": [4], "startDate": "2020-04-06", "endDate": "2020-04-25", "plannedBudget": 20000, "objective": 2, "genders": [1], "audienceLowerAge": 18, "audienceHigherAge": 25, "notes": "", "platforms": [1], } } ], } self.execute_post("/projects/500/media-plans/42/campaigns/bulk-action", headers=self.headers, data=json.dumps(data)) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 9) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 17) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 5, "type": "change_territories"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "New Campaign") self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|3po0091d6c91ty670fe6ftryf") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-2@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-2") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], [{"id": 4, "name": "Germany"}]) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.soft_assert(self.assertEqual, items[5]["id"], 12) self.soft_assert(self.assertEqual, items[5]["action"], {"id": 1, "type": "add_campaign"}) self.soft_assert(self.assertEqual, items[5]["campaign"]["name"], "New Campaign") self.soft_assert(self.assertEqual, items[5]["campaign"]["id"], 1) self.soft_assert(self.assertEqual, items[5]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[5]["user"]["id"], "sme-dna|3po0091d6c91ty670fe6ftryf") self.soft_assert(self.assertEqual, items[5]["user"]["email"], "dev-marketing-user-2@example.com") self.soft_assert(self.assertEqual, items[5]["user"]["name"], "dev-marketing-user-2") self.soft_assert(self.assertEqual, items[5]["user"]["label"], {"id": 4, "name": "CMG"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_on_search_by_territory_changes(self): data = { "create": [ { "campaignUuid": "34ed4c22-e1f9-4184-a06d-f04cbdb97222", "phaseId": 450, "orderInPhase": 1, "columns": { "name": "New Campaign", "territories": [4], "startDate": "2020-04-06", "endDate": "2020-04-25", "plannedBudget": 20000, "objective": 2, "genders": [1], "audienceLowerAge": 18, "audienceHigherAge": 25, "notes": "", "platforms": [2], } } ], } self.execute_post("/projects/500/media-plans/42/campaigns/bulk-action", headers=self.headers, data=json.dumps(data)) response = self.execute_get(self.url.format(500), headers=self.headers, query_string={"query": "Germany"}) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) == 1) self.assertEqual(response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 17) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 5, "type": "change_territories"}) self.soft_assert(self.assertEqual, items[0]["campaign"]["name"], "New Campaign") self.soft_assert(self.assertEqual, items[0]["campaign"]["id"], 1) self.soft_assert(self.assertEqual, items[0]["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|3po0091d6c91ty670fe6ftryf") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-2@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-2") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert(self.assertEqual, items[0]["new_value"], [{"id": 4, "name": "Germany"}]) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_search_when_add_new_team_member(self): data = {"added": [{"userId": 3, "roleId": 1, "categoryIds": [1]}]} self.execute_post("/projects/500/team", headers=self.headers, data=json.dumps(data)) response = self.execute_get( self.url.format(500), headers=self.headers, query_string={"query": "dev-marketing-user-3"} ) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) == 1) self.assertEqual(response.json["total"], 1) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["id"], 12) self.soft_assert(self.assertEqual, items[0]["action"], {"id": 11, "type": "change_project_team"}) self.soft_assert(self.assertEqual, items[0]["campaign"], None) self.soft_assert(self.assertEqual, items[0]["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, items[0]["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, items[0]["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, items[0]["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, items[0]["user"]["role"], {"categoryIds": [], "id": 1, "name": "Editor"}) self.soft_assert( self.assertEqual, items[0]["new_value"], [ { "email": "dev-marketing-user-3@example.com", "id": 3, "name": "dev-marketing-user-3", "roles": [{"categoryIds": [], "id": 1, "name": "Editor"}], } ], ) self.soft_assert(self.assertEqual, items[0]["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_update_campaign_budget_creates_update_campaign_budget_event(self): self.update_campaign({"plannedBudget": 12000}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 6) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 14) self.soft_assert(self.assertEqual, item["action"], {"id": 4, "type": "update_campaign_budget"}) self.soft_assert(self.assertEqual, item["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, item["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, item["campaign"]["id"], 100) self.soft_assert(self.assertEqual, item["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["new_value"], {"value": 12000}) self.soft_assert(self.assertEqual, item["old_value"], {"value": 1000}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_update_campaign_timeline_creates_update_campaign_timeline_event(self): self.update_campaign({"startDate": "2018-04-11", "endDate": "2018-05-12"}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 6) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 14) self.soft_assert(self.assertEqual, item["action"], {"id": 3, "type": "update_campaign_timeline"}) self.soft_assert(self.assertEqual, item["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, item["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, item["campaign"]["id"], 100) self.soft_assert(self.assertEqual, item["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["new_value"], {"end_date": "2018-05-12", "start_date": "2018-04-11"}) self.soft_assert(self.assertEqual, item["old_value"], {"end_date": "2018-04-13", "start_date": "2018-03-12"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_change_campaign_platform_creates_change_campaign_platform_event(self): self.update_campaign({"platforms": [41, 47]}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 5) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 13) self.soft_assert(self.assertEqual, item["action"], {"id": 13, "type": "change_campaign_platform"}) self.soft_assert(self.assertEqual, item["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, item["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, item["campaign"]["id"], 100) self.soft_assert(self.assertEqual, item["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["new_value"], {"value": ["Facebook", "Instagram"]}) self.soft_assert(self.assertEqual, item["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_update_campaign_territories_creates_change_territories_event(self): self.update_campaign({"territories": [2, 3]}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 7) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 15) self.soft_assert(self.assertEqual, item["action"], {"id": 5, "type": "change_territories"}) self.soft_assert(self.assertEqual, item["campaign"]["name"], "test_history_campaign_1") self.soft_assert(self.assertEqual, item["campaign"]["categoryId"], 1) self.soft_assert(self.assertEqual, item["campaign"]["id"], 100) self.soft_assert(self.assertEqual, item["campaign"]["isDeleted"], False) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["new_value"], [{"id": 3, "name": "Spain"}]) self.soft_assert(self.assertEqual, item["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_add_phase_creates_add_phase_event(self): data = {"name": "Phase 10"} response = self.execute_post("/projects/500/media-plans/42/phases", data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code, response.json) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 5) item = response.json["items"][1] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 6, "type": "add_phase"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert( self.assertEqual, item["new_value"], { 'campaigns': [ { 'ad_creative_link': None, 'ad_creative_links': [], 'ad_creative_notes': None, 'audience_higher_age': None, 'audience_lower_age': None, 'audience_notes': None, 'budget': None, 'call_to_action': None, 'creative_description': None, 'ecpm': None, 'end_date': None, 'genders': [], 'gratis': None, 'headline': None, 'kpi_metrics_field_id': None, 'linkfire_links': [], 'links': [], 'name': None, 'naming_convention': None, 'naming_convention_manual': None, 'notes': None, 'objective': None, 'order_in_phase': 0, 'placements': {}, 'platforms': [], 'schedule': {'end': '2020-10-11', 'start': '2020-10-11'}, 'start_date': None, 'territories': [{'id': 1, 'name': 'Ukraine'}, {'id': 2, 'name': 'USA'}], 'type': None, 'workflow_status': 'Draft' } ], "id": 1, "name": "Phase 10", "order": 5 }, ) self.soft_assert(self.assertEqual, item["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_remove_phase_create_remove_phase_event(self): self.execute_delete("/projects/500/media-plans/42/phases/550", headers=self.headers) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 4) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 7, "type": "remove_phase"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["new_value"], None) self.soft_assert( self.assertEqual, item["old_value"], {"campaigns": [], "id": 550, "name": "Phase 2", "order": 3}, ) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_update_campaign_timeline_events(self): self.update_campaign({"startDate": "2018-04-11", "endDate": "2019-02-03"}) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 6) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["action"], {"id": 3, "type": "update_campaign_timeline"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_change_multiple_campaign_fields_return_history_in_exact_order(self): self.update_campaign( {"plannedBudget": 123456, "startDate": "2018-04-11", "endDate": "2019-02-03", "platforms": [5]} ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 7) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["action"], {"id": 4, "type": "update_campaign_budget"}) self.soft_assert(self.assertEqual, items[1]["action"], {"id": 3, "type": "update_campaign_timeline"}) self.soft_assert(self.assertEqual, items[2]["action"], {"id": 13, "type": "change_campaign_platform"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_change_multiple_project_fields_return_history_in_exact_order(self): self.update_project( { "targets": { "items": [{"id": "05", "ownerName": "Owner2", "provider": "apple", "name": "UpdateArtist"}], "type": "Playlist", }, "notes": "145000", } ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 4) items = response.json["items"] self.soft_assert(self.assertEqual, items[0]["action"], {"id": 24, "type": "remove_playlists"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_add_project_primary_artists_creates_add_primary_artists_event(self): self.update_project( { "targets": { "items": [ {"id": "GRAS_12423", "name": "Pavlo Zibrov", "isSony": True}, {"id": "GRAS_128686", "name": "Valery Meladze", "isSony": True}, {"id": "GRAS_12424", "name": "Ricardo", "isSony": True}, ], "type": "Artist", } }, project=502, ) response = self.execute_get(self.url.format(502), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 3) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 19, "type": "add_primary_artists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert( self.assertEqual, item["new_value"], [{"id": 10, "name": "Pavlo Zibrov"}, {"id": 1, "name": "Valery Meladze"}], ) self.soft_assert(self.assertEqual, item["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3.jwt_decode) def test_on_remove_project_primary_artists_creates_remove_primary_artists_event(self): self.update_project( { "targets": { "items": [ {"id": "GRAS_12423", "name": "Pavlo Zibrov", "isSony": True, "type": "Featured"}, {"id": "GRAS_12425", "name": "Adele", "isSony": True, "type": "Primary"}, ], "type": "Artist", }, "name": "History_project_4", "endDate": "2020-10-11", "startDate": "2019-09-12", }, project=503, ) response = self.execute_get(self.url.format(503), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 2) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 21, "type": "remove_primary_artists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|3po0091d6c91ty670fe6feeee") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-3@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-3") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 5, "name": "Nashville"}) self.soft_assert(self.assertEqual, item["old_value"], [{"id": 20, "name": "Ricardo"}]) self.soft_assert(self.assertEqual, item["new_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_add_project_featured_artists_creates_add_featured_artists_event(self): self.update_project( { "targets": { "items": [ {"id": "GRAS_12423", "name": "Al Pachino", "isSony": True, "type": "Featured"}, {"id": "GRAS_128686", "name": "GrOb", "isSony": True, "type": "Featured"}, {"id": "GRAS_12424", "name": "Ricardo", "isSony": True, "type": "Primary"}, ], "type": "Artist", } }, project=502, ) response = self.execute_get(self.url.format(502), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 3) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 20, "type": "add_featured_artists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert( self.assertEqual, item["new_value"], [{"id": 10, "name": "Al Pachino"}, {"id": 1, "name": "GrOb"}] ) self.soft_assert(self.assertEqual, item["old_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3.jwt_decode) def test_on_remove_project_featured_artists_creates_remove_featured_artists_event(self): self.update_project( { "targets": { "items": [ {"id": "GRAS_12424", "name": "Ricardo", "isSony": True, "type": "Primary"}, {"id": "GRAS_12425", "name": "Adele", "isSony": True, "type": "Primary"}, ], "type": "Artist", }, "name": "History_project_4", "endDate": "2020-10-11", "startDate": "2019-09-12", }, project=503, ) response = self.execute_get(self.url.format(503), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 2) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 12) self.soft_assert(self.assertEqual, item["action"], {"id": 22, "type": "remove_featured_artists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|3po0091d6c91ty670fe6feeee") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-3@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-3") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 5, "name": "Nashville"}) self.soft_assert(self.assertEqual, item["old_value"], [{"id": 10, "name": "Pavlo Zibrov"}]) self.soft_assert(self.assertEqual, item["new_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_add_project_playlists_creates_add_playlists_event(self): self.update_project( { "targets": { "items": [ {"id": "01", "ownerName": "Owner1", "provider": "spotify", "name": "TestAtrist"}, {"id": "05", "ownerName": "Owner2", "provider": "apple", "name": "UpdateArtist"}, {"id": "06", "ownerName": "Owner3", "provider": "apple", "name": "UpdateArtist2"}, ], "type": "Playlist", } }, project=500, ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 4) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 13) self.soft_assert(self.assertEqual, item["action"], {"id": 23, "type": "add_playlists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, item["old_value"], None) self.soft_assert( self.assertEqual, item["new_value"], [{"id": 1, "name": "UpdateArtist2", "owner": "Owner3", "provider": "apple"}], ) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_remove_project_playlists_creates_remove_playlists_event(self): self.update_project( { "targets": { "items": [{"id": "01", "ownerName": "Owner1", "provider": "spotify", "name": "TestAtrist"}], "type": "Playlist", } }, project=500, ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 4) item = response.json["items"][0] self.soft_assert(self.assertEqual, item["id"], 13) self.soft_assert(self.assertEqual, item["action"], {"id": 24, "type": "remove_playlists"}) self.soft_assert(self.assertEqual, item["campaign"], None) self.soft_assert(self.assertEqual, item["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, item["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, item["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, item["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert( self.assertEqual, item["old_value"], [{"id": 110, "name": "UpdateArtist", "owner": "Owner2", "provider": "apple"}], ) self.soft_assert(self.assertEqual, item["new_value"], None) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_on_change_project_focus_creates_multiple_events(self): self.update_project( {"targets": {"items": [{"id": "GRAS_12423", "name": "Pavlo Zibrov", "isSony": True}], "type": "Artist"}}, project=500, ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) self.assertTrue(len(response.json["items"]) > 0) self.assertEqual(response.json["total"], 6) remove_event = response.json["items"][0] add_artist_event = response.json["items"][1] change_focus_event = response.json["items"][2] self.soft_assert(self.assertEqual, remove_event["id"], 15) self.soft_assert(self.assertEqual, remove_event["action"], {"id": 24, "type": "remove_playlists"}) self.soft_assert(self.assertEqual, remove_event["campaign"], None) self.soft_assert(self.assertEqual, remove_event["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, remove_event["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, remove_event["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, remove_event["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert( self.assertEqual, remove_event["old_value"], [ {"id": 70, "name": "TestAtrist", "owner": "Owner1", "provider": "spotify"}, {"id": 110, "name": "UpdateArtist", "owner": "Owner2", "provider": "apple"}, ], ) self.soft_assert(self.assertEqual, remove_event["new_value"], None) self.soft_assert(self.assertEqual, add_artist_event["id"], 14) self.soft_assert(self.assertEqual, add_artist_event["action"], {"id": 19, "type": "add_primary_artists"}) self.soft_assert(self.assertEqual, add_artist_event["campaign"], None) self.soft_assert(self.assertEqual, add_artist_event["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, add_artist_event["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, add_artist_event["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, add_artist_event["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, add_artist_event["old_value"], None) self.soft_assert(self.assertEqual, add_artist_event["new_value"], [{"id": 10, "name": "Pavlo Zibrov"}]) self.soft_assert(self.assertEqual, change_focus_event["id"], 13) self.soft_assert( self.assertEqual, change_focus_event["action"], {"id": 18, "type": "update_project_target_type"} ) self.soft_assert(self.assertEqual, change_focus_event["campaign"], None) self.soft_assert(self.assertEqual, change_focus_event["user"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, change_focus_event["user"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, change_focus_event["user"]["name"], "dev-marketing-user-1") self.soft_assert(self.assertEqual, change_focus_event["user"]["label"], {"id": 4, "name": "CMG"}) self.soft_assert(self.assertEqual, change_focus_event["old_value"], {"value": "Playlist"}) self.soft_assert(self.assertEqual, change_focus_event["new_value"], {"value": "Artist"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_history_not_existing_project_return_404_response(self): response = self.execute_get(self.url.format(800), headers=self.headers) self.assertEqual(404, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_history_for_action_create(self): url_for_this_test = "/projects/500/history?actionType=3" response = self.execute_get(url_for_this_test, headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(3, len(data["items"])) self.assertEqual(1, data["items"][0]["action"]["id"]) self.assertEqual(1, data["items"][1]["action"]["id"]) self.assertEqual(14, data["items"][2]["action"]["id"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_create_media_plan_should_create_history(self): data = { "name": "M1" } r = self.execute_post("/projects/500/media-plans", headers=self.headers, data=json.dumps(data)) self.assertEqual(200, r.status_code) response = self.execute_get(self.url.format(500), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(6, len(data["items"])) self.assertEqual(HistoryActionType.ADD_CAMPAIGN.value, data["items"][0]["action"]["id"]) self.assertEqual(HistoryActionType.ADD_PHASE.value, data["items"][1]["action"]["id"]) self.assertEqual(HistoryActionType.ADD_MEDIA_PLAN.value, data["items"][2]["action"]["id"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_update_media_plan_name_should_create_history(self): data = { "name": "M1 updated name" } self.execute_put("/projects/500/media-plans/42", headers=self.headers, data=json.dumps(data)) response = self.execute_get(self.url.format(500), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(HistoryActionType.UPDATE_MEDIA_PLAN_NAME.value, data["items"][0]["action"]["id"]) self.assertEqual({'value': 'M1 updated name'}, data["items"][0]["new_value"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_update_phase_name_should_create_history(self): data = { "name": "PHASE updated name" } self.execute_patch("/projects/500/media-plans/42/phases/450", headers=self.headers, data=json.dumps(data)) response = self.execute_get(self.url.format(500), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(HistoryActionType.UPDATE_PHASE_NAME.value, data["items"][0]["action"]["id"]) self.assertEqual({'value': 'PHASE updated name'}, data["items"][0]["new_value"]) @patch("notifications.notifications_center.NotificationsCenter.notify", new=mocked_email_send) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_create_approval_request_should_create_history(self): url = "/projects/{}/media-plans/{}/{}" data = { "campaigns": ["34ed4c22-e1f9-4184-a06d-f04cbdb97333"], "reviewers": [2, ], } response = self.execute_post(url.format(505, 50, "approval-request"), data=json.dumps(data), headers=self.headers ) self.assertEqual(200, response.status_code) response = self.execute_get(self.url.format(505), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(HistoryActionType.APPROVAL_REQUEST.value, data["items"][0]["action"]["id"]) self.assertEqual( { 'campaigns_uuids': ['34ed4c22-e1f9-4184-a06d-f04cbdb97333'], 'id': 1, 'media_plan_id': 50, 'requester_id': 1, 'reviewer_id': 2 }, data["items"][0]["new_value"] ) @patch("notifications.notifications_center.NotificationsCenter.notify") @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_submit_approval_should_create_history(self, notify_mock): data = { "campaigns": [ { "campaignUuid": "34ed4c22-e1f9-4184-a06d-f04cbdb97452", "workflowStatus": "Approved" } ], } response = self.execute_post( "/projects/505/media-plans/50/submit-approval", data=json.dumps(data), headers=self.headers ) self.assertEqual(response.status_code, 204) self.assertEqual(notify_mock.call_count, 1) response = self.execute_get(self.url.format(505), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.assertEqual(HistoryActionType.SUBMIT_APPROVAL_REQUEST.value, data["items"][0]["action"]["id"]) self.assertEqual( { 'campaigns': [ { 'campaign_approval_request_id': 4242, 'campaign_uuid': '34ed4c22-e1f9-4184-a06d-f04cbdb97452', 'workflow_status': 'Approved' } ] }, data["items"][0]["new_value"] ) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_change_campaign_should_use_edit_campaign_event(self): data = { "name": "updated name 1" } self.update_campaign( updates_dict=data, project=500, media_plan_id=42, campaign_uuid="34ed4c22-e1f9-4184-a06d-f04cbdb97455" ) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(HistoryActionType.CHANGE_CAMPAIGN.value, data["items"][1]["action"]["id"]) self.assertEqual( sorted([ {'key': 'naming_convention', 'value': 'Social Ads | Apple TV'}, {'key': 'name', 'value': 'updated name 1'}, {'key': 'age_range', 'value': '18 - 25'} ], key=lambda x: x.get('key')), sorted(data["items"][1]["new_value"], key=lambda x: x.get('key')) )