from unittest.mock import patch from db import db from tests import BaseTestCase, mock_for_user from tests.test_utils import FixtureLoader from models import models, RecentSearchItem from tests.global_search.fixtures.recent_search_fixture import fixture 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") class TestRecentSearch(BaseTestCase): def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_recent_searches(self): response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 7) self.soft_assert_equal(data[0]["id"], 101) self.soft_assert_equal(data[0]["entity"]["id"], 500) self.soft_assert_equal(data[0]["entity"]["name"], "test_project_1") self.soft_assert_equal( data[0]["entity"]["targets"]["items"][0], { "id": "GRAS_10", "image": {"height": 250, "url": "http://test.com", "width": 200}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestAtrist", "type": "Primary", }, ) self.soft_assert_equal( data[0]["entity"]["targets"]["items"][1], { "id": "GRAS_20", "image": {"height": 250, "url": "http://test.com/1", "width": 200}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "Adele", "type": "Primary", }, ) self.soft_assert_equal(data[0]["type"], 1) self.soft_assert_equal(data[1]["id"], 102) self.soft_assert_equal(data[1]["entity"]["id"], "GRAS_10") self.soft_assert_equal(data[1]["entity"]["image"], {"height": 250, "url": "http://test.com", "width": 200}) self.soft_assert_equal(data[1]["entity"]["isSony"], True) self.soft_assert_equal(data[1]["entity"]["name"], "TestAtrist") self.soft_assert_equal(data[1]["type"], 0) self.soft_assert_equal(data[2]["id"], 100) self.soft_assert_equal(data[2]["entity"]["id"], 100) self.soft_assert_equal(data[2]["entity"]["name"], "test_campaign_1") self.soft_assert_equal(data[2]["entity"]["project"]["id"], 500) self.soft_assert_equal(data[2]["entity"]["project"]["name"], "test_project_1") self.soft_assert_equal( data[2]["entity"]["project"]["targets"]["items"][0], { "id": "GRAS_10", "image": {"height": 250, "url": "http://test.com", "width": 200}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "TestAtrist", "type": "Primary", }, ) self.soft_assert_equal( data[2]["entity"]["project"]["targets"]["items"][1], { "id": "GRAS_20", "image": {"height": 250, "url": "http://test.com/1", "width": 200}, "isSony": True, "isUnknown": False, "isPRS": False, "name": "Adele", "type": "Primary", }, ) self.soft_assert_equal(data[2]["type"], 2) self.soft_assert_equal(data[3]["id"], 107) self.soft_assert_equal(data[3]["entity"]["id"], 504) self.soft_assert_equal(data[4]["id"], 108) self.soft_assert_equal(data[4]["entity"]["id"], 503) self.soft_assert_equal(data[5]["id"], 109) self.soft_assert_equal(data[5]["entity"]["id"], 105) self.soft_assert_equal(data[6]["id"], 110) self.soft_assert_equal(data[6]["entity"]["id"], 106) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_campaign_with_fromSearch_param_should_add_to_recent_items(self): self.execute_get( "/projects/502/campaigns/55e87545-a3b3-4bd1-9357-a5373df46270", headers=self.headers, query_string={"fromSearch": 1} ) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 7) self.soft_assert_equal(data[0]["id"], 1) self.soft_assert_equal(data[0]["entity"]["id"], 104) self.soft_assert_equal(data[0]["entity"]["name"], "test_campaign_4") self.soft_assert_equal(data[0]["entity"]["project"]["id"], 502) self.soft_assert_equal(data[0]["entity"]["project"]["name"], "test_project_3") self.soft_assert_equal( data[0]["entity"]["project"]["targets"]["items"][0], { "id": "01", "images": [ {"height": 250, "url": "http://test.com/2", "width": 300}, {"height": 250, "url": "http://test.com/3", "width": 400}, ], "name": "TestAtrist", "ownerName": "Owner1", "provider": "spotify", }, ) self.soft_assert_equal(data[0]["type"], 2) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_project_with_fromSearch_param_should_add_to_recent_items(self): self.execute_get("/projects/502", headers=self.headers, query_string={"fromSearch": 1}) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 7) self.soft_assert_equal(data[0]["id"], 2) self.soft_assert_equal(data[0]["entity"]["id"], 502) self.soft_assert_equal(data[0]["entity"]["name"], "test_project_3") self.soft_assert_equal( data[0]["entity"]["targets"]["items"][0], { "id": "01", "images": [ {"height": 250, "url": "http://test.com/2", "width": 300}, {"height": 250, "url": "http://test.com/3", "width": 400}, ], "name": "TestAtrist", "ownerName": "Owner1", "provider": "spotify", }, ) self.soft_assert_equal(data[0]["type"], 1) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_campaign_without_fromSearch_param_should_not_add_to_recent_items(self): self.execute_get( "/projects/502/campaigns/55e87545-a3b3-4bd1-9357-a5373df46270", headers=self.headers ) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) self.assertEqual(len(response.json), 7) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_project_without_fromSearch_param_should_not_add_to_recent_items(self): self.execute_get("/projects/502", headers=self.headers) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) self.assertEqual(len(response.json), 7) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_campaign_with_fromSearch_param_already_searched_should_update_recent_item(self): self.execute_get( "/projects/500/campaigns/34ed4c22-e1f9-4184-a06d-f04cbdb97455", headers=self.headers, query_string={"fromSearch": 1} ) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 7) self.soft_assert_equal(data[0]["id"], 100) self.soft_assert_equal(data[1]["id"], 101) self.soft_assert_equal(data[2]["id"], 102) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_searches_count_should_remain_20(self): self.execute_get("/projects/503", headers=self.headers, query_string={"fromSearch": 1}) response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) item = db.session.query(RecentSearchItem).filter(RecentSearchItem.id == 103).one_or_none() self.assertIsNone(item) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3.jwt_decode) def test_search_campaigns_and_projects_should_return_despite_user_having_no_access(self): response = self.execute_get("/global-search/recent", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 2) self.soft_assert_equal(data[0]["entity"]["id"], 503) self.soft_assert_equal(data[0]["entity"]["name"], "test1_project_3") self.soft_assert_equal(data[1]["entity"]["id"], 108) self.soft_assert_equal(data[1]["entity"]["name"], "test_campaign_8") self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_fetch_projects_with_limit_param(self): response = self.execute_get("/global-search/recent?limit=10", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 10) response = self.execute_get("/global-search/recent?limit=12", headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data), 12)