import json from datetime import datetime, timezone from unittest.mock import patch from db import db from tests.test_utils import FixtureLoader from models import models, Project from tests import BaseTestCase, mock, get_file_path, mock_for_user from tests.projects.fixtures.projects_last_update_at_fixture import fixture user2 = mock_for_user(2, "dev-marketing-user-2@example.com", "sme-dna|3po0091d6c91ty670fe6ftryf") user6 = mock_for_user(6, "dev-marketing-user-6@example.com", "sme-dna|phn0091d6cuhjp30fe6opttml", is_admin=True) user1Mock = mock_for_user(1, "dev-marketing-user-1@example.com", "sme-dna|5cf0091d6c91d310fe6fcdc6") @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestProjectLastUpdateDateEvents(BaseTestCase): url = "/projects" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) def __get_project_last_update_at(self, project_id): return (db.session.query(Project.updated_at).filter(Project.id == project_id).one())[0] def test_change_project_summary(self): url = '/projects/500' data = { "targets": { "items": [ {"id": "GRAS_2030", "image": None, "isSony": True, "name": "Ricardo"}, {"id": "GRAS_2031", "image": None, "isSony": True, "name": "Milos"}, ], "type": "Artist", }, "name": "project_name", "endDate": "2023-09-24", "startDate": "2022-02-24", } response = self.execute_put(url, data=json.dumps(data), headers=self.headers) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(500) self.assertEqual(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 10) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_change_project_team(self): """Updating UserProjects should update updated_at""" url = "/projects/505/team" data = {"added": [{"userId": 42, "roleId": 1, "categoryIds": [1]}]} response = self.execute_post(url, data=json.dumps(data), headers=self.headers) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(505) self.assertEqual(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 10) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_media_plan_change(self): # create media plan response = self.execute_post( "projects/500/media-plans", data=json.dumps({"name": "Untitled25"}), headers=self.headers ) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(500) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 10) # update media plan name data = { "name": "test_media_plan_1" } response = self.execute_put("projects/505/media-plans/47", data=json.dumps(data), headers=self.headers) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(505) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 10) # update release name and type data = { "name": "New_name", "type": 3 } response = self.execute_patch( "/projects/502/media-plans/44/release-details", data=json.dumps(data), headers=self.headers ) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(502) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 5) # delete media plan response = self.execute_delete("/projects/500/media-plans/42", headers=self.headers) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(500) self.soft_assert_equal(204, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 5) self.assert_all() def test_phase_change(self): # any action data = { "name": "New phase", "order": 1, } response = self.execute_post("/projects/500/media-plans/42/phases", data=json.dumps(data), headers=self.headers) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(500) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 10) response = self.execute_patch( "/projects/505/media-plans/47/phases/666", data=json.dumps({"name": "new"}), headers=self.headers ) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(505) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 5) response = self.execute_delete( "/projects/500/media-plans/42/phases/452", headers=self.headers ) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(500) self.soft_assert_equal(204, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 5) self.assert_all() def test_campaign_change(self): # any action with campaign that related to project upd update_at url = "/projects/502/media-plans/44/campaigns/bulk-action" data = { "update": [ { "campaignUuid": "20618d97-5190-4589-8fed-9e109e5ac5b5", "columns": { "workflowStatus": "Booked", } } ], } response = self.execute_post(url, data=json.dumps(data), headers=self.headers) self.soft_assert_equal(200, response.status_code) now = datetime.now(timezone.utc) update_at = self.__get_project_last_update_at(502) self.soft_assert_equal(200, response.status_code) self.soft_assert(self.assertTrue, (now - update_at).seconds < 5) self.assert_all()