from unittest.mock import patch import json import pytest from tests.test_utils import FixtureLoader from models import models from tests import BaseTestCase, mock from datetime import datetime, timedelta from tests.campaigns.fixtures.campaigns_fixture import fixture SELECT_WIDGET = {"id": 1, "name": "select"} TOGGLE_WIDGET = {"id": 4, "name": "toggle"} MULTI_SELECT = {"id": 2, "name": "multi-select"} GROUP_SELECT = {"id": 3, "name": "group-select"} DATETIME_FORMAT = "%Y-%m-%d %H-%M" @pytest.mark.skip(reason="Test skipped because Phase logic changed") @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestBulkCampaigns(BaseTestCase): bulk_url = "/projects/{}/campaigns-bulk" url = "projects/500/phases/560/campaigns" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) @staticmethod def return_campaign_dict(start_date, end_date, lower_age: int = 5, upperAge: int = 25): data = { "name": "test111", "territories": [2], "startDate": datetime.strftime(start_date, "%Y-%m-%d"), "endDate": datetime.strftime(end_date, "%Y-%m-%d"), "budgetSpend": 1999, "plannedBudget": 2000, "objective": 2, "genders": [2], "provider": 2, "destinationLinks": ["https://www.facebook.com/"], "audienceLowerAge": lower_age, "audienceHigherAge": upperAge, "notes": "Some notes", "linkfireLinks": [{"linkId": "afe36ac9-121b-4f23-a2f5-02417491828d", "linkUrl": "lnk.to/blink182_NACS"}], "platforms": [26, 54], "gratis": False, } return data def test_create_bulk_campaigns_success(self): now = datetime.now() campaigns = [] campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=50), end_date=now + timedelta(days=50)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=10), end_date=now + timedelta(days=20)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=20), end_date=now + timedelta(days=20)) ) response = self.execute_post(self.bulk_url.format(500), headers=self.headers, data=json.dumps({"campaigns": campaigns}) ) items = response.json self.assertEqual(201, response.status_code) self.assertIs(list, type(items)) self.assertEqual(3, len(items)) def test_bulk_delete_manual_campaigns(self): now = datetime.now() campaigns = [] campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=50), end_date=now + timedelta(days=50)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=10), end_date=now + timedelta(days=20)) ) response = self.execute_post(self.bulk_url.format(500), headers=self.headers, data=json.dumps({"campaigns": campaigns}) ) new_campaign_ids = [int(c["id"]) for c in response.json] new_campaign_ids.append(200) response = self.execute_delete(self.bulk_url.format(500), headers=self.headers, query_string={"campaignIds": new_campaign_ids}) self.soft_assert_equal(204, response.status_code) response = self.execute_get(self.url, headers=self.headers) items = response.json self.soft_assert_equal([], items) self.assert_all() def test_bulk_create_campaigns_with_start_date_greater_end_date_should_not_saved_any(self): response = self.execute_get(self.url, headers=self.headers) campaigns_count_before = len(response.json) now = datetime.now() campaigns = [] campaigns.append(self.return_campaign_dict( start_date=now + timedelta(days=50), # invalid startDate > endDate end_date=now - timedelta(days=50)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=10), end_date=now + timedelta(days=20)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=20), end_date=now + timedelta(days=20)) ) response = self.execute_post(self.bulk_url.format(500), headers=self.headers, data=json.dumps({"campaigns": campaigns}) ) self.soft_assert_equal(400, response.status_code) response = self.execute_get(self.url, headers=self.headers) campaigns_count_after = len(response.json) self.soft_assert_equal(campaigns_count_before, campaigns_count_after) self.assert_all() def test_bulk_doesnt_delete_dsp_campaigns_return_403(self): response = self.execute_delete(self.bulk_url.format(500), headers=self.headers, query_string={"campaignIds": [900]}) self.assertEqual(403, response.status_code) def test_bulk_create_with_error_in_campaign_should_not_create_any_and_error_status_code(self): now = datetime.now() campaigns = [] campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=50), end_date=now + timedelta(days=50)) ) campaigns.append(self.return_campaign_dict( start_date=now - timedelta(days=10), end_date=now + timedelta(days=20)) ) campaigns[len(campaigns) - 1]["platforms"] = [444] response = self.execute_post(self.bulk_url.format(500), headers=self.headers, data=json.dumps({"campaigns": campaigns}) ) self.soft_assert_equal(404, response.status_code) response = self.execute_get(self.url, headers=self.headers) items = response.json self.soft_assert_equal(1, len(items)) self.assert_all()