import json from datetime import datetime, timedelta from unittest.mock import patch import pytest from tests.test_utils import FixtureLoader from models import models from tests import BaseTestCase, mock_for_user from tests.unassigned_projects.fixtures.unassigned_projects_fixture import fixture from config import LABEL_IMAGE_SERVICE_URL user1Mock = mock_for_user(1, "dev-marketing-user-1@example.com", "sme-dna|5cf0091d6c91d310fe6fcdc6", is_admin=True) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) class TestGetUnassignedProjects(BaseTestCase): url = "/unassigned-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, query_string={"sort": "id"}) items = response.json["items"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(3, len(items)) projects = response.json["items"] metadata = response.json["metadata"] self.soft_assert(self.assertEqual, metadata["completed"]["artistCount"], 1) self.soft_assert(self.assertEqual, metadata["completed"]["playlistCount"], 1) self.soft_assert(self.assertEqual, metadata["completed"]["totalCount"], 2) 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"], 505) self.soft_assert(self.assertEqual, projects[0]["grasData"]["id"], "1012345") self.soft_assert(self.assertEqual, projects[0]["grasData"]["title"], "Gras Project Title 2") self.soft_assert(self.assertEqual, projects[0]["prsData"]["id"], "297168") self.soft_assert(self.assertEqual, projects[0]["prsData"]["title"], "DJ GRAS feat. 104 id from PRS") self.soft_assert(self.assertEqual, projects[0]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, projects[0]["endDate"], "2007-02-03") self.soft_assert(self.assertEqual, projects[0]["budget"], 31402.41) self.soft_assert(self.assertEqual, projects[0]["allocation"], 9000.0) self.soft_assert( self.assertEqual, projects[0]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[0]["artists"], [ { "id": "GRAS_124511", "image": None, "isSony": True, "isPRS": False, "isUnknown": False, "name": "TestAtrist", "type": "Primary", }, { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Primary", }, ], ) self.soft_assert(self.assertEqual, projects[1]["id"], 506) self.soft_assert(self.assertEqual, projects[1]["grasData"]["id"], "2012345") self.soft_assert(self.assertEqual, projects[1]["grasData"]["title"], "Gras Project Title 2") self.soft_assert(self.assertEqual, projects[1]["prsData"]["id"], "1232532") self.soft_assert(self.assertEqual, projects[1]["prsData"]["title"], "DJ GRAS feat. 1232532 id from PRS") self.soft_assert(self.assertEqual, projects[1]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, projects[1]["endDate"], "2007-02-05") self.soft_assert(self.assertEqual, projects[1]["budget"], 3121402.41) self.soft_assert(self.assertEqual, projects[1]["allocation"], 4353.0) self.soft_assert( self.assertEqual, projects[1]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[1]["artists"], [ { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Primary", } ], ) self.soft_assert(self.assertEqual, projects[2]["id"], 507) self.soft_assert(self.assertEqual, projects[2]["grasData"]["id"], "3012345") self.soft_assert(self.assertEqual, projects[2]["grasData"]["title"], "Gras Project Title 3") self.soft_assert(self.assertEqual, projects[2]["prsData"]["id"], "1232533452") self.soft_assert(self.assertEqual, projects[2]["prsData"]["title"], "DJ GRAS feat. 2141212 id from PRS") self.soft_assert(self.assertEqual, projects[2]["startDate"], "2007-02-02") self.soft_assert( self.assertEqual, projects[2]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[2]["artists"], [ { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Featured", } ], ) self.assert_all() def test_get_project_list_for_artist(self): response = self.execute_get(self.url, headers=self.headers, query_string={"sort": "id"}) items = response.json["items"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(3, len(items)) projects = response.json["items"] metadata = response.json["metadata"] self.soft_assert(self.assertEqual, metadata["completed"]["artistCount"], 1) self.soft_assert(self.assertEqual, metadata["completed"]["playlistCount"], 1) self.soft_assert(self.assertEqual, metadata["completed"]["totalCount"], 2) 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"], 505) self.soft_assert(self.assertEqual, projects[0]["grasData"]["id"], "1012345") self.soft_assert(self.assertEqual, projects[0]["grasData"]["title"], "Gras Project Title 2") self.soft_assert(self.assertEqual, projects[0]["prsData"]["id"], "297168") self.soft_assert(self.assertEqual, projects[0]["prsData"]["title"], "DJ GRAS feat. 104 id from PRS") self.soft_assert(self.assertEqual, projects[0]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, projects[0]["endDate"], "2007-02-03") self.soft_assert(self.assertEqual, projects[0]["budget"], 31402.41) self.soft_assert(self.assertEqual, projects[0]["allocation"], 9000.0) self.soft_assert( self.assertEqual, projects[0]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[0]["artists"], [ { "id": "GRAS_124511", "image": None, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestAtrist", "type": "Primary", }, { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Primary", }, ], ) self.soft_assert(self.assertEqual, projects[1]["id"], 506) self.soft_assert(self.assertEqual, projects[1]["grasData"]["id"], "2012345") self.soft_assert(self.assertEqual, projects[1]["grasData"]["title"], "Gras Project Title 2") self.soft_assert(self.assertEqual, projects[1]["prsData"]["id"], "1232532") self.soft_assert(self.assertEqual, projects[1]["prsData"]["title"], "DJ GRAS feat. 1232532 id from PRS") self.soft_assert(self.assertEqual, projects[1]["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, projects[1]["endDate"], "2007-02-05") self.soft_assert(self.assertEqual, projects[1]["budget"], 3121402.41) self.soft_assert(self.assertEqual, projects[1]["allocation"], 4353.0) self.soft_assert( self.assertEqual, projects[1]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[1]["artists"], [ { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Primary", } ], ) self.soft_assert(self.assertEqual, projects[2]["id"], 507) self.soft_assert(self.assertEqual, projects[2]["grasData"]["id"], "3012345") self.soft_assert(self.assertEqual, projects[2]["grasData"]["title"], "Gras Project Title 3") self.soft_assert(self.assertEqual, projects[2]["prsData"]["id"], "1232533452") self.soft_assert(self.assertEqual, projects[2]["prsData"]["title"], "DJ GRAS feat. 2141212 id from PRS") self.soft_assert(self.assertEqual, projects[2]["startDate"], "2007-02-02") self.soft_assert( self.assertEqual, projects[2]["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) }, ) self.soft_assert( self.assertEqual, projects[2]["artists"], [ { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Featured", } ], ) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) class TestUnassignedProject(BaseTestCase): url = "/unassigned-projects" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_project(self): url = self.url + "/505" response = self.execute_get(url, headers=self.headers) project = response.json self.soft_assert(self.assertEqual, project["id"], 505) self.soft_assert(self.assertEqual, project["isConfidential"], True) self.soft_assert(self.assertEqual, project["grasData"]["id"], "1012345") self.soft_assert(self.assertEqual, project["grasData"]["title"], "Gras Project Title 2") self.soft_assert(self.assertEqual, project["prsData"]["id"], "297168") self.soft_assert(self.assertEqual, project["prsData"]["title"], "DJ GRAS feat. 104 id from PRS") self.soft_assert(self.assertEqual, project["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, project["endDate"], "2007-02-03") self.soft_assert(self.assertEqual, project["budget"], 31402.41) self.soft_assert(self.assertEqual, project["allocation"], 9000.0) self.soft_assert_equal( project["repertoireOwner"], { "externalId": "123456", "id": 1, "name": "Columbia Records", "abbreviation": None, "country": None, "imageUrl": LABEL_IMAGE_SERVICE_URL.format(id=1) } ) self.soft_assert( self.assertEqual, project["artists"], [ { "id": "GRAS_124511", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist", "isPRS": False, "type": "Primary", }, { "id": "GRAS_124512", "image": {"height": 250, "url": "http://test.com/2", "width": 300}, "isSony": True, "isUnknown": False, "name": "TestingUpdate", "type": "Primary", "isPRS": False, }, ], ) self.assert_all() def test_get_budget_for_unassigned_project(self): url = "/projects/{}/budgets" response = self.execute_get(url.format(505), headers=self.headers) data = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, len(data), 2) self.soft_assert( self.assertEqual, data[0], { "allocation": 9000.0, "budget": 2000.0, "id": 1, "title": "Publicity", "categories": [ {"allocation": 9000.0, "budget": 2000.0, "id": 1, "title": "Independent Press/Publicity"} ], }, ) self.soft_assert( self.assertEqual, data[1], { "allocation": 0.0, "budget": 100.41, "id": 2, "title": "Product Marketing", "categories": [{"allocation": 0.0, "budget": 100.41, "id": 8, "title": "Album Package Design"}], }, ) self.assert_all() def test_get_project_campaign_details(self): url = self.url + "/505/campaigns/2dd6f9b4-42f5-48e8-a01f-c7bb9dc6434d" response = self.execute_get(url, headers=self.headers) campaign = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, campaign["id"], 4) self.soft_assert(self.assertEqual, campaign["name"], "test_campaign_4") self.soft_assert(self.assertEqual, campaign["budgetSpend"], 1000.0) self.soft_assert(self.assertEqual, campaign["plannedBudget"], 15000.0) self.soft_assert(self.assertEqual, campaign["editDate"], "2019-07-22T20:14:55.355226+00:00") self.soft_assert(self.assertEqual, campaign["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, campaign["endDate"], "2008-10-10") self.soft_assert(self.assertEqual, campaign["objective"]["id"], 2) self.soft_assert(self.assertEqual, campaign["objective"]["name"], "Conversions") 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"], "Ukraine") self.soft_assert(self.assertEqual, campaign["isEditable"], False) self.soft_assert(self.assertEqual, campaign["isPending"], True) self.soft_assert( self.assertEqual, campaign["type"], {"category": {"id": 1, "name": "Digital"}, "id": 8, "name": "Social Ads"}, ) self.soft_assert(self.assertEqual, campaign["platforms"], [{"id": 1, "labelId": None, "name": "Apple TV"}]) self.assert_all() def test_get_project_should_return_403(self): url = self.url + "/510" response = self.execute_get(url, headers=self.headers) self.assertEqual(403, response.status_code) data = response.json self.assertEqual("unclaimed_project_access_restricted", data['code']) self.assertEqual("prs_title", data['detail']['projectName']) self.assertEqual("dev-marketing-user-2@example.com", data['detail']['projectEditors'][0]['email']) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) class TestClaimProject(BaseTestCase): url = "/projects/{}/claim" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_claim_ownership_of_unassigned_project(self): url = self.url.format("505") tomorrow = datetime.now() + timedelta(days=1) end_date = tomorrow.strftime("%Y-%m-%d") data = { "targets": { "items": [ { "id": "GRAS_1421", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist", "type": "Primary", }, { "id": "GRAS_142120", "image": None, "isSony": True, "isUnknown": False, "name": "TestingUpdate", "type": "Primary", }, ], "type": "Artist", }, "name": "Gras Project Title 1", "endDate": end_date, "startDate": "2007-02-02", "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"}, ], "scheduleUpdates": { "phases": [], "campaigns": [{"entityId": 6, "startDate": "2007-02-03", "endDate": "2020-10-11"}], }, } response = self.execute_post(url, headers=self.headers, data=json.dumps(data)) project = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, project["id"], 505) self.soft_assert(self.assertEqual, project["name"], "Gras Project Title 1") self.soft_assert(self.assertEqual, project["grasData"]["title"], "Gras Project Title 2") 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_1421", "image": None, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestAtrist", "type": "Primary", }, ) self.soft_assert( self.assertEqual, project["targets"]["items"][1], { "id": "GRAS_142120", "image": None, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestingUpdate", "type": "Primary", }, ) 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"], end_date) self.soft_assert(self.assertEqual, project["startDate"], "2007-02-02") self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["internalCampaignsCount"], 1) self.soft_assert(self.assertEqual, project["metadata"]["campaigns"]["externalCampaignsCount"], 0) self.soft_assert(self.assertEqual, project["metadata"]["productFamiliesCount"], 21) self.soft_assert(self.assertEqual, project["sharedStatus"], "by_me") self.soft_assert(self.assertEqual, project["status"], 2) self.soft_assert(self.assertEqual, project["totalSpend"], 10005) 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"], 0) self.soft_assert(self.assertEqual, project["userRoles"][0]["name"], "Admin") self.soft_assert(self.assertEqual, project["notes"], None) self.soft_assert(self.assertEqual, project["grasData"]["id"], "1012345") self.soft_assert(self.assertEqual, project["label"]["id"], 1) self.soft_assert(self.assertEqual, project["label"]["externalId"], "123456") self.soft_assert(self.assertEqual, project["label"]["name"], "Columbia Records") self.soft_assert( self.assertEqual, project["linkfireLinks"][0], { "id": 1, "linkId": "2b190f7c-cf68-4741-9c06-2718c473f6e5", "linkUrl": "lnk.to/Blink_182", "deletable": True, }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][1], { "deletable": True, "id": 2, "linkId": "ca98fcdd-61ae-43df-b973-765c1ed9143f", "linkUrl": "lnk.to/blink-182_BIOMY", }, ) self.soft_assert( self.assertEqual, project["linkfireLinks"][2], { "deletable": True, "id": 3, "linkId": "90708787-46a8-4d38-8f5f-4b730951e395", "linkUrl": "Blink182.lnk.to/Quarantine", }, ) def test_cant_claim_ownership_of_already_claimed_project(self): url = self.url.format("505") data = { "targets": { "items": [ { "id": "GRAS_1421", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist", "type": "Primary", }, { "id": "GRAS_142120", "image": None, "isSony": True, "isUnknown": False, "name": "TestingUpdate", "type": "Primary", }, ], "type": "Artist", }, "name": "Gras Project Title 1", "endDate": "2020-10-11", "startDate": "2007-02-02", } self.execute_post(url, headers=self.headers, data=json.dumps(data)) response = self.execute_post(url, headers=self.headers, data=json.dumps(data)) resp = response.json self.assertEqual(403, response.status_code) self.soft_assert(self.assertEqual, resp["code"], "unassigned_project_claim_restricted") self.soft_assert(self.assertEqual, resp["detail"], "You can't claim ownership for this project.") self.assert_all() def test_claim_project_with_empty_name(self): url = self.url.format("505") tomorrow = datetime.now() + timedelta(days=1) end_date = tomorrow.strftime("%Y-%m-%d") data = { "targets": { "items": [ { "id": "GRAS_1421", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist", "type": "Primary", }, ], "type": "Artist", }, "name": "", "endDate": end_date, "startDate": "2007-02-02", "linkfireLinks": [] } response = self.execute_post(url, headers=self.headers, data=json.dumps(data)) self.assertEqual(422, response.status_code)