import json 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.campaigns.fixtures.campaigns_permissions_fixture import fixture user1Mock = mock_for_user(1, "user-1@example.com", "sme-dna|user-1") user2Mock = mock_for_user(2, "user-2@example.com", "sme-dna|user-2") user3Mock = mock_for_user(3, "user-3@example.com", "sme-dna|user-3") user4Mock = mock_for_user(4, "user-4@example.com", "sme-dna|user-4") user5Mock = mock_for_user(5, "user-5@example.com", "sme-dna|user-5") user6Mock = mock_for_user(6, "user-6@example.com", "sme-dna|user-6") @pytest.mark.skip(reason="Test skipped because Phase logic changed") class TestGetCampaignPermissions(BaseTestCase): url = "/projects/500/campaigns/1" update_campaign_data = { "name": "Campaign 1", "territories": [101], "startDate": "2019-09-12", "endDate": "2019-09-26", "plannedBudget": 122, "objective": 1, "genders": [1], "provider": 2, "audienceLowerAge": 18, "audienceHigherAge": 25, "gratis": False, "platforms": [2], "campaignType": 5, } restricted_campaign_data = { "name": "test_campaign_1", "territories": [100], "startDate": "2007-02-02", "endDate": "2008-10-10", "plannedBudget": 222.00, "budgetSpend": 1000.00, "objective": 1, "genders": [1], "provider": 1, "audienceLowerAge": 0, "audienceHigherAge": 60, "gratis": False, "platforms": [2], "campaignType": 5, } def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_get_campaign_by_owner_200(self): response = self.execute_get(self.url, headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3Mock.jwt_decode) def test_get_campaign_by_user_with_same_label_200(self): response = self.execute_get(self.url, headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2Mock.jwt_decode) @pytest.mark.skip(reason="") def test_get_campaign_by_user_not_in_project_team_with_different_label_403(self): response = self.execute_get(self.url, headers=self.headers) self.assertEqual(403, response.status_code) self.assertEqual("project_access_restricted", response.json["code"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user4Mock.jwt_decode) def test_get_campaign_by_shared_user_with_read_permission_200(self): response = self.execute_get(self.url, headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_campaign_by_owner_204(self): response = self.execute_put(self.url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_not_approved_campaign_should_return_403(self): url = "/projects/500/campaigns/3" response = self.execute_put(url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_external_campaign_no_changes_should_return_200(self): url = "/projects/500/campaigns/4" data = self.restricted_campaign_data response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_external_campaign_no_changes_with_wrong_ordering_should_return_200(self): url = "/projects/500/campaigns/5" data = {**self.restricted_campaign_data, "campaignType": 5} response = self.execute_put(url, data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_restricted_name_should_return_403(self): url = "/projects/500/campaigns/4" self.restricted_campaign_data.update({"name": "New"}) response = self.execute_put(url, data=json.dumps(self.restricted_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_restricted_end_date_should_return_403(self): url = "/projects/500/campaigns/4" self.restricted_campaign_data.update({"endDate": "2020-10-20"}) response = self.execute_put(url, data=json.dumps(self.restricted_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_schedule_for_restricted_end_date_should_return_403(self): url = "/projects/500/campaigns/4/update-schedule" params = {"startDate": "2018-01-10", "endDate": "2018-08-15"} response = self.execute_patch(url, data=json.dumps(params), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_restricted_start_date_should_return_403(self): url = "/projects/500/campaigns/5" self.restricted_campaign_data.update({"startDate": "2007-02-05"}) response = self.execute_put(url, data=json.dumps(self.restricted_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_schedule_for_restricted_start_date_should_return_403(self): url = "/projects/500/campaigns/5/update-schedule" params = {"startDate": "2018-01-10", "endDate": "2018-08-15"} response = self.execute_patch(url, data=json.dumps(params), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_restricted_types_should_return_403(self): url = "/projects/500/campaigns/4" self.restricted_campaign_data.update({"campaignType": 7}) response = self.execute_put(url, data=json.dumps(self.restricted_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_platforms_with_restricted_types_should_return_200(self): url = "/projects/500/campaigns/4" self.restricted_campaign_data.update({"campaignType": 7}) response = self.execute_put(url, data=json.dumps(self.restricted_campaign_data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2Mock.jwt_decode) def test_update_campaign_by_not_project_owner_and_not_shared_edit_permission_403(self): response = self.execute_put(self.url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) self.assertEqual("campaign_edit_restricted", response.json["code"]) self.assertEqual("user-1@example.com", response.json["detail"]["contact_email"]) self.assertEqual("user-1", response.json["detail"]["contact_name"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user6Mock.jwt_decode) def test_update_uncategorized_campaign_by_editor_should_return_200(self): data = {**self.restricted_campaign_data, "campaignType": 21} response = self.execute_put("/projects/500/campaigns/6", data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3Mock.jwt_decode) def test_update_campaign_by_user_with_same_label_403(self): response = self.execute_put(self.url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user4Mock.jwt_decode) def test_update_campaign_by_shared_user_with_read_permission_403(self): response = self.execute_put(self.url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user5Mock.jwt_decode) def test_update_campaign_by_shared_user_with_edit_permission_200(self): response = self.execute_put(self.url, data=json.dumps(self.update_campaign_data), headers=self.headers) self.assertEqual(200, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_delete_campaign_by_owner_204(self): response = self.execute_delete(self.url, data=json.dumps({}), headers=self.headers) self.assertEqual(204, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user3Mock.jwt_decode) def test_delete_campaign_by_user_with_same_label_403(self): url = "/projects/500/campaigns/2" response = self.execute_delete(url, data=json.dumps({}), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user2Mock.jwt_decode) def test_delete_campaign_by_not_owner_403(self): url = "/projects/500/campaigns/2" response = self.execute_delete(url, data=json.dumps({}), headers=self.headers) self.assertEqual(403, response.status_code) self.assertEqual("campaign_delete_restricted", response.json["code"]) self.assertEqual("user-1@example.com", response.json["detail"]["contact_email"]) self.assertEqual("user-1", response.json["detail"]["contact_name"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user4Mock.jwt_decode) def test_delete_campaign_by_shared_user_with_read_permission_403(self): url = "/projects/500/campaigns/2" response = self.execute_delete(url, data=json.dumps({}), headers=self.headers) self.assertEqual(403, response.status_code) self.assertEqual("campaign_delete_restricted", response.json["code"]) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user5Mock.jwt_decode) def test_delete_campaign_by_shared_user_with_edit_permission_204(self): url = "/projects/500/campaigns/2" response = self.execute_delete(url, headers=self.headers) self.assertEqual(204, response.status_code)