import json import pytest from datetime import datetime, timezone from unittest.mock import patch from tests.test_utils import FixtureLoader from models import models from tests import BaseTestCase, mock, get_file_path, mock_for_user from tests.projects.fixtures.projects_fixture import fixture user2 = mock_for_user(2, "dev-marketing-user-2@example.com", "sme-dna|3po0091d6c91ty670fe6ftryf", labels=[6]) user6 = mock_for_user( 6, "dev-marketing-user-6@example.com", "sme-dna|phn0091d6cuhjp30fe6opttml", is_admin=True, labels=[7] ) @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestGetProjects(BaseTestCase): url = "/projects" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_project_list(self): response = self.execute_get(self.url, headers=self.headers) items = response.json["items"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(4, len(items)) projects = response.json["items"] metadata = response.json["metadata"] self.soft_assert(self.assertEqual, metadata["completed"]["artistCount"], 3) self.soft_assert(self.assertEqual, metadata["completed"]["playlistCount"], 1) self.soft_assert(self.assertEqual, metadata["completed"]["totalCount"], 4) self.soft_assert(self.assertEqual, metadata["inProgress"]["artistCount"], 0) self.soft_assert(self.assertEqual, metadata["inProgress"]["playlistCount"], 0) self.soft_assert(self.assertEqual, metadata["inProgress"]["totalCount"], 0) self.soft_assert(self.assertEqual, metadata["scheduled"]["artistCount"], 0) self.soft_assert(self.assertEqual, metadata["scheduled"]["playlistCount"], 0) self.soft_assert(self.assertEqual, metadata["scheduled"]["totalCount"], 0) self.soft_assert(self.assertEqual, metadata["total"]["artistCount"], 4) self.soft_assert(self.assertEqual, metadata["total"]["playlistCount"], 1) self.soft_assert(self.assertEqual, metadata["total"]["totalCount"], 5) self.soft_assert(self.assertEqual, projects[0]["id"], 500) self.soft_assert(self.assertEqual, projects[0]["targets"]["type"], "Playlist") self.soft_assert(self.assertEqual, len(projects[0]["targets"]["items"]), 4) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["id"], "01") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["name"], "TestAtrist") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["provider"], "spotify") self.soft_assert(self.assertEqual, len(projects[0]["targets"]["items"][0]["images"]), 2) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][0]["url"], "http://test.com") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][0]["width"], 200) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][0]["height"], 250) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][1]["url"], "http://test.com/1") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][1]["width"], 200) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][0]["images"][1]["height"], 250) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][1]["id"], "02") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][1]["name"], "TestingUpdate") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][1]["provider"], "spotify") self.soft_assert(self.assertEqual, len(projects[0]["targets"]["items"][1]["images"]), 0) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][2]["id"], "03") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][2]["name"], "artist2") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][2]["provider"], "spotify") self.soft_assert(self.assertEqual, len(projects[0]["targets"]["items"][2]["images"]), 0) self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][3]["id"], "04") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][3]["name"], "artist01") self.soft_assert(self.assertEqual, projects[0]["targets"]["items"][3]["provider"], "apple") self.soft_assert(self.assertEqual, len(projects[0]["targets"]["items"][3]["images"]), 0) self.soft_assert(self.assertEqual, projects[0]["name"], "test_project_1") self.soft_assert(self.assertEqual, projects[0]["totalSpend"], 451110) self.soft_assert(self.assertEqual, projects[0]["budget"], 1402.41) self.soft_assert(self.assertEqual, projects[0]["allocation"], 1000.0) self.soft_assert(self.assertEqual, projects[0]["status"], 3) self.soft_assert(self.assertEqual, projects[0]["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, projects[0]["startDate"], "2007-01-01") self.soft_assert(self.assertEqual, projects[0]["endDate"], "2020-10-11") self.soft_assert(self.assertEqual, projects[0]["userRoles"][0]["categoryIds"], []) self.soft_assert(self.assertEqual, projects[0]["userRoles"][0]["id"], 1) self.soft_assert(self.assertEqual, projects[0]["userRoles"][0]["name"], "Editor") self.soft_assert(self.assertEqual, projects[0]["title"], "DJ GRAS feat. 101 id from PRS") self.soft_assert(self.assertEqual, projects[1]["id"], 420) self.soft_assert(self.assertEqual, projects[2]["id"], 502) self.soft_assert(self.assertEqual, projects[2]["name"], "test_project_3") self.soft_assert(self.assertEqual, projects[2]["targets"]["type"], "Artist") self.soft_assert(self.assertEqual, len(projects[2]["targets"]["items"]), 3) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["id"], "GRAS_1234212") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["name"], "TestingUpdate") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["isSony"], True) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["isPRS"], True) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["image"]["url"], "http://test.com/2") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["image"]["width"], 300) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][0]["image"]["height"], 250) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][1]["id"], "GRAS_1234213") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][1]["name"], "artist2") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][1]["isSony"], True) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][1]["isPRS"], False) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][1]["image"], None) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][2]["id"], "GRAS_1234214") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][2]["name"], "artist01") self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][2]["isSony"], True) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][2]["isPRS"], False) self.soft_assert(self.assertEqual, projects[2]["targets"]["items"][2]["image"], None) self.soft_assert(self.assertEqual, projects[2]["totalSpend"], 51025) self.soft_assert(self.assertEqual, projects[2]["budget"], 31402.41) self.soft_assert(self.assertEqual, projects[2]["allocation"], 9000.0) self.soft_assert(self.assertEqual, projects[2]["status"], 3) self.soft_assert(self.assertEqual, projects[2]["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, projects[2]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, projects[2]["endDate"], "2020-10-11") self.soft_assert(self.assertEqual, projects[2]["userRoles"][0]["categoryIds"], []) self.soft_assert(self.assertEqual, projects[2]["userRoles"][0]["id"], 1) self.soft_assert(self.assertEqual, projects[2]["userRoles"][0]["name"], "Editor") self.soft_assert(self.assertEqual, projects[2]["title"], "DJ GRAS feat. 100 id from PRS") self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestCrudProject(BaseTestCase): url = "/projects" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_project(self): url = self.url + "/502" response = self.execute_get(url, headers=self.headers) project = response.json self.soft_assert(self.assertEqual, project["id"], 502) self.soft_assert(self.assertEqual, project["name"], "test_project_3") self.soft_assert(self.assertEqual, project["budget"], 31402.41) self.soft_assert(self.assertEqual, project["allocation"], 9000.0) self.soft_assert(self.assertEqual, project["prsData"]["id"], "29712") self.soft_assert(self.assertEqual, project["prsData"]["title"], "DJ GRAS feat. 100 id from PRS") self.soft_assert(self.assertEqual, project["prsData"]["updatedAt"], "2021-02-22T16:14:35.748032+00:00") self.soft_assert(self.assertEqual, project["targets"]["type"], "Artist") self.soft_assert(self.assertEqual, len(project["targets"]["items"]), 3) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["id"], "GRAS_1234212") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["name"], "TestingUpdate") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["url"], "http://test.com/2") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["width"], 300) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["height"], 250) self.soft_assert(self.assertEqual, project["targets"]["items"][1]["id"], "GRAS_1234213") self.soft_assert(self.assertEqual, project["targets"]["items"][1]["name"], "artist2") self.soft_assert(self.assertEqual, project["targets"]["items"][1]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][1]["image"], None) self.soft_assert(self.assertEqual, project["targets"]["items"][2]["id"], "GRAS_1234214") self.soft_assert(self.assertEqual, project["targets"]["items"][2]["name"], "artist01") self.soft_assert(self.assertEqual, project["targets"]["items"][2]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][2]["image"], None) self.soft_assert(self.assertEqual, project["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["endDate"], "2020-10-11") self.soft_assert(self.assertEqual, project["editDate"], "2019-01-01T00:00:02+00:00") self.soft_assert(self.assertEqual, project["label"]["id"], 4) self.soft_assert(self.assertEqual, project["label"]["name"], "CMG") self.soft_assert(self.assertEqual, project["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, project["status"], 3) self.soft_assert(self.assertEqual, project["totalSpend"], 10205) self.soft_assert(self.assertEqual, len(project["territories"]), 1) self.soft_assert(self.assertEqual, project["territories"][0]["id"], 1) self.soft_assert(self.assertEqual, project["territories"][0]["name"], "Ukraine") self.soft_assert(self.assertEqual, project["userRoles"][0]["categoryIds"], []) self.soft_assert(self.assertEqual, project["userRoles"][0]["id"], 1) self.soft_assert(self.assertEqual, project["userRoles"][0]["name"], "Editor") self.soft_assert(self.assertEqual, project["notes"], "Some notes") self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["internalCampaignsCount"], 3) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["externalCampaignsCount"], 2) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["pendingCampaignsCount"], 1) self.soft_assert(self.assertEqual, project["metadata"]["plannedBudget"], 10205) self.soft_assert(self.assertEqual, project["metadata"]["productFamiliesCount"], 1) self.soft_assert(self.assertEqual, project["metadata"]["assignedUsersCount"], 3) self.soft_assert(self.assertEqual, project["metadata"]["estimatedImpressions"], 50_000) self.soft_assert(self.assertEqual, project["metadata"]["linkfire"]["projectLinksCount"], 3) self.soft_assert(self.assertEqual, project["metadata"]["linkfire"]["campaignsLinksCount"], 1) self.soft_assert(self.assertEqual, len(project["linkfireLinks"]), 3) self.soft_assert( self.assertEqual, project["linkfireLinks"][0], { "id": 1, "linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS", "deletable": True, }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][1], { "id": 2, "linkId": "9dcb0346-6c8f-45d7-b229-93f859238721", "linkUrl": "Blink182.lnk.to/NACS", "deletable": True, }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][2], { "id": 3, "linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182", "deletable": True, }, ) response = self.execute_get("/projects/502/media-plans/44/metrics", headers=self.headers) metrics = response.json self.soft_assert(self.assertEqual, len(metrics["territories"]), 1) self.soft_assert(self.assertEqual, metrics["territories"][0]["id"], 1) self.soft_assert(self.assertEqual, metrics["territories"][0]["name"], "Ukraine") self.soft_assert(self.assertEqual, metrics["campaignsCount"], 3) self.soft_assert(self.assertEqual, metrics["plannedBudget"], 10205) self.soft_assert(self.assertEqual, metrics["estimatedImpressions"], 50_000) self.assert_all() def test_get_budget_for_unassigned_project(self): url = "/projects/{}/budgets" response = self.execute_get(url.format(502), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, len(data), 3) self.soft_assert( self.assertEqual, data[0], { "allocation": 9000.0, "budget": 7000.0, "id": 1, "title": "Publicity", "categories": [ {"allocation": 9000.0, "budget": 7000.0, "id": 1, "title": "Independent Press/Publicity"} ], }, ) self.soft_assert( self.assertEqual, data[1], { "allocation": 0.0, "budget": 23402.41, "id": 2, "title": "Product Marketing", "categories": [{"allocation": 0.0, "budget": 23402.41, "id": 8, "title": "Album Package Design"}], }, ) self.soft_assert( self.assertEqual, data[2], { "allocation": 0.0, "budget": 1000.0, "id": 3, "title": "Promotion", "categories": [{"allocation": 0, "budget": 1000.0, "id": 1, "title": "Independent Press/Publicity"}], }, ) self.assert_all() def test_get_project_not_found(self): url = self.url + "/5555" response = self.execute_get(url, headers=self.headers) self.soft_assert(self.assertEqual, 404, response.status_code) self.soft_assert(self.assertEqual, "project_not_found", response.json["code"]) self.assert_all() def test_update_artist_project(self): url = self.url + "/500" data = { "targets": { "items": [ { "id": "GRAS_2030", "image": {"height": 100, "url": "http://test.com/test11", "width": 200}, "isSony": True, "name": "Ricardo", }, { "id": "GRAS_2031", "image": {"height": 1340, "url": "http://test.com/asd", "width": 2200}, "isSony": True, "name": "Milos", }, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-09-12", "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"}, ], } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) project = response.json now = datetime.now(timezone.utc) edited = datetime.fromisoformat(project["editDate"]) self.assertEqual(200, response.status_code) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, project["name"], "updated_project_name") self.soft_assert(self.assertEqual, project["id"], 500) self.soft_assert(self.assertEqual, project["targets"]["type"], "Artist") self.soft_assert(self.assertEqual, len(project["targets"]["items"]), 2) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["id"], "GRAS_2030") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["name"], "Ricardo") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["url"], "http://test.com/test11") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["width"], 200) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["height"], 100) self.soft_assert(self.assertEqual, project["targets"]["items"][1]["id"], "GRAS_2031") self.soft_assert(self.assertEqual, project["targets"]["items"][1]["name"], "Milos") self.soft_assert(self.assertEqual, project["targets"]["items"][1]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][1]["image"]["url"], "http://test.com/asd") self.soft_assert(self.assertEqual, project["targets"]["items"][1]["image"]["width"], 2200) self.soft_assert(self.assertEqual, project["targets"]["items"][1]["image"]["height"], 1340) self.soft_assert(self.assertEqual, project["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["endDate"], "2020-10-11") self.soft_assert(self.assertEqual, project["label"]["id"], 4) self.soft_assert(self.assertEqual, project["label"]["name"], "CMG") self.soft_assert(self.assertEqual, project["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, project["status"], 3) self.soft_assert(self.assertEqual, project["totalSpend"], 90222) self.soft_assert(self.assertEqual, len(project["territories"]), 0) self.soft_assert(self.assertEqual, len(project["userRoles"]), 1) self.soft_assert(self.assertEqual, project["userRoles"][0]["categoryIds"], []) self.soft_assert(self.assertEqual, project["userRoles"][0]["id"], 1) self.soft_assert(self.assertEqual, project["userRoles"][0]["name"], "Editor") self.soft_assert(self.assertEqual, len(project["linkfireLinks"]), 3) self.soft_assert(self.assertEqual, project["metadata"]["assignedUsersCount"], 4) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["externalCampaignsCount"], 0) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["internalCampaignsCount"], 3) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["pendingCampaignsCount"], 1) self.soft_assert(self.assertEqual, project["metadata"]["plannedBudget"], 90222) self.soft_assert(self.assertEqual, project["metadata"]["productFamiliesCount"], 0) self.soft_assert(self.assertEqual, project["metadata"]["estimatedImpressions"], 18555.0) self.soft_assert(self.assertEqual, project["metadata"]["linkfire"]["campaignsLinksCount"], 0) self.soft_assert(self.assertEqual, project["metadata"]["linkfire"]["projectLinksCount"], 3) self.soft_assert( self.assertEqual, project["linkfireLinks"][0], { "id": 3, "linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182", "deletable": True, }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][1], { "deletable": True, "id": 4, "linkId": "ca98fcdd-61ae-43df-b973-765c1ed9143f", "linkUrl": "lnk.to/blink-182_BIOMY", }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][2], { "deletable": True, "id": 5, "linkId": "90708787-46a8-4d38-8f5f-4b730951e395", "linkUrl": "Blink182.lnk.to/Quarantine", }, ) response = self.execute_get("/projects/500/media-plans/42/metrics", headers=self.headers) metrics = response.json self.soft_assert(self.assertEqual, len(metrics["territories"]), 0) self.soft_assert(self.assertEqual, metrics["campaignsCount"], 3) self.soft_assert(self.assertEqual, metrics["plannedBudget"], 90222) self.soft_assert(self.assertEqual, metrics["estimatedImpressions"], 18555.0) self.assert_all() def test_update_unknown_prs_artist_project(self): url = self.url + "/420" data = { "targets": { "items": [ { "id": "GRAS_2030", "image": {"height": 100, "url": "http://test.com/test11", "width": 200}, "isSony": True, "isPRS": False, "isUnknown": False, "name": "Ricardo", "type": "Primary" }, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-09-12", "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"}, ], } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) project = response.json now = datetime.now(timezone.utc) edited = datetime.fromisoformat(project["editDate"]) self.assertEqual(200, response.status_code) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, project["name"], "updated_project_name") self.soft_assert(self.assertEqual, project["id"], 420) self.soft_assert(self.assertEqual, project["targets"]["type"], "Artist") self.soft_assert(self.assertEqual, len(project["targets"]["items"]), 1) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["id"], "GRAS_2030") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["name"], "Ricardo") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["isSony"], True) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["url"], "http://test.com/test11") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["width"], 200) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["image"]["height"], 100) self.assert_all() def test_update_playlist_project(self): url = self.url + "/500" data = { "targets": { "items": [ { "id": "plylistID", "images": [{"height": 122, "url": "http://test.com/19", "width": 144}], "ownerName": "Owner Apple", "provider": "spotify", "name": "Best of Krovostok", } ], "type": "Playlist", }, "name": "updated_project_name", "endDate": "2020-08-11", "startDate": "2007-09-12", "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"}, ], } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) project = response.json now = datetime.now(timezone.utc) edited = datetime.fromisoformat(project["editDate"]) self.assertEqual(200, response.status_code) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert(self.assertEqual, project["name"], "updated_project_name") self.soft_assert(self.assertEqual, project["id"], 500) self.soft_assert(self.assertEqual, project["targets"]["type"], "Playlist") self.soft_assert(self.assertEqual, len(project["targets"]["items"]), 1) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["id"], "plylistID") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["name"], "Best of Krovostok") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["ownerName"], "Owner Apple") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["provider"], "spotify") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["images"][0]["url"], "http://test.com/19") self.soft_assert(self.assertEqual, project["targets"]["items"][0]["images"][0]["width"], 144) self.soft_assert(self.assertEqual, project["targets"]["items"][0]["images"][0]["height"], 122) self.soft_assert(self.assertEqual, project["createUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["createUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["editUser"]["email"], "dev-marketing-user-1@example.com") self.soft_assert(self.assertEqual, project["editUser"]["id"], "sme-dna|5cf0091d6c91d310fe6fcdc6") self.soft_assert(self.assertEqual, project["endDate"], "2020-08-11") self.soft_assert(self.assertEqual, project["label"]["id"], 4) self.soft_assert(self.assertEqual, project["label"]["name"], "CMG") self.soft_assert(self.assertEqual, project["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, project["status"], 3) self.soft_assert(self.assertEqual, project["totalSpend"], 90222) self.soft_assert(self.assertEqual, len(project["territories"]), 0) self.soft_assert(self.assertEqual, project["userRoles"][0]["categoryIds"], []) self.soft_assert(self.assertEqual, project["userRoles"][0]["id"], 1) self.soft_assert(self.assertEqual, project["userRoles"][0]["name"], "Editor") self.soft_assert( self.assertEqual, project["linkfireLinks"][0], { "id": 3, "linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182", "deletable": True, }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][1], { "deletable": True, "id": 4, "linkId": "ca98fcdd-61ae-43df-b973-765c1ed9143f", "linkUrl": "lnk.to/blink-182_BIOMY", }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][2], { "deletable": True, "id": 5, "linkId": "90708787-46a8-4d38-8f5f-4b730951e395", "linkUrl": "Blink182.lnk.to/Quarantine", }, ) response = self.execute_get("/projects/500/media-plans/42/metrics", headers=self.headers) metrics = response.json self.soft_assert(self.assertEqual, len(metrics["territories"]), 0) self.assert_all() def test_update_project_no_targets_should_return_bad_request(self): data = { "name": "project_name", "endDate": "2020-10-11", } response = self.execute_put(self.url + "/500", data=json.dumps(data), headers=self.headers) self.assertEqual(400, response.status_code) self.assertEqual("validation_error.json", response.json["code"]) def test_update_project_invalid_items_type_should_return_bad_request(self): data = { "targets": { "items": [ { "id": "GRAS_2077", "image": {"height": 150, "url": "http://test.com/7", "width": 900}, "isSony": True, "name": "Ricardo", } ], "type": "Artistos", }, "name": "project_name", "endDate": "2020-10-11", "startDate": "2019-09-12", } response = self.execute_put(self.url + "/500", data=json.dumps(data), headers=self.headers) self.assertEqual(400, response.status_code) self.assertEqual("validation_error.json", response.json["code"]) def test_update_project_no_items_should_return_bad_request(self): data = { "targets": {"items": [], "type": "Artist"}, "name": "project_name", "endDate": "2020-10-11", "startDate": "2020-10-10", } response = self.execute_put(self.url + "/500", data=json.dumps(data), headers=self.headers) self.assertEqual(400, response.status_code) self.assertEqual("validation_error.json", response.json["code"]) def test_remove_prs_artist_should_return_403(self): url = self.url + "/502" data = { "targets": { "items": [ { "id": "GRAS_2030", "image": {"height": 100, "url": "http://test.com/test11", "width": 200}, "isSony": True, "name": "Ricardo", }, { "id": "GRAS_2031", "image": {"height": 1340, "url": "http://test.com/asd", "width": 2200}, "isSony": True, "name": "Milos", }, ], "type": "Artist", }, "name": "project_name", "endDate": "2020-10-11", "startDate": "2020-10-10", } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(403, response.status_code) def test_projects_export_artists(self): url = self.url + "/export" path = get_file_path("projects/fixtures/projects_export_artists.csv") file = open(path) response = self.execute_get(url, headers=self.headers, query_string={"type": "Artist"}) 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", ""), file.read()) self.assert_all() def test_projects_export_playlists(self): url = self.url + "/export" path = get_file_path("projects/fixtures/projects_export_playlists.csv") file = open(path) response = self.execute_get(url, headers=self.headers, query_string={"type": "Playlist"}) 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", ""), file.read()) self.assert_all() @pytest.mark.skip(reason="Need to be changed because of Phase logic changing") def test_update_project_schedule(self): url = self.url + "/500" data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-01-01", "scheduleUpdates": { "phases": [{"entityId": 451, "startDate": "2009-08-04"}, {"entityId": 452, "startDate": "2016-05-02"}], "campaigns": [ {"entityId": 1, "startDate": "2007-02-07", "endDate": "2008-10-11"}, {"entityId": 2, "startDate": "2007-02-08", "endDate": "2008-10-05"}, ], }, } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 200) phases_response = self.execute_get("/projects/500/phases", headers=self.headers) phases = phases_response.json campaigns_response = self.execute_get("/projects/500/campaigns-list", headers=self.headers) campaigns = campaigns_response.json["items"] self.soft_assert(self.assertEqual, phases[0]["start_date"], "2007-01-01") self.soft_assert(self.assertEqual, phases[0]["end_date"], "2009-08-03") self.soft_assert(self.assertEqual, phases[1]["start_date"], "2009-08-04") self.soft_assert(self.assertEqual, phases[1]["end_date"], "2016-05-01") self.soft_assert(self.assertEqual, phases[2]["start_date"], "2016-05-02") self.soft_assert(self.assertEqual, phases[2]["end_date"], "2020-10-11") self.soft_assert(self.assertEqual, campaigns[0]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, campaigns[0]["endDate"], "2008-10-10") self.soft_assert(self.assertEqual, campaigns[1]["startDate"], "2007-02-07") self.soft_assert(self.assertEqual, campaigns[1]["endDate"], "2008-10-11") self.assert_all() def test_update_project_schedule_invalid_campaign_start_date_should_raise_error(self): url = self.url + "/500" data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-01-01", "scheduleUpdates": { "campaigns": [ {"entityId": 1, "startDate": "2006-02-07", "endDate": "2008-10-11"}, {"entityId": 2, "startDate": "2007-02-08", "endDate": "2008-10-05"}, ] }, } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 400) def test_update_project_schedule_invalid_campaign_id_should_raise_error(self): url = self.url + "/500" data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-01-01", "scheduleUpdates": { "campaigns": [ {"entityId": 111, "startDate": "2007-02-07", "endDate": "2008-10-11"}, {"entityId": 2, "startDate": "2007-02-08", "endDate": "2008-10-05"}, ] }, } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 404) def test_update_project_schedule_campaign_id_from_another_project_should_raise_error(self): url = self.url + "/500" data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-01-01", "scheduleUpdates": { "campaigns": [ {"entityId": 3, "startDate": "2007-02-07", "endDate": "2008-10-11"}, {"entityId": 2, "startDate": "2007-02-08", "endDate": "2008-10-05"}, ] }, } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 404) def test_update_project_schedule_DSP_campaign_should_raise_error(self): url = self.url + "/500" data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "updated_project_name", "endDate": "2020-10-11", "startDate": "2007-01-01", "scheduleUpdates": { "campaigns": [ {"entityId": 1, "startDate": "2007-02-07", "endDate": "2008-10-11"}, {"entityId": 30, "startDate": "2007-02-08", "endDate": "2008-10-05"}, ] }, } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 403) def test_get_project_should_return_403(self): url = self.url + "/506" response = self.execute_get(url, headers=self.headers) self.assertEqual(403, response.status_code) data = response.json self.assertEqual("project_access_restricted", data['code']) self.assertEqual("test_project_6", data['detail']['projectName']) self.assertEqual(len(data['detail']['projectEditors']), 4) self.assertEqual("dev-marketing-10@example.com", data['detail']['projectEditors'][0]['email']) self.assertEqual("dev-marketing-user-5@example.com", data['detail']['projectEditors'][1]['email']) self.assertEqual("dev-marketing-user-6@example.com", data['detail']['projectEditors'][2]['email']) self.assertEqual("dev-marketing-user-7@example.com", data['detail']['projectEditors'][3]['email']) def test_get_confidential_project_restriction_should_return_only_project_editors(self): url = self.url + "/508" response = self.execute_get(url, headers=self.headers) self.assertEqual(403, response.status_code) data = response.json self.assertEqual("project_access_restricted", data['code']) self.assertEqual(len(data['detail']), 2) self.assertEqual("dev-marketing-user-2@example.com", data['detail']['projectEditors'][0]['email']) self.assertEqual("dev-marketing-user-3@example.com", data['detail']['projectEditors'][1]['email']) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user6.jwt_decode) class TestGetListSpecificProjects(BaseTestCase): url = "/projects" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_projects_by_admin(self): response = self.execute_get(self.url, headers=self.headers) items = response.json["items"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(4, len(items)) def test_roles_ordering_in_project_list(self): response = self.execute_get(self.url, headers=self.headers) items = response.json["items"] self.assertEqual(200, response.status_code) self.assertEqual(items[3]['id'], 508) self.assertEqual(items[3]['name'], "test_project_8") self.assertEqual(items[3]['userRoles'][0]['name'], "Admin") self.assertEqual(items[3]['userRoles'][1]['name'], "Approver")