from unittest.mock import patch, MagicMock from tests import BaseTestCase, mock_for_user from tests.test_utils import FixtureLoader, load_fixture from models import models, Campaign, Project from tests.global_search.fixtures.global_search_fixture import fixture from external_api.base.clients.delphi_client import DelphiArtistsListResponse, DelphiArtistsSearchCount import aiohttp import marshmallow_dataclass async def mocked_search_for_artists(*args, **kwargs): schema = marshmallow_dataclass.class_schema(DelphiArtistsListResponse) return schema().load(load_fixture("external_api/fixtures/artists_search.json")) async def mocked_search_count_for_artists(*args, **kwargs): schema = marshmallow_dataclass.class_schema(DelphiArtistsSearchCount) return schema().load(load_fixture("external_api/fixtures/artists_search.json")) async def mocked_raise(*args, **kwargs): raise aiohttp.ServerTimeoutError 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|9op0091d6cuhjp30fe6ffth34", is_admin=True) class TestGlobalSearch(BaseTestCase): def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) @patch.object(Project, "search", MagicMock(return_value=[502, 500])) @patch.object(Campaign, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_search_project(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={"query": "test_project"} ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["artists"]), 5) self.soft_assert_equal(len(data["campaigns"]), 0) self.soft_assert_equal(len(data["projects"]), 2) self.soft_assert_equal(data["projects"][0]["id"], 502) self.soft_assert_equal(data["projects"][0]["startDate"], "2007-02-02") self.soft_assert_equal(data["projects"][0]["name"], "test_project_3") self.soft_assert_equal( data["projects"][0]["userRoles"], [{'categoryIds': [], 'id': 1, 'name': 'Editor'}] ) self.soft_assert_equal(data["projects"][0]["targets"]["type"], "Playlist") self.soft_assert_equal(len(data["projects"][0]["targets"]["items"]), 1) self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["name"], "TestAtrist") self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][0]["url"], "http://test.com/2") self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][0]["width"], 300) self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][0]["height"], 250) self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][1]["url"], "http://test.com/3") self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][1]["width"], 400) self.soft_assert_equal(data["projects"][0]["targets"]["items"][0]["images"][1]["height"], 250) self.soft_assert_equal(data["projects"][1]["id"], 500) self.soft_assert_equal(data["projects"][1]["name"], "test_project_1") self.soft_assert_equal( data["projects"][1]["userRoles"], [{'categoryIds': [], 'id': 1, 'name': 'Editor'}] ) self.soft_assert_equal(data["projects"][1]["startDate"], "2007-01-01") self.soft_assert_equal(data["projects"][1]["targets"]["type"], "Artist") self.soft_assert_equal(len(data["projects"][1]["targets"]["items"]), 2) self.soft_assert_equal(data["projects"][1]["targets"]["items"][0]["name"], "TestAtrist") self.soft_assert_equal(data["projects"][1]["targets"]["items"][0]["image"]["url"], "http://test.com") self.soft_assert_equal(data["projects"][1]["targets"]["items"][0]["image"]["width"], 200) self.soft_assert_equal(data["projects"][1]["targets"]["items"][0]["image"]["height"], 250) self.soft_assert_equal(data["projects"][1]["targets"]["items"][1]["name"], "Adele") self.soft_assert_equal(data["projects"][1]["targets"]["items"][1]["image"]["url"], "http://test.com/1") self.soft_assert_equal(data["projects"][1]["targets"]["items"][1]["image"]["width"], 200) self.soft_assert_equal(data["projects"][1]["targets"]["items"][1]["image"]["height"], 250) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[101, 100, 105, 107, 108, 109, 110])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_search_campaigns_for_admin(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={"query": "test_campaign"} ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["artists"]), 5) self.soft_assert_equal(len(data["projects"]), 0) self.soft_assert_equal(len(data["campaigns"]), 6) self.soft_assert_equal(data["campaigns"][0]["id"], 101) self.soft_assert_equal(data["campaigns"][1]["id"], 100) self.soft_assert_equal(data["campaigns"][2]["id"], 105) self.soft_assert_equal(data["campaigns"][3]["id"], 107) self.soft_assert_equal(data["campaigns"][4]["id"], 109) self.soft_assert_equal(data["campaigns"][5]["id"], 110) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[101, 100, 105, 107, 108, 109, 110])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_search_campaigns_for_regular_user(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={"query": "test_campaign"} ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["artists"]), 5) self.soft_assert_equal(len(data["projects"]), 0) self.soft_assert_equal(len(data["campaigns"]), 4) self.soft_assert_equal(data["campaigns"][0]["id"], 101) self.soft_assert_equal(data["campaigns"][0]["startDate"], "2007-02-02") self.soft_assert_equal(data["campaigns"][0]["endDate"], "2008-10-10") self.soft_assert_equal(data["campaigns"][0]["name"], "test_campaign_2") self.assertEqual(len(data["campaigns"][0]["platforms"]), 1) self.assertEqual(data["campaigns"][0]["platforms"][0], "Apple TV") first_campaign_project = data["campaigns"][0]["project"] self.soft_assert_equal(first_campaign_project["id"], 500) self.soft_assert_equal(first_campaign_project["name"], "test_project_1") self.soft_assert_equal(first_campaign_project["targets"]["type"], "Artist") self.soft_assert_equal(len(first_campaign_project["targets"]["items"]), 2) self.soft_assert_equal(first_campaign_project["targets"]["items"][0]["name"], "TestAtrist") self.soft_assert_equal(first_campaign_project["targets"]["items"][0]["image"]["url"], "http://test.com") self.soft_assert_equal(first_campaign_project["targets"]["items"][0]["image"]["width"], 200) self.soft_assert_equal(first_campaign_project["targets"]["items"][0]["image"]["height"], 250) self.soft_assert_equal(first_campaign_project["targets"]["items"][1]["name"], "Adele") self.soft_assert_equal(first_campaign_project["targets"]["items"][1]["image"]["url"], "http://test.com/1") self.soft_assert_equal(first_campaign_project["targets"]["items"][1]["image"]["width"], 200) self.soft_assert_equal(first_campaign_project["targets"]["items"][1]["image"]["height"], 250) self.soft_assert_equal(data["campaigns"][1]["id"], 100) self.soft_assert_equal(data["campaigns"][1]["startDate"], "2007-02-02") self.soft_assert_equal(data["campaigns"][1]["endDate"], "2008-10-10") self.soft_assert_equal(data["campaigns"][1]["name"], "test_campaign_1") self.assertEqual(len(data["campaigns"][1]["platforms"]), 2) self.assertEqual(sorted(data["campaigns"][1]["platforms"]), sorted(["Apple TV", "Sling TV"])) second_campaign_project = data["campaigns"][1]["project"] self.soft_assert_equal(second_campaign_project["id"], 500) self.soft_assert_equal(second_campaign_project["name"], "test_project_1") self.soft_assert_equal(second_campaign_project["targets"]["type"], "Artist") self.soft_assert_equal(len(second_campaign_project["targets"]["items"]), 2) self.soft_assert_equal(second_campaign_project["targets"]["items"][0]["name"], "TestAtrist") self.soft_assert_equal(second_campaign_project["targets"]["items"][0]["image"]["url"], "http://test.com") self.soft_assert_equal(second_campaign_project["targets"]["items"][0]["image"]["width"], 200) self.soft_assert_equal(second_campaign_project["targets"]["items"][0]["image"]["height"], 250) self.soft_assert_equal(second_campaign_project["targets"]["items"][1]["name"], "Adele") self.soft_assert_equal(second_campaign_project["targets"]["items"][1]["image"]["url"], "http://test.com/1") self.soft_assert_equal(second_campaign_project["targets"]["items"][1]["image"]["width"], 200) self.soft_assert_equal(second_campaign_project["targets"]["items"][1]["image"]["height"], 250) self.soft_assert_equal(data["campaigns"][2]["id"], 105) self.soft_assert_equal(data["campaigns"][2]["startDate"], "2007-02-02") self.soft_assert_equal(data["campaigns"][2]["name"], "test_deleted_campaign_6") self.soft_assert_equal(data["campaigns"][2]["project"], None) self.soft_assert_equal(data["campaigns"][3]["id"], 107) self.soft_assert_equal(data["campaigns"][3]["startDate"], "2008-02-02") self.soft_assert_equal(data["campaigns"][3]["name"], "test_deleted_campaign_8") self.soft_assert_equal(data["campaigns"][3]["project"], None) self.soft_assert_equal(data["artists"][0]["projectsCount"], 3) self.soft_assert_equal(data["artists"][1]["projectsCount"], 1) self.soft_assert_equal(data["artists"][2]["projectsCount"], 0) self.soft_assert_equal(data["artists"][3]["projectsCount"], 0) self.soft_assert_equal(data["artists"][4]["projectsCount"], 0) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[101, 100])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_raise) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_raise_exception_in_artist_service(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={"query": "test_campaign"} ) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(data["artists"], []) @patch.object(Campaign, "search", MagicMock(return_value=[])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_empty_search(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={"query": "blabla"} ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["projects"]), 0) self.soft_assert_equal(len(data["campaigns"]), 0) self.assert_all() @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_search_without_query(self): response = self.execute_get("/global-search", headers=self.headers) self.assertEqual(400, response.status_code) @patch.object(Campaign, "search", MagicMock(return_value=[])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_only_include_artists(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={ "query": "artists_query", "include_artists": True, "include_campaigns": False, "include_projects": False, } ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["artists"]), 5) self.soft_assert_equal(len(data["projects"]), 0) self.soft_assert_equal(len(data["campaigns"]), 0) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[101, 100, 105, 107])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_only_include_campaigns(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={ "query": "test_campaign", "include_artists": False, "include_campaigns": True, "include_projects": False, } ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["campaigns"]), 4) self.soft_assert_equal(len(data["artists"]), 0) self.soft_assert_equal(len(data["projects"]), 0) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[])) @patch.object(Project, "search", MagicMock(return_value=[500, 502])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_only_include_projects(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={ "query": "test_project", "include_artists": False, "include_campaigns": False, "include_projects": True, } ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["projects"]), 2) self.soft_assert_equal(len(data["campaigns"]), 0) self.soft_assert_equal(len(data["artists"]), 0) self.assert_all() @patch.object(Campaign, "search", MagicMock(return_value=[112])) @patch.object(Project, "search", MagicMock(return_value=[])) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) @patch("external_api.base.clients.delphi_client.DelphiClient.search_for_artists", new=mocked_search_for_artists) @patch( "external_api.base.clients.delphi_client.DelphiClient.get_artists_search_count", new=mocked_search_count_for_artists ) def test_search_digital_approved_campaign_without_end_date(self): response = self.execute_get( "/global-search", headers=self.headers, query_string={ "query": "test_campaign_112", "include_artists": False, "include_campaigns": True, "include_projects": False, } ) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data["projects"]), 0) self.soft_assert_equal(len(data["campaigns"]), 1) self.soft_assert_equal(len(data["artists"]), 0) self.soft_assert_equal(data["campaigns"][0]['endDate'], "2020-10-11") self.assert_all()