import json from unittest.mock import patch from db import db from tests import BaseTestCase, mock, FixtureLoader from tests.media_plan.fixtures.media_plan_campaign_bulk_action_fixture import fixture from models import models, MediaPlanPhase @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestMediaPlanDetails(BaseTestCase): url = "projects/{}/media-plans/{}" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_project_media_plan_unmatched_project(self): response = self.execute_get(self.url.format(502, 42), headers=self.headers) self.assertEqual(404, response.status_code) def test_get_media_plan(self): response = self.execute_get(self.url.format(500, 42), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json phases = data.get("phases") self.soft_assert_equal(len(phases), 4) self.assert_all() def test_get_media_plan_should_return_403(self): response = self.execute_get(self.url.format(501, 111), headers=self.headers) self.assertEqual(403, response.status_code) data = response.json self.assertEqual("project_access_restricted", data['code']) self.assertEqual("test_project_2", data['detail']['projectName']) self.assertEqual("user-2@example.com", data['detail']['projectEditors'][0]['email']) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestMediaPlan(BaseTestCase): url = "projects/{}/media-plans" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def test_get_project_media_plans(self): response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data), 1) self.soft_assert_equal(data[0]["id"], 42) self.soft_assert_equal(data[0]["name"], "media plan") self.soft_assert_equal(data[0]["order"], 0) self.assert_all() def test_create_new_empty_media_plan(self): data = {} response = self.execute_post(self.url.format(500), data=json.dumps(data), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json new_media_plan_id = data["id"] self.soft_assert_equal(data["name"], "Untitled") self.soft_assert_equal(data["order"], 1) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data), 2) self.soft_assert_equal(data[0]["id"], 42) self.soft_assert_equal(data[0]["name"], "media plan") self.soft_assert_equal(data[0]["order"], 0) self.soft_assert_equal(data[1]["id"], new_media_plan_id) self.soft_assert_equal(data[1]["name"], "Untitled") self.soft_assert_equal(data[1]["order"], 1) response = self.execute_get("projects/500/media-plans/{}/phases".format(new_media_plan_id), headers=self.headers) self.assertEqual(200, response.status_code) resp = response.json self.soft_assert_equal(len(resp), 1) new_phases_id = resp[0]["id"] self.soft_assert_equal(resp[0]["name"], "Phase") self.soft_assert_equal(resp[0]["order"], 0) response = self.execute_get( "projects/500/media-plans/{}/phases/{}".format(new_media_plan_id, new_phases_id), headers=self.headers ) self.assertEqual(200, response.status_code) data = response.json self.assertEqual(len(data.get("campaigns")), 1) campaign = data.get("campaigns")[0].get("columns") self.assertEqual(campaign['workflowStatus']['status'], 'Draft') self.assertEqual(campaign['name'], None) self.assertEqual(campaign['namingConvention'], None) self.assertEqual(campaign['orderInPhase'], 0) self.assert_all() # def test_cant_create_more_than_max_media_plans(self): # project_id = 666 # response = self.execute_post( # self.url.format(project_id), # data=json.dumps({"name": "Untitled1"}), # headers=self.headers # ) # self.assertEqual(200, response.status_code) # response = self.execute_post( # self.url.format(project_id), # data=json.dumps({"name": "Untitled22"}), # headers=self.headers # ) # self.assertEqual(200, response.status_code) # response = self.execute_post( # self.url.format(project_id), # data=json.dumps({"name": "Untitled3"}), headers=self.headers) # self.assertEqual(200, response.status_code) # # response = self.execute_get(f"/projects/{project_id}/media-plans", headers=self.headers) # self.assertEqual(200, response.status_code) # media_plans = response.json # self.assertEqual(len(media_plans), 5) # # response = self.execute_post( # self.url.format(project_id), # data=json.dumps({"name": "6 media plan"}), # headers=self.headers # ) # self.assertEqual(403, response.status_code) def test_cant_create_media_plan_with_the_same_name(self): project_id = 666 response = self.execute_post( self.url.format(project_id), data=json.dumps({"name": "Untitled1"}), headers=self.headers ) self.assertEqual(200, response.status_code) response = self.execute_post( self.url.format(project_id), data=json.dumps({"name": "Untitled1"}), headers=self.headers ) self.assertEqual(403, response.status_code) def test_create_new_media_plan_with_name(self): params = {"name": "Media Plan"} response = self.execute_post(self.url.format(500), data=json.dumps(params), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json new_media_plan_id = data["id"] self.soft_assert_equal(data["name"], data['name']) self.soft_assert_equal(data["order"], 1) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json self.soft_assert_equal(len(data), 2) self.soft_assert_equal(data[0]["id"], 42) self.soft_assert_equal(data[0]["name"], "media plan") self.soft_assert_equal(data[0]["order"], 0) self.soft_assert_equal(data[1]["id"], new_media_plan_id) self.soft_assert_equal(data[1]["name"], params['name']) self.soft_assert_equal(data[1]["order"], 1) self.assert_all() def test_cant_delete_last_media_plan(self): url = "/projects/500/media-plans/42" response = self.execute_delete(url, headers=self.headers) self.assertEqual(400, response.status_code) def test_deletion_media_plan_should_delete_phases_and_campaigns_and_reorder(self): project_id = 666 media_plan_id = 66 response = self.execute_get(f"/projects/{project_id}/media-plans", headers=self.headers) self.assertEqual(200, response.status_code) media_plans = response.json response = self.execute_delete(f"/projects/{project_id}/media-plans/{media_plan_id}", headers=self.headers) self.assertEqual(204, response.status_code) response = self.execute_get(f"/projects/{project_id}/media-plans", headers=self.headers) self.assertEqual(200, response.status_code) self.soft_assert_equal(len(media_plans) - 1, len(response.json)) phases = db.session.query(MediaPlanPhase).filter(MediaPlanPhase.media_plan_id == media_plan_id).one_or_none() self.soft_assert(self.assertIsNone, phases) self.assert_all()