import json 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 from tests.artists_moments.fixtures.artists_moments_fixture import fixture @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestArtistsMoments(BaseTestCase): url = "/projects/500/artists-moments" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_moments_for_project(self): response = self.execute_get(self.url, headers=self.headers) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(2, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 100) self.soft_assert(self.assertEqual, items[0]["name"], "Dilsinho New Release") self.soft_assert(self.assertEqual, items[0]["notes"], "some notes") self.soft_assert( self.assertEqual, items[0]["artist"], {"id": "GRAS_10", "isUnknown": False, "image": None, "isSony": True, "name": "TestAtrist"}, ) self.soft_assert(self.assertEqual, items[0]["category"], None) self.soft_assert(self.assertEqual, items[0]["type"], {"id": 10, "name": "Major Appearance"}) self.soft_assert( self.assertEqual, items[0]["createUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert( self.assertEqual, items[0]["editUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert(self.assertEqual, items[0]["link"], "www.dilsinho.com") self.soft_assert(self.assertEqual, items[0]["date"], "2021-01-05") self.soft_assert(self.assertEqual, items[0]["territories"], [{"id": 1, "name": "USA", "parentId": None}]) self.soft_assert(self.assertEqual, items[1]["id"], 101) self.soft_assert(self.assertEqual, items[1]["name"], "Just New Release") self.soft_assert(self.assertEqual, items[1]["notes"], None) self.soft_assert( self.assertEqual, items[1]["artist"], { "id": "GRAS_20", "image": {"url": "www.test.image.com", "width": 100, "height": 200}, "isSony": True, "isUnknown": False, "name": "TestArtist2", }, ) self.soft_assert(self.assertEqual, items[1]["category"], {"id": 4, "name": "Anniversary"}) self.soft_assert(self.assertEqual, items[1]["type"], None) self.soft_assert( self.assertEqual, items[1]["createUser"], {"email": "dev-marketing-user-2@example.com", "id": 2, "name": "user-2"}, ) self.soft_assert( self.assertEqual, items[1]["editUser"], {"email": "dev-marketing-user-2@example.com", "id": 2, "name": "user-2"}, ) self.soft_assert(self.assertEqual, items[1]["link"], None) self.soft_assert(self.assertEqual, items[1]["date"], "2021-01-06") self.soft_assert(self.assertEqual, items[1]["territories"], [{"id": 2, "name": "Ukraine", "parentId": None}]) self.assert_all() def test_get_moment_by_id(self): response = self.execute_get("/projects/500/artists-moments/100", headers=self.headers) item = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, item["id"], 100) self.soft_assert(self.assertEqual, item["name"], "Dilsinho New Release") self.soft_assert(self.assertEqual, item["notes"], "some notes") self.soft_assert( self.assertEqual, item["artist"], {"id": "GRAS_10", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist"}, ) self.soft_assert(self.assertEqual, item["category"], None) self.soft_assert(self.assertEqual, item["type"], {"id": 10, "name": "Major Appearance"}) self.soft_assert( self.assertEqual, item["createUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert( self.assertEqual, item["editUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"} ) self.soft_assert(self.assertEqual, item["link"], "www.dilsinho.com") self.soft_assert(self.assertEqual, item["date"], "2021-01-05") self.soft_assert(self.assertEqual, item["territories"], [{"id": 1, "name": "USA", "parentId": None}]) self.assert_all() def test_create_moment_with_regular_type(self): data = { "name": "Test1", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [1], "link": "www.link.com", "notes": "Notes1", "typeId": 1, } response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) item = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, item["id"], 1) self.soft_assert(self.assertEqual, item["name"], "Test1") self.soft_assert(self.assertEqual, item["notes"], "Notes1") self.soft_assert( self.assertEqual, item["artist"], {"id": "GRAS_10", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist"}, ) self.soft_assert(self.assertEqual, item["category"], None) self.soft_assert(self.assertEqual, item["type"], {"id": 1, "name": "Online Appearance"}) self.soft_assert( self.assertEqual, item["createUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert( self.assertEqual, item["editUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"} ) self.soft_assert(self.assertEqual, item["link"], "www.link.com") self.soft_assert(self.assertEqual, item["date"], "2021-01-19") self.assert_all() def test_create_moment_with_custom_type(self): data = {"name": "Test1334", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [1], "categoryId": 3} response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) item = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, item["id"], 1) self.soft_assert(self.assertEqual, item["name"], "Test1334") self.soft_assert(self.assertEqual, item["notes"], None) self.soft_assert( self.assertEqual, item["artist"], {"id": "GRAS_10", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist"}, ) self.soft_assert(self.assertEqual, item["type"], None) self.soft_assert(self.assertEqual, item["category"], {"id": 3, "name": "Culture"}) self.soft_assert( self.assertEqual, item["createUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert( self.assertEqual, item["editUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"} ) self.soft_assert(self.assertEqual, item["link"], None) self.soft_assert(self.assertEqual, item["date"], "2021-01-19") self.assert_all() def test_edit_moment(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/500/artists-moments/100", headers=self.headers, data=json.dumps(data)) item = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, item["id"], 100) self.soft_assert(self.assertEqual, item["name"], "Test_NEW") self.soft_assert(self.assertEqual, item["notes"], None) self.soft_assert( self.assertEqual, item["artist"], {"id": "GRAS_10", "image": None, "isSony": True, "isUnknown": False, "name": "TestAtrist"}, ) self.soft_assert(self.assertEqual, item["category"], {"id": 3, "name": "Culture"}) self.soft_assert(self.assertEqual, item["type"], None) self.soft_assert( self.assertEqual, item["createUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"}, ) self.soft_assert( self.assertEqual, item["editUser"], {"email": "dev-marketing-user-1@example.com", "id": 1, "name": "user-1"} ) self.soft_assert(self.assertEqual, item["link"], None) self.soft_assert(self.assertEqual, item["date"], "2021-01-19") self.soft_assert(self.assertEqual, item["territories"], [{"id": 2, "name": "Ukraine", "parentId": None}]) self.assert_all() def test_delete_moment(self): delete_response = self.execute_delete("/projects/500/artists-moments/100", headers=self.headers) self.assertEqual(204, delete_response.status_code) get_response = self.execute_get("/projects/500/artists-moments/100", headers=self.headers) self.assertEqual(404, get_response.status_code) def test_get_moment_types(self): response = self.execute_get("/artists-moments/types", headers=self.headers) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, len(response.json), 3) self.soft_assert(self.assertEqual, len(response.json[0]["types"]), 11) self.soft_assert(self.assertEqual, len(response.json[1]["types"]), 5) self.soft_assert(self.assertEqual, len(response.json[2]["types"]), 3) self.soft_assert(self.assertEqual, response.json[0]["id"], 1) self.soft_assert(self.assertEqual, response.json[0]["name"], "Appearance") self.soft_assert(self.assertEqual, response.json[0]["types"][0], {"id": 1, "name": "Online Appearance"}) self.assert_all() def test_get_moment_categories(self): response = self.execute_get("/artists-moments/categories", headers=self.headers) self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, len(response.json), 8) self.soft_assert(self.assertEqual, response.json[0], {"id": 1, "name": "Personal Life"}) self.assert_all() def test_get_non_existing_moment_should_return_404(self): response = self.execute_get("/projects/500/artists-moments/999", headers=self.headers) self.assertEqual(404, response.status_code) def test_get_moment_for_project_not_related_to_this_moment_should_return_404(self): response = self.execute_get("/projects/501/artists-moments/101", headers=self.headers) self.assertEqual(404, response.status_code) def test_edit_moment_as_viewer_moment_owner_should_allow_action(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/501/artists-moments/100", headers=self.headers, data=json.dumps(data)) self.assertEqual(200, response.status_code) def test_edit_moment_as_viewer_not_moment_owner_should_not_allow_action(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/503/artists-moments/102", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code) def test_edit_moment_as_project_owner_not_moment_owner_should_allow_action(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/500/artists-moments/101", headers=self.headers, data=json.dumps(data)) self.assertEqual(200, response.status_code) def test_edit_moment_should_update_edited_at_status(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/500/artists-moments/101", headers=self.headers, data=json.dumps(data)) self.assertEqual(200, response.status_code) now = datetime.now(timezone.utc) edited = datetime.fromisoformat(response.json["editDate"]) self.soft_assert(self.assertTrue, (now - edited).seconds < 10) self.soft_assert_equal(response.json["editUser"]["id"], 1) self.assert_all() def test_edit_moment_as_project_editor_not_moment_owner_should_allow_action(self): data = {"name": "Test_NEW", "date": "2021-01-19", "artistId": "GRAS_30", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/504/artists-moments/102", headers=self.headers, data=json.dumps(data)) self.assertEqual(200, response.status_code) def test_create_moment_with_invalid_territory_id_should_return_400(self): data = { "name": "Test1334", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [990], "categoryId": 3, } response = self.execute_post(self.url, headers=self.headers, data=json.dumps(data)) self.assertEqual(400, response.status_code) def test_edit_moment_name_when_restricted_should_return_403(self): data = {"name": "Test_NEW", "date": "2021-02-05", "artistId": "GRAS_40", "territoriesIds": [2], "categoryId": 3} response = self.execute_put("/projects/505/artists-moments/103", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code) def test_edit_moment_date_when_restricted_should_return_403(self): data = { "name": "Just New Release 104", "date": "2021-01-19", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3, } response = self.execute_put("/projects/505/artists-moments/104", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code) def test_edit_moment_artist_when_restricted_should_return_403(self): data = { "name": "Just New Release 105", "date": "2021-02-05", "artistId": "GRAS_10", "territoriesIds": [2], "categoryId": 3, } response = self.execute_put("/projects/505/artists-moments/105", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code) def test_edit_moment_territories_when_restricted_should_return_403(self): data = { "name": "Just New Release 105", "date": "2021-02-05", "artistId": "GRAS_40", "territoriesIds": [1], "categoryId": 3, } response = self.execute_put("/projects/505/artists-moments/106", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code) def test_edit_moment_artist_to_not_primary_should_return_403(self): data = { "name": "Just New Release 105", "date": "2021-02-05", "artistId": "GRAS_30", "territoriesIds": [2], "categoryId": 3, } response = self.execute_put("/projects/500/artists-moments/100", headers=self.headers, data=json.dumps(data)) self.assertEqual(403, response.status_code)