from unittest.mock import patch from models import models from tests.test_utils import FixtureLoader from tests import BaseTestCase, mock_for_user from tests.purchase_orders.fixtures.purchase_orders_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") class TestPurchaseOrders(BaseTestCase): url = "/projects" 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_project_purchase_orders(self): response = self.execute_get("/projects/500/purchase-orders", headers=self.headers) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(2, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 3654) self.soft_assert(self.assertEqual, items[0]["name"], "MC UK Interview | PO 1125247000") self.soft_assert(self.assertEqual, items[0]["budget"], 5850.00) self.soft_assert(self.assertEqual, items[0]["allocation"], 5750.00) self.soft_assert(self.assertEqual, items[0]["status"], "Paid") self.soft_assert(self.assertEqual, items[0]["budgetGroup"], {"id": 2, "name": "Product Marketing"}) self.soft_assert(self.assertEqual, items[0]["budgetCategory"], {"id": 6, "name": "Promo Tours / Press"}) self.soft_assert(self.assertEqual, items[0]["provider"], {"id": 1, "name": "Sony Music"}) self.soft_assert(self.assertEqual, items[0]["createdDate"], "2019-12-06") self.soft_assert(self.assertEqual, items[0]["lastModifiedDate"], "2020-06-30") self.soft_assert(self.assertEqual, items[0]["linkedCampaign"], None) self.soft_assert(self.assertEqual, items[0]["notes"], "MC interview shoot on 12/2 in LA") self.soft_assert(self.assertEqual, items[0]["isBlanket"], True) self.soft_assert(self.assertEqual, items[1]["id"], 1876) self.soft_assert(self.assertEqual, items[1]["isBlanket"], False) self.soft_assert(self.assertEqual, total, 2) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_order_blankets_details(self): response = self.execute_get("/projects/500/purchase-orders/3654/blanket-items", headers=self.headers) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(3, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 3656) self.soft_assert(self.assertEqual, items[0]["name"], "MARVIN DOYLE BORDEN | PO 1125247002") self.soft_assert(self.assertEqual, items[0]["budget"], 3000.00) self.soft_assert(self.assertEqual, items[0]["allocation"], 3000.00) self.soft_assert(self.assertEqual, items[0]["status"], "Paid") self.soft_assert(self.assertEqual, items[0]["budgetGroup"], {"id": 2, "name": "Product Marketing"}) self.soft_assert(self.assertEqual, items[0]["budgetCategory"], {"id": 6, "name": "Promo Tours / Press"}) self.soft_assert(self.assertEqual, items[0]["provider"], {"id": 3, "name": "7Stars"}) self.soft_assert(self.assertEqual, items[0]["createdDate"], "2019-12-09") self.soft_assert(self.assertEqual, items[0]["lastModifiedDate"], "2019-12-13") self.soft_assert(self.assertEqual, items[0]["linkedCampaign"], None) self.soft_assert(self.assertEqual, items[0]["notes"], "MC interview shoot on 12/2 in LA") self.soft_assert(self.assertEqual, items[0]["isBlanket"], False) self.soft_assert(self.assertEqual, items[1]["id"], 3657) self.soft_assert(self.assertEqual, items[1]["name"], "PRS CONCUR T&E | PO 1125247003") self.soft_assert(self.assertEqual, items[1]["budget"], 850.0) self.soft_assert(self.assertEqual, items[1]["allocation"], 850.0) self.soft_assert(self.assertEqual, items[1]["status"], "Payable") self.soft_assert(self.assertEqual, items[1]["budgetGroup"], {"id": 2, "name": "Product Marketing"}) self.soft_assert(self.assertEqual, items[1]["budgetCategory"], {"id": 6, "name": "Promo Tours / Press"}) self.soft_assert(self.assertEqual, items[1]["provider"], {"id": 4, "name": "Wavo"}) self.soft_assert(self.assertEqual, items[1]["createdDate"], "2019-12-16") self.soft_assert(self.assertEqual, items[1]["lastModifiedDate"], "2020-03-20") self.soft_assert(self.assertEqual, items[1]["linkedCampaign"], None) self.soft_assert(self.assertEqual, items[1]["notes"], "MC interview shoot on 12/2 in LA") self.soft_assert(self.assertEqual, items[1]["isBlanket"], False) self.soft_assert(self.assertEqual, items[2]["id"], 3655) self.soft_assert(self.assertEqual, items[2]["name"], "WILLIAM D BOATMAN | PO 1125247001") self.soft_assert(self.assertEqual, items[2]["budget"], 2000.0) self.soft_assert(self.assertEqual, items[2]["allocation"], 2000.0) self.soft_assert(self.assertEqual, items[2]["status"], "Paid") self.soft_assert(self.assertEqual, items[2]["budgetGroup"], {"id": 2, "name": "Product Marketing"}) self.soft_assert(self.assertEqual, items[2]["budgetCategory"], {"id": 6, "name": "Promo Tours / Press"}) self.soft_assert(self.assertEqual, items[2]["provider"], {"id": 2, "name": "Gupta Media"}) self.soft_assert(self.assertEqual, items[2]["createdDate"], "2019-12-09") self.soft_assert(self.assertEqual, items[2]["lastModifiedDate"], "2019-12-13") self.soft_assert(self.assertEqual, items[2]["linkedCampaign"], None) self.soft_assert(self.assertEqual, items[2]["notes"], "MC interview shoot on 12/2 in LA") self.soft_assert(self.assertEqual, items[2]["isBlanket"], False) self.soft_assert(self.assertEqual, total, 3) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_order_blankets_details_with_provider_filters(self): response = self.execute_get( "/projects/500/purchase-orders/3654/blanket-items", query_string={"provider": 3}, headers=self.headers ) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 3656) self.soft_assert(self.assertEqual, total, 1) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_order_blankets_details_with_limit_offset(self): response = self.execute_get( "/projects/500/purchase-orders/3654/blanket-items", query_string={"limit": 1, "offset": 2}, headers=self.headers, ) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 3655) self.soft_assert(self.assertEqual, total, 3) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_order_blankets_details_with_status_filter(self): response = self.execute_get( "/projects/500/purchase-orders/3654/blanket-items", query_string={"status": 8}, headers=self.headers ) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 3657) self.soft_assert(self.assertEqual, total, 1) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_get_project_purchase_orders_with_failed_status_filter(self): response = self.execute_get("/projects/501/purchase-orders", query_string={"status": 0}, headers=self.headers) items = response.json["items"] total = response.json["total"] self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(1, len(items)) self.soft_assert(self.assertEqual, items[0]["id"], 1794) self.soft_assert(self.assertEqual, total, 1) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_order_details(self): response = self.execute_get("/projects/500/purchase-orders/3655", headers=self.headers) po = response.json self.assertEqual(200, response.status_code) self.soft_assert(self.assertEqual, po["id"], 3655) self.soft_assert(self.assertEqual, po["name"], "WILLIAM D BOATMAN | PO 1125247001") self.soft_assert(self.assertEqual, po["budget"], 2000.0) self.soft_assert(self.assertEqual, po["allocation"], 2000.0) self.soft_assert(self.assertEqual, po["status"], "Paid") self.soft_assert(self.assertEqual, po["budgetGroup"], {"id": 2, "name": "Product Marketing"}) self.soft_assert(self.assertEqual, po["budgetCategory"], {"id": 6, "name": "Promo Tours / Press"}) self.soft_assert(self.assertEqual, po["provider"], {"id": 2, "name": "Gupta Media"}) self.soft_assert(self.assertEqual, po["createdDate"], "2019-12-09") self.soft_assert(self.assertEqual, po["lastModifiedDate"], "2019-12-13") self.soft_assert(self.assertEqual, po["linkedCampaign"], None) self.soft_assert(self.assertEqual, po["notes"], "MC interview shoot on 12/2 in LA") self.soft_assert(self.assertEqual, po["isBlanket"], False) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_orders_providers(self): response = self.execute_get("/projects/500/purchase-orders/providers", headers=self.headers) items = response.json self.assertEqual(200, response.status_code) self.assertIs(list, type(items)) self.assertEqual(4, len(items)) self.soft_assert(self.assertEqual, items[0], {"id": 3, "isPRSVendor": False, "name": "7Stars"}) self.soft_assert(self.assertEqual, items[1], {"id": 2, "isPRSVendor": False, "name": "Gupta Media"}) self.soft_assert(self.assertEqual, items[2], {"id": 1, "isPRSVendor": False, "name": "Sony Music"}) self.soft_assert(self.assertEqual, items[3], {"id": 4, "isPRSVendor": False, "name": "Wavo"}) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_orders_no_permission_should_raise_403(self): response = self.execute_get("/projects/501/purchase-orders/3654/blanket-items", headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_orders_deleted_project_should_raise_403(self): response = self.execute_get("/projects/502/purchase-orders/3654/blanket-items", headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1.jwt_decode) def test_get_project_purchase_orders_invalid_id_should_raise_404(self): response = self.execute_get("/projects/500/purchase-orders/111111", headers=self.headers) self.assertEqual(404, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_get_project_purchase_orders_linked_campaign(self): response = self.execute_get("/projects/502/purchase-orders/1875", headers=self.headers) items = response.json self.assertEqual(200, response.status_code) self.soft_assert_equal(items["linkedCampaign"]["id"], 3) self.soft_assert_equal( items["linkedCampaign"]["type"], {"id": 7, "name": "Search Ads", "category": {"id": 1, "name": "Digital"}} ) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2.jwt_decode) def test_get_project_purchase_orders_linked_campaign_with_no_type(self): response = self.execute_get("/projects/502/purchase-orders/1799", headers=self.headers) items = response.json self.assertEqual(200, response.status_code) self.soft_assert_equal(items["linkedCampaign"]["id"], 4) self.soft_assert_equal(items["linkedCampaign"]["type"], None)